WINEDUMP: dump out the msi information in more detail

Mike McCormack mike at codeweavers.com
Thu Jun 9 03:04:49 CDT 2005


ChangeLog:
* dump out the msi information in more detail
-------------- next part --------------
Index: tools/winedump/lnk.c
===================================================================
RCS file: /home/wine/wine/tools/winedump/lnk.c,v
retrieving revision 1.6
diff -u -p -r1.6 lnk.c
--- tools/winedump/lnk.c	23 May 2005 10:28:18 -0000	1.6
+++ tools/winedump/lnk.c	9 Jun 2005 08:06:32 -0000
@@ -300,6 +300,41 @@ static int dump_location(int fd)
     return 0;
 }
 
+static const unsigned char table_dec85[0x80] = {
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+0xff,0x00,0xff,0xff,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0xff,
+0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0xff,0xff,0xff,0x16,0xff,0x17,
+0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
+0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0xff,0x34,0x35,0x36,
+0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,
+0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0xff,0x53,0x54,0xff,
+};
+
+static int base85_to_guid( const unsigned char *str, LPGUID guid )
+{
+    DWORD i, val = 0, base = 1, *p;
+
+    p = (DWORD*) guid;
+    for( i=0; i<20; i++ )
+    {
+        if( (i%5) == 0 )
+        {
+            val = 0;
+            base = 1;
+        }
+        val += table_dec85[str[i]] * base;
+        if( str[i] >= 0x80 )
+            return 0;
+        if( table_dec85[str[i]] == 0xff )
+            return 0;
+        if( (i%5) == 4 )
+            p[i/5] = val;
+        base *= 85;
+    }
+    return 1;
+}
+
 static int dump_advertise_info(int fd, const char *type)
 {
     LINK_ADVERTISEINFO *avt;
@@ -312,6 +347,33 @@ static int dump_advertise_info(int fd, c
     printf("--------------\n\n");
     printf("magic   = %lx\n", avt->magic);
     printf("%s = %s\n", type, avt->bufA);
+    if (avt->magic == 0xa0000006)
+    {
+        char prod_str[40], comp_str[40], feat_str[40];
+        char *feat, *comp;
+        GUID guid;
+
+        if (base85_to_guid(avt->bufA, &guid))
+            guid_to_string( &guid, prod_str );
+        else
+            strcpy( prod_str, "?" );
+
+        comp = &avt->bufA[20];
+        feat = strchr(comp,'>');
+        if (feat)
+            memcpy( comp_str, comp, feat - comp );
+        else
+            strcpy( prod_str, "?" );
+
+        if (feat && base85_to_guid( &feat[1], &guid ))
+            guid_to_string( &guid, feat_str );
+        else
+            strcpy( prod_str, "?" );
+
+        printf("  product:   %s\n", prod_str);
+        printf("  component: %s\n", comp_str );
+        printf("  feature:   %s\n", feat_str);
+    }
     printf("\n");
 
     return 0;
@@ -369,7 +431,7 @@ static int dump_lnk_fd(int fd)
     if (hdr->dwFlags & SCF_PRODUCT)
         dump_advertise_info(fd, "product");
     if (hdr->dwFlags & SCF_COMPONENT)
-        dump_advertise_info(fd, "component");
+        dump_advertise_info(fd, "msi string");
 
     return 0;
 }


More information about the wine-patches mailing list