[4/5] winedump: Switch the block dumping code to be block-oriented, rather then flag oriented, so it is resilient to order changes.

Francois Gouget fgouget at codeweavers.com
Fri Jan 25 20:13:58 CST 2008


---
 tools/winedump/lnk.c |  124 +++++++++++++++++++++++++++-----------------------
 1 files changed, 67 insertions(+), 57 deletions(-)

diff --git a/tools/winedump/lnk.c b/tools/winedump/lnk.c
index a4ac161..590a9d1 100644
--- a/tools/winedump/lnk.c
+++ b/tools/winedump/lnk.c
@@ -63,6 +63,9 @@ typedef enum {
     SLDF_RESERVED = 0x80000000,
 } SHELL_LINK_DATA_FLAGS;
 
+#define EXP_DARWIN_ID_SIG       0xa0000006
+#define EXP_SZ_ICON_SIG         0xa0000007
+
 typedef struct tagDATABLOCKHEADER
 {
     DWORD cbSize;
@@ -86,13 +89,13 @@ typedef struct _LINK_HEADER
     DWORD   Unknown6;       /* 0x48 */
 } LINK_HEADER, * PLINK_HEADER;
 
-typedef struct tagLINK_ADVERTISEINFO
+typedef struct tagLINK_SZ_BLOCK
 {
     DWORD size;
     DWORD magic;
     CHAR  bufA[MAX_PATH];
     WCHAR bufW[MAX_PATH];
-} LINK_ADVERTISEINFO;
+} LINK_SZ_BLOCK;
 
 typedef struct _LOCATION_INFO
 {
@@ -285,72 +288,64 @@ static int base85_to_guid( const char *str, LPGUID guid )
     return 1;
 }
 
-static int dump_advertise_info(const char *type)
+static int dump_sz_block(const DATABLOCK_HEADER* bhdr, const char* label)
 {
-    const LINK_ADVERTISEINFO *avt;
+    const LINK_SZ_BLOCK *szp = (const LINK_SZ_BLOCK*)bhdr;
+    printf("String block\n");
+    printf("-----------\n\n");
+    printf("magic   = %x\n", szp->magic);
+    printf("%s    = %s\n", label, szp->bufA);
+    printf("\n");
+    return 0;
+}
 
-    avt = fetch_block();
-    if (!avt)
-        return -1;
+static int dump_darwin_id(const DATABLOCK_HEADER* bhdr)
+{
+    const LINK_SZ_BLOCK *szp = (const LINK_SZ_BLOCK*)bhdr;
+    char comp_str[40];
+    const char *feat, *comp, *prod_str, *feat_str;
+    GUID guid;
 
     printf("Advertise Info\n");
     printf("--------------\n\n");
-    printf("magic   = %x\n", avt->magic);
-    printf("%s = %s\n", type, avt->bufA);
-    if (avt->magic == 0xa0000006)
-    {
-        char comp_str[40];
-        const char *feat, *comp, *prod_str, *feat_str;
-        GUID guid;
-
-        if (base85_to_guid(avt->bufA, &guid))
-            prod_str = get_guid_str( &guid );
-        else
-            prod_str = "?";
-
-        comp = &avt->bufA[20];
-        feat = strchr(comp,'>');
-        if (!feat)
-            feat = strchr(comp,'<');
-        if (feat)
-        {
-            memcpy( comp_str, comp, feat - comp );
-            comp_str[feat-comp] = 0;
-        }
-        else
-        {
-            strcpy( comp_str, "?" );
-        }
+    printf("msi string = %s\n", szp->bufA);
 
-        if (feat && feat[0] == '>' && base85_to_guid( &feat[1], &guid ))
-            feat_str = get_guid_str( &guid );
-        else
-            feat_str = "";
+    if (base85_to_guid(szp->bufA, &guid))
+        prod_str = get_guid_str(&guid);
+    else
+        prod_str = "?";
 
-        printf("  product:   %s\n", prod_str);
-        printf("  component: %s\n", comp_str );
-        printf("  feature:   %s\n", feat_str);
+    comp = &szp->bufA[20];
+    feat = strchr(comp, '>');
+    if (!feat)
+        feat = strchr(comp, '<');
+    if (feat)
+    {
+        memcpy(comp_str, comp, feat - comp);
+        comp_str[feat-comp] = 0;
+    }
+    else
+    {
+        strcpy(comp_str, "?");
     }
+
+    if (feat && feat[0] == '>' && base85_to_guid( &feat[1], &guid ))
+        feat_str = get_guid_str( &guid );
+    else
+        feat_str = "";
+
+    printf("  product:   %s\n", prod_str);
+    printf("  component: %s\n", comp_str );
+    printf("  feature:   %s\n", feat_str);
     printf("\n");
 
     return 0;
 }
 
-static int dump_raw_block()
+static int dump_raw_block(const DATABLOCK_HEADER* bhdr)
 {
-    const DATABLOCK_HEADER *bhdr;
     int data_size;
 
-    bhdr = fetch_block();
-    if (!bhdr)
-    {
-        printf("\n");
-        printf("No end block!\n");
-        return 0;
-    }
-    if (!bhdr->cbSize)
-        return 0;
-
     printf("Raw Block\n");
     printf("---------\n\n");
     printf("size    = %d\n", bhdr->cbSize);
@@ -404,6 +399,7 @@ enum FileSig get_kind_lnk(void)
 void lnk_dump(void)
 {
     const LINK_HEADER*        hdr;
+    const DATABLOCK_HEADER*   bhdr;
     DWORD dwFlags;
 
     offset = 0;
@@ -477,9 +473,23 @@ void lnk_dump(void)
         dump_string("Arguments", hdr->dwFlags & SLDF_UNICODE);
     if (hdr->dwFlags & SLDF_HAS_ICONLOCATION)
         dump_string("Icon path", hdr->dwFlags & SLDF_UNICODE);
-    if (hdr->dwFlags & SLDF_HAS_LOGO3ID)
-        dump_advertise_info("product");
-    if (hdr->dwFlags & SLDF_HAS_DARWINID)
-        dump_advertise_info("msi string");
-    while (dump_raw_block());
+
+    bhdr=fetch_block();
+    while (bhdr)
+    {
+        if (!bhdr->cbSize)
+            break;
+        switch (bhdr->dwSignature)
+        {
+        case EXP_SZ_ICON_SIG:
+            dump_sz_block(bhdr, "icon");
+            break;
+        case EXP_DARWIN_ID_SIG:
+            dump_darwin_id(bhdr);
+            break;
+        default:
+            dump_raw_block(bhdr);
+        }
+        bhdr=fetch_block();
+    }
 }
-- 
1.5.3.8




More information about the wine-patches mailing list