[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