[3/5] winedump: Dump the raw data when finding an unknown block in an lnk file.

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


---

Some lnk files have additional optional data blocks at the end, some of 
which have an unknown format. So at least dump them in binary form so 
one knows they are there, and so one can try to decipher them (e.g. the 
0xa0000003 ones).

 tools/winedump/lnk.c |   53 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/tools/winedump/lnk.c b/tools/winedump/lnk.c
index 1da0176..a4ac161 100644
--- a/tools/winedump/lnk.c
+++ b/tools/winedump/lnk.c
@@ -336,6 +336,58 @@ static int dump_advertise_info(const char *type)
     return 0;
 }
 
+static int dump_raw_block()
+{
+    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);
+    printf("magic   = %x\n", bhdr->dwSignature);
+
+    data_size=bhdr->cbSize-sizeof(*bhdr);
+    if (data_size > 0)
+    {
+        unsigned int i;
+        const unsigned char *data;
+
+        printf("data    = ");
+        data=(const unsigned char*)bhdr+sizeof(*bhdr);
+        while (data_size > 0)
+        {
+            for (i=0; i < 16; i++)
+            {
+                if (i < data_size)
+                    printf("%02x ", data[i]);
+                else
+                    printf("   ");
+            }
+            for (i=0; i < data_size && i < 16; i++)
+                printf("%c", (data[i] >= 32 && data[i] < 128 ? data[i] : '.'));
+            printf("\n");
+            data_size-=16;
+            if (data_size <= 0)
+                break;
+            data+=16;
+            printf("          ");
+        }
+    }
+    printf("\n");
+
+    return 1;
+}
+
 static const GUID CLSID_ShellLink = {0x00021401L, 0, 0, {0xC0,0,0,0,0,0,0,0x46}};
 
 enum FileSig get_kind_lnk(void)
@@ -429,4 +481,5 @@ void lnk_dump(void)
         dump_advertise_info("product");
     if (hdr->dwFlags & SLDF_HAS_DARWINID)
         dump_advertise_info("msi string");
+    while (dump_raw_block());
 }
-- 
1.5.3.8




More information about the wine-patches mailing list