Написал утилиту, может кому пригодится. Много людей, изучавших внутреннее устройство Windows, пользовались программой pdbdump для извлечения информации из файлов отладочной информации. Но к сожалению программа pdbdump создает некорректные заголовочные файлы( в частности не распознает unions http://www.wasm.ru/forum/viewtopic.php?pid=328285#p328285 ). Мне надоело вручную править структуры и поэтому я решил написать программу, генерирующую правильные структуры. Утилита не является полноценной заменой pdbdump/DIA2Dump. Так как pdbdump/DIA2Dump показывает ВСЕ отладочные символы( включая например названия меток ), а моя программа только те, которые можно будет использовать в своих заголовочных файлах( структуры, объединения, перечисления ). Итак PDBRipper: http://ntinfo.biz/index.php/pdbripper Для сравнения структура _LDR_DATA_TABLE_ENTRY: pdbdump: Code (Text): struct _LDR_DATA_TABLE_ENTRY { // static data ------------------------------------ // non-static data -------------------------------- /*<thisrel this+0x0>*/ /*|0x8|*/ struct _LIST_ENTRY InLoadOrderLinks; /*<thisrel this+0x8>*/ /*|0x8|*/ struct _LIST_ENTRY InMemoryOrderLinks; /*<thisrel this+0x10>*/ /*|0x8|*/ struct _LIST_ENTRY InInitializationOrderLinks; /*<thisrel this+0x18>*/ /*|0x4|*/ void* DllBase; /*<thisrel this+0x1c>*/ /*|0x4|*/ void* EntryPoint; /*<thisrel this+0x20>*/ /*|0x4|*/ unsigned long SizeOfImage; /*<thisrel this+0x24>*/ /*|0x8|*/ struct _UNICODE_STRING FullDllName; /*<thisrel this+0x2c>*/ /*|0x8|*/ struct _UNICODE_STRING BaseDllName; /*<thisrel this+0x34>*/ /*|0x4|*/ unsigned long Flags; /*<thisrel this+0x38>*/ /*|0x2|*/ unsigned short LoadCount; /*<thisrel this+0x3a>*/ /*|0x2|*/ unsigned short TlsIndex; /*<thisrel this+0x3c>*/ /*|0x8|*/ struct _LIST_ENTRY HashLinks; /*<thisrel this+0x3c>*/ /*|0x4|*/ void* SectionPointer; /*<thisrel this+0x40>*/ /*|0x4|*/ unsigned long CheckSum; /*<thisrel this+0x44>*/ /*|0x4|*/ unsigned long TimeDateStamp; /*<thisrel this+0x44>*/ /*|0x4|*/ void* LoadedImports; /*<thisrel this+0x48>*/ /*|0x4|*/ struct _ACTIVATION_CONTEXT* EntryPointActivationContext; /*<thisrel this+0x4c>*/ /*|0x4|*/ void* PatchInformation; /*<thisrel this+0x50>*/ /*|0x8|*/ struct _LIST_ENTRY ForwarderLinks; /*<thisrel this+0x58>*/ /*|0x8|*/ struct _LIST_ENTRY ServiceTagLinks; /*<thisrel this+0x60>*/ /*|0x8|*/ struct _LIST_ENTRY StaticLinks; // base classes ----------------------------------- // friends ---------------------------------------- // static functions ------------------------------- // non-virtual functions -------------------------- // virtual functions ------------------------------ }; // <size 0x68> PDBRipper: Code (Text): struct _LDR_DATA_TABLE_ENTRY // Size=104 { struct _LIST_ENTRY InLoadOrderLinks; //Size=8 Offset=0 struct _LIST_ENTRY InMemoryOrderLinks; //Size=8 Offset=8 struct _LIST_ENTRY InInitializationOrderLinks; //Size=8 Offset=16 void * DllBase; //Size=4 Offset=24 void * EntryPoint; //Size=4 Offset=28 unsigned long SizeOfImage; //Size=4 Offset=32 struct _UNICODE_STRING FullDllName; //Size=8 Offset=36 struct _UNICODE_STRING BaseDllName; //Size=8 Offset=44 unsigned long Flags; //Size=4 Offset=52 unsigned short LoadCount; //Size=2 Offset=56 unsigned short TlsIndex; //Size=2 Offset=58 union { struct _LIST_ENTRY HashLinks; //Size=8 Offset=60 struct { void * SectionPointer; //Size=4 Offset=60 unsigned long CheckSum; //Size=4 Offset=64 }; }; union { unsigned long TimeDateStamp; //Size=4 Offset=68 void * LoadedImports; //Size=4 Offset=68 }; struct _ACTIVATION_CONTEXT * EntryPointActivationContext; //Size=4 Offset=72 void * PatchInformation; //Size=4 Offset=76 struct _LIST_ENTRY ForwarderLinks; //Size=8 Offset=80 struct _LIST_ENTRY ServiceTagLinks; //Size=8 Offset=88 struct _LIST_ENTRY StaticLinks; //Size=8 Offset=96 }; Возможны ошибки при работе с какими-нибудь классами с хитрыми виртуальными функциями, так как PDBRipper имеет назначение в первую очередь извлекать информацию из вот этих файлов: http://msdn.microsoft.com/en-us/windows/hardware/gg463028 , а полноценную реализацию поддержки классов я пока не планирую(так как не вижу в этом смысла). У кого есть желание протестировать утилиту на разных файлах, отписаться об ошибках, предложить новые идеи, то всегда пожалуйста.
Интересно, но у меня падает на XP SP3 x86 при попытке загрузить любой pdb, который я пробовал. Минидамп в аттаче, колстек вот: Code (Text): Executable search path is: Windows XP Version 2600 (Service Pack 3) MP (2 procs) Free x86 compatible Product: WinNt, suite: SingleUserTS Machine Name: Debug session time: Wed Nov 23 14:48:08.000 2011 (GMT+4) System Uptime: not available Process Uptime: 0 days 0:00:56.000 ................................................................ ................... This dump file has an exception of interest stored in it. The stored exception information can be accessed via .ecxr. (89c.d14): Access violation - code c0000005 (first/second chance not available) eax=00b22b52 ebx=0022fe64 ecx=77c1c2e3 edx=0022ceec esi=0022ceb8 edi=0000001c eip=00000000 esp=0022ce7c ebp=0022cf08 iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00200206 00000000 ?? ??? 0:000> kv *** Stack trace for last set context - .thread/.cxr resets it ChildEBP RetAddr Args to Child WARNING: Frame IP not in any known module. Following frames may be wrong. 0022ce78 004038bf 00b22b52 0000001c 0022ceec 0x0 0022cf08 004105b7 0022fe64 00000000 00000023 pdbripper+0x38bf 0022cf38 6a2c7575 0022fe64 00000000 00000023 pdbripper+0x105b7 0022cfc8 651098ac 003e9db8 65803640 00000001 QtCore4!ZN11QMetaObject8activateEP7QObjectPKS_iPPv+0x25d 0022d008 6510ada4 003e9db8 00000000 0022d048 QtGui4!ZN7QAction9triggeredEb+0x3c 0022d048 654cea76 003e9db8 00000000 ffffffff QtGui4!ZN7QAction8activateENS_11ActionEventE+0x60 0022d098 654d3fc8 00b11f30 0022d10c 003e9db8 QtGui4!ZNK5QMenu4iconEv+0x2aa 0022d128 654d4a16 00b11f30 003e9db8 00000000 QtGui4!ZN5QMenu10timerEventEP11QTimerEvent+0x694 0022d158 6515a1b8 00b11da0 0022d730 ffffffe4 QtGui4!ZN5QMenu17mouseReleaseEventEP11QMouseEvent+0xda 0022d2a8 654d60fc 00b11da0 0022d730 003e5284 QtGui4!ZN7QWidget5eventEP6QEvent+0x968 0022d338 6510fa38 00b11da0 0022d730 0022d730 QtGui4!ZN5QMenu5eventEP6QEvent+0x4c 0022d378 65118cbd 003e4f60 00b11da0 0022d730 QtGui4!ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent+0x8c 0022d638 6a2b425c 0022fe98 00b11da0 0022d730 QtGui4!ZN12QApplication6notifyEP7QObjectP6QEvent+0xafd 0022d688 651135bb 0022fe98 00b11da0 0022d730 QtCore4!ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent+0x60 0022d6d8 65176ffb 00b11da0 0022d730 00000000 QtGui4!ZN19QApplicationPrivate14sendMouseEventEP7QWidgetP11QMouseEventS1_S1_PS1_R8QPointerIS0_Eb+0x14f 0022d858 6517a897 00b11da0 0022dc1c 0022dddc QtGui4!ZN19QApplicationPrivate19translateTouchEventERK6tagMSG+0xdcb 0022ddf8 7e368734 00000000 00000001 7e368734 QtGui4!ZN19QApplicationPrivate27initializeWidgetPaletteHashEv+0x245b 0022de30 7e368816 65179f34 001f0af4 00000202 user32!InternalCallWinProc+0x28 0022de98 7e3689cd 00000000 65179f34 001f0af4 user32!UserCallWinProcCheckWow+0x150 (FPO: [Non-Fpo]) 0022def8 7e368a10 0022fce4 00000000 0022fd18 user32!DispatchMessageWorker+0x306 (FPO: [Non-Fpo])
Теперь не падает, но для любого файла: Code (Text): Open File: c:\blah.pdb Cannot Open File: c:\blah.pdb
ОК, работает. Огорчает использование тяжёлого фреймворка, при том, что функциональность гуя его совершенно не требует и вряд ли когда-нибудь потребует.
Просто это всё первоначально писалось на скорую руку, для себя. А так конечно можно было бы переписать GUI на чистом WinAPI.
Если кого-то заинтересует, то могу сделать вывод не только в С/С++ заголовочные файлы, но и в другие форматы, например ассемблер, но нужно тогда договориться, как это лучше представить, какой синтаксис. К примеру как лучше и корректнее представить перечисления, битовые структуры и т.д.