Vincent Povirk : winedump: Add basic support for dumping the property store in lnk files.
Alexandre Julliard
julliard at winehq.org
Fri Apr 6 14:43:28 CDT 2012
Module: wine
Branch: master
Commit: 73e7346dd5b1d34ea1ae698e4d9c5f16bdf7f7fb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=73e7346dd5b1d34ea1ae698e4d9c5f16bdf7f7fb
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Thu Apr 5 16:46:54 2012 -0500
winedump: Add basic support for dumping the property store in lnk files.
---
tools/winedump/lnk.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 108 insertions(+), 0 deletions(-)
diff --git a/tools/winedump/lnk.c b/tools/winedump/lnk.c
index 680e2de..e0a2282 100644
--- a/tools/winedump/lnk.c
+++ b/tools/winedump/lnk.c
@@ -67,6 +67,7 @@ typedef enum {
#define EXP_SPECIAL_FOLDER_SIG 0xa0000005
#define EXP_DARWIN_ID_SIG 0xa0000006
#define EXP_SZ_ICON_SIG 0xa0000007
+#define EXP_PROPERTYSTORAGE_SIG 0xa0000009
typedef struct tagDATABLOCKHEADER
{
@@ -99,6 +100,22 @@ typedef struct tagLINK_SZ_BLOCK
WCHAR bufW[MAX_PATH];
} LINK_SZ_BLOCK;
+typedef struct tagLINK_PROPERTYSTORAGE_GUID
+{
+ DWORD size;
+ DWORD magic;
+ GUID fmtid;
+} LINK_PROPERTYSTORAGE_GUID;
+
+typedef struct tagLINK_PROPERTYSTORAGE_VALUE
+{
+ DWORD size;
+ DWORD pid;
+ BYTE unknown8;
+ DWORD vt;
+ DWORD unknown25;
+} LINK_PROPERTYSTORAGE_VALUE;
+
typedef struct _LOCATION_INFO
{
DWORD dwTotalSize;
@@ -386,6 +403,94 @@ static int dump_darwin_id(const DATABLOCK_HEADER* bhdr)
return 0;
}
+static void dump_property_storage_value(const LINK_PROPERTYSTORAGE_VALUE *lnk_value_hdr,
+ DWORD data_size)
+{
+ int got_terminator = 0, i, value_size;
+ const unsigned char *value;
+
+ while (data_size >= sizeof(DWORD))
+ {
+ if (!lnk_value_hdr->size)
+ {
+ got_terminator = 1;
+ break;
+ }
+
+ if (lnk_value_hdr->size > data_size || lnk_value_hdr->size < sizeof(*lnk_value_hdr))
+ {
+ printf(" size: %d (invald)\n", lnk_value_hdr->size);
+ return;
+ }
+
+ printf(" pid: %d\n", lnk_value_hdr->pid);
+ printf(" unknown8: %d\n", lnk_value_hdr->unknown8);
+ printf(" vartype: %d\n", lnk_value_hdr->vt);
+ printf(" unknown25: %d\n", lnk_value_hdr->unknown25);
+
+ value_size = lnk_value_hdr->size - sizeof(*lnk_value_hdr);
+ value = (const unsigned char*)(lnk_value_hdr+1);
+
+ printf(" value (%2d bytes) : ",value_size);
+ for(i=0; i<value_size; i++)
+ printf("%02x ",value[i]);
+ printf("\n\n");
+
+ data_size -= lnk_value_hdr->size;
+ lnk_value_hdr = (void*)((char*)lnk_value_hdr + lnk_value_hdr->size);
+ }
+
+ if (!got_terminator)
+ printf(" missing terminator!\n");
+}
+
+static int dump_property_storage(const DATABLOCK_HEADER* bhdr)
+{
+ int data_size;
+ const LINK_PROPERTYSTORAGE_GUID *lnk_guid_hdr;
+ int got_terminator = 0;
+
+ printf("Property Storage\n");
+ printf("--------------\n\n");
+
+ data_size=bhdr->cbSize-sizeof(*bhdr);
+
+ lnk_guid_hdr=(void*)((const char*)bhdr+sizeof(*bhdr));
+
+ while (data_size >= sizeof(DWORD))
+ {
+ if (!lnk_guid_hdr->size)
+ {
+ got_terminator = 1;
+ break;
+ }
+
+ if (lnk_guid_hdr->size > data_size || lnk_guid_hdr->size < sizeof(*lnk_guid_hdr))
+ {
+ printf("size: %d (invald)\n", lnk_guid_hdr->size);
+ return 1;
+ }
+
+ if (lnk_guid_hdr->magic != 0x53505331)
+ printf("magic: %x\n", lnk_guid_hdr->magic);
+
+ printf("fmtid: %s\n", get_guid_str(&lnk_guid_hdr->fmtid));
+
+ dump_property_storage_value((void*)(lnk_guid_hdr + 1), lnk_guid_hdr->size - sizeof(*lnk_guid_hdr));
+
+ data_size -= lnk_guid_hdr->size;
+
+ lnk_guid_hdr = (void*)((char*)lnk_guid_hdr + lnk_guid_hdr->size);
+ }
+
+ if (!got_terminator)
+ printf("missing terminator!\n");
+
+ printf("\n");
+
+ return 0;
+}
+
static int dump_raw_block(const DATABLOCK_HEADER* bhdr)
{
int data_size;
@@ -539,6 +644,9 @@ void lnk_dump(void)
case EXP_DARWIN_ID_SIG:
dump_darwin_id(bhdr);
break;
+ case EXP_PROPERTYSTORAGE_SIG:
+ dump_property_storage(bhdr);
+ break;
default:
dump_raw_block(bhdr);
}
More information about the wine-cvs
mailing list