X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fdentry.c;h=c07ab5ea5504672c28a4c9645118921ebe58c734;hb=774e09230145ee2d8ba58868573213da84a348eb;hp=b62f53ae6d73e4dc46092e3170061e6a48ca390c;hpb=14c65f15f708c27dc434db1f0d112fad2a0b007c;p=wimlib diff --git a/src/dentry.c b/src/dentry.c index b62f53ae..c07ab5ea 100644 --- a/src/dentry.c +++ b/src/dentry.c @@ -59,7 +59,7 @@ static bool dentry_has_name(const struct dentry *dentry, const char *name, u64 dentry_total_length(const struct dentry *dentry) { u64 length = (dentry->length + 7) & ~7; - for (u16 i = 0 ; i < dentry->num_ads; i++) + for (u16 i = 0; i < dentry->num_ads; i++) length += ads_entry_length(&dentry->ads_entries[i]); return length; } @@ -419,6 +419,7 @@ struct file_attr_flag file_attr_flags[] = { int print_dentry(struct dentry *dentry, void *lookup_table) { const u8 *hash; + struct lookup_table_entry *lte; printf("[DENTRY]\n"); printf("Length = %"PRIu64"\n", dentry->length); @@ -446,12 +447,6 @@ int print_dentry(struct dentry *dentry, void *lookup_table) printf("Last Access Time = %s", asctime(localtime(&access_time))); printf("Last Write Time = %s", asctime(localtime(&mod_time))); - hash = dentry_stream_hash(dentry, 0); - if (hash) { - printf("Hash = 0x"); - print_hash(hash); - putchar('\n'); - } printf("Reparse Tag = 0x%"PRIx32"\n", dentry->reparse_tag); printf("Hard Link Group = 0x%"PRIx64"\n", dentry->hard_link); printf("Number of Alternate Data Streams = %hu\n", dentry->num_ads); @@ -466,7 +461,17 @@ int print_dentry(struct dentry *dentry, void *lookup_table) puts("\""); printf("Short Name Length = %hu\n", dentry->short_name_len); printf("Full Path (UTF-8) = \"%s\"\n", dentry->full_path_utf8); - print_lookup_table_entry(dentry_stream_lte(dentry, 0, lookup_table)); + lte = dentry_stream_lte(dentry, 0, lookup_table); + if (lte) { + print_lookup_table_entry(lte); + } else { + hash = dentry_stream_hash(dentry, 0); + if (hash) { + printf("Hash = 0x"); + print_hash(hash); + putchar('\n'); + } + } for (u16 i = 0; i < dentry->num_ads; i++) { printf("[Alternate Stream Entry %u]\n", i); printf("Name = \"%s\"\n", dentry->ads_entries[i].stream_name_utf8); @@ -1040,19 +1045,15 @@ int read_dentry(const u8 metadata_resource[], u64 metadata_resource_len, * aligned on the next 8-byte boundary. Here's an example of the * aligned data: * - * 01000000400000006c786bbac58ede11b0bb00261870892ab6adb76fe63a3 - * e468fca86530d2effa16c786bbac58ede11b0bb00261870892a0000000000 - * 0000000000000000000000 + * 01000000 40000000 6c786bba c58ede11 b0bb0026 1870892a b6adb76f + * e63a3e46 8fca8653 0d2effa1 6c786bba c58ede11 b0bb0026 1870892a + * 00000000 00000000 00000000 00000000 * * Here's one interpretation of how the data is laid out. * * struct unknown { * u32 field1; (always 0x00000001) * u32 field2; (always 0x40000000) - * u16 field3; - * u32 field4; - * u32 field5; - * u32 field6; * u8 data[48]; (???) * u64 reserved1; (always 0) * u64 reserved2; (always 0)