dbghelp.h 122 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602
  1. /*++ BUILD Version: 0000 Increment this if a change has global effects
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4. dbghelp.h
  5. Abstract:
  6. This module defines the prototypes and constants required for the image
  7. help routines.
  8. Contains debugging support routines that are redistributable.
  9. Revision History:
  10. --*/
  11. #ifndef _DBGHELP_
  12. #define _DBGHELP_
  13. #if _MSC_VER > 1020
  14. #pragma once
  15. #endif
  16. // As a general principal always call the 64 bit version
  17. // of every API, if a choice exists. The 64 bit version
  18. // works great on 32 bit platforms, and is forward
  19. // compatible to 64 bit platforms.
  20. #ifdef _WIN64
  21. #ifndef _IMAGEHLP64
  22. #define _IMAGEHLP64
  23. #endif
  24. #endif
  25. #include <pshpack8.h>
  26. // For those without specstrings.h
  27. // Since there are different versions of this header, I need to
  28. // individually test each item and define it if it is not around.
  29. #ifndef __in
  30. #define __in
  31. #endif
  32. #ifndef __out
  33. #define __out
  34. #endif
  35. #ifndef __inout
  36. #define __inout
  37. #endif
  38. #ifndef __in_opt
  39. #define __in_opt
  40. #endif
  41. #ifndef __out_opt
  42. #define __out_opt
  43. #endif
  44. #ifndef __inout_opt
  45. #define __inout_opt
  46. #endif
  47. #ifndef __in_ecount
  48. #define __in_ecount(x)
  49. #endif
  50. #ifndef __out_ecount
  51. #define __out_ecount(x)
  52. #endif
  53. #ifndef __inout_ecount
  54. #define __inout_ecount(x)
  55. #endif
  56. #ifndef __in_bcount
  57. #define __in_bcount(x)
  58. #endif
  59. #ifndef __out_bcount
  60. #define __out_bcount(x)
  61. #endif
  62. #ifndef __inout_bcount
  63. #define __inout_bcount(x)
  64. #endif
  65. #ifndef __out_xcount
  66. #define __out_xcount(x)
  67. #endif
  68. #ifndef __deref_opt_out
  69. #define __deref_opt_out
  70. #endif
  71. #ifndef __deref_out
  72. #define __deref_out
  73. #endif
  74. #ifndef __out_ecount_opt
  75. #define __out_ecount_opt(x)
  76. #endif
  77. #ifndef __in_bcount_opt
  78. #define __in_bcount_opt(x)
  79. #endif
  80. #ifndef __out_bcount_opt
  81. #define __out_bcount_opt(x)
  82. #endif
  83. #ifndef __deref_out_opt
  84. #define __deref_out_opt
  85. #endif
  86. #ifdef __cplusplus
  87. extern "C" {
  88. #endif
  89. #ifdef _IMAGEHLP_SOURCE_
  90. #define IMAGEAPI __stdcall
  91. #define DBHLP_DEPRECIATED
  92. #else
  93. #define IMAGEAPI DECLSPEC_IMPORT __stdcall
  94. #if (_MSC_VER >= 1300) && !defined(MIDL_PASS)
  95. #define DBHLP_DEPRECIATED __declspec(deprecated)
  96. #else
  97. #define DBHLP_DEPRECIATED
  98. #endif
  99. #endif
  100. #define DBHLPAPI IMAGEAPI
  101. #define IMAGE_SEPARATION (64*1024)
  102. // Observant readers may notice that 2 new fields,
  103. // 'fReadOnly' and 'Version' have been added to
  104. // the LOADED_IMAGE structure after 'fDOSImage'.
  105. // This does not change the size of the structure
  106. // from previous headers. That is because while
  107. // 'fDOSImage' is a byte, it is padded by the
  108. // compiler to 4 bytes. So the 2 new fields are
  109. // slipped into the extra space.
  110. typedef struct _LOADED_IMAGE {
  111. PSTR ModuleName;
  112. HANDLE hFile;
  113. PUCHAR MappedAddress;
  114. #ifdef _IMAGEHLP64
  115. PIMAGE_NT_HEADERS64 FileHeader;
  116. #else
  117. PIMAGE_NT_HEADERS32 FileHeader;
  118. #endif
  119. PIMAGE_SECTION_HEADER LastRvaSection;
  120. ULONG NumberOfSections;
  121. PIMAGE_SECTION_HEADER Sections;
  122. ULONG Characteristics;
  123. BOOLEAN fSystemImage;
  124. BOOLEAN fDOSImage;
  125. BOOLEAN fReadOnly;
  126. UCHAR Version;
  127. LIST_ENTRY Links;
  128. ULONG SizeOfImage;
  129. } LOADED_IMAGE, *PLOADED_IMAGE;
  130. #define MAX_SYM_NAME 2000
  131. // Error codes set by dbghelp functions. Call GetLastError
  132. // to see them.
  133. // Dbghelp also sets error codes found in winerror.h
  134. #define ERROR_IMAGE_NOT_STRIPPED 0x8800 // the image is not stripped. No dbg file available.
  135. #define ERROR_NO_DBG_POINTER 0x8801 // image is stripped but there is no pointer to a dbg file
  136. #define ERROR_NO_PDB_POINTER 0x8802 // image does not point to a pdb file
  137. typedef BOOL
  138. (CALLBACK *PFIND_DEBUG_FILE_CALLBACK)(
  139. __in HANDLE FileHandle,
  140. __in PCSTR FileName,
  141. __in PVOID CallerData
  142. );
  143. HANDLE
  144. IMAGEAPI
  145. SymFindDebugInfoFile(
  146. __in HANDLE hProcess,
  147. __in PCSTR FileName,
  148. __out_ecount(MAX_PATH + 1) PSTR DebugFilePath,
  149. __in_opt PFIND_DEBUG_FILE_CALLBACK Callback,
  150. __in_opt PVOID CallerData
  151. );
  152. typedef BOOL
  153. (CALLBACK *PFIND_DEBUG_FILE_CALLBACKW)(
  154. __in HANDLE FileHandle,
  155. __in PCWSTR FileName,
  156. __in PVOID CallerData
  157. );
  158. HANDLE
  159. IMAGEAPI
  160. SymFindDebugInfoFileW(
  161. __in HANDLE hProcess,
  162. __in PCWSTR FileName,
  163. __out_ecount(MAX_PATH + 1) PWSTR DebugFilePath,
  164. __in_opt PFIND_DEBUG_FILE_CALLBACKW Callback,
  165. __in_opt PVOID CallerData
  166. );
  167. HANDLE
  168. IMAGEAPI
  169. FindDebugInfoFile (
  170. __in PCSTR FileName,
  171. __in PCSTR SymbolPath,
  172. __out_ecount(MAX_PATH + 1) PSTR DebugFilePath
  173. );
  174. HANDLE
  175. IMAGEAPI
  176. FindDebugInfoFileEx (
  177. __in PCSTR FileName,
  178. __in PCSTR SymbolPath,
  179. __out_ecount(MAX_PATH + 1) PSTR DebugFilePath,
  180. __in_opt PFIND_DEBUG_FILE_CALLBACK Callback,
  181. __in_opt PVOID CallerData
  182. );
  183. HANDLE
  184. IMAGEAPI
  185. FindDebugInfoFileExW (
  186. __in PCWSTR FileName,
  187. __in PCWSTR SymbolPath,
  188. __out_ecount(MAX_PATH + 1) PWSTR DebugFilePath,
  189. __in_opt PFIND_DEBUG_FILE_CALLBACKW Callback,
  190. __in_opt PVOID CallerData
  191. );
  192. typedef BOOL
  193. (CALLBACK *PFINDFILEINPATHCALLBACK)(
  194. __in PCSTR filename,
  195. __in PVOID context
  196. );
  197. BOOL
  198. IMAGEAPI
  199. SymFindFileInPath(
  200. __in HANDLE hprocess,
  201. __in_opt PCSTR SearchPath,
  202. __in PCSTR FileName,
  203. __in_opt PVOID id,
  204. __in DWORD two,
  205. __in DWORD three,
  206. __in DWORD flags,
  207. __out_ecount(MAX_PATH + 1) PSTR FoundFile,
  208. __in_opt PFINDFILEINPATHCALLBACK callback,
  209. __in_opt PVOID context
  210. );
  211. typedef BOOL
  212. (CALLBACK *PFINDFILEINPATHCALLBACKW)(
  213. __in PCWSTR filename,
  214. __in PVOID context
  215. );
  216. BOOL
  217. IMAGEAPI
  218. SymFindFileInPathW(
  219. __in HANDLE hprocess,
  220. __in_opt PCWSTR SearchPath,
  221. __in PCWSTR FileName,
  222. __in_opt PVOID id,
  223. __in DWORD two,
  224. __in DWORD three,
  225. __in DWORD flags,
  226. __out_ecount(MAX_PATH + 1) PWSTR FoundFile,
  227. __in_opt PFINDFILEINPATHCALLBACKW callback,
  228. __in_opt PVOID context
  229. );
  230. typedef BOOL
  231. (CALLBACK *PFIND_EXE_FILE_CALLBACK)(
  232. __in HANDLE FileHandle,
  233. __in PCSTR FileName,
  234. __in_opt PVOID CallerData
  235. );
  236. HANDLE
  237. IMAGEAPI
  238. SymFindExecutableImage(
  239. __in HANDLE hProcess,
  240. __in PCSTR FileName,
  241. __out_ecount(MAX_PATH + 1) PSTR ImageFilePath,
  242. __in PFIND_EXE_FILE_CALLBACK Callback,
  243. __in PVOID CallerData
  244. );
  245. typedef BOOL
  246. (CALLBACK *PFIND_EXE_FILE_CALLBACKW)(
  247. __in HANDLE FileHandle,
  248. __in PCWSTR FileName,
  249. __in_opt PVOID CallerData
  250. );
  251. HANDLE
  252. IMAGEAPI
  253. SymFindExecutableImageW(
  254. __in HANDLE hProcess,
  255. __in PCWSTR FileName,
  256. __out_ecount(MAX_PATH + 1) PWSTR ImageFilePath,
  257. __in PFIND_EXE_FILE_CALLBACKW Callback,
  258. __in PVOID CallerData
  259. );
  260. HANDLE
  261. IMAGEAPI
  262. FindExecutableImage(
  263. __in PCSTR FileName,
  264. __in PCSTR SymbolPath,
  265. __out_ecount(MAX_PATH + 1) PSTR ImageFilePath
  266. );
  267. HANDLE
  268. IMAGEAPI
  269. FindExecutableImageEx(
  270. __in PCSTR FileName,
  271. __in PCSTR SymbolPath,
  272. __out_ecount(MAX_PATH + 1) PSTR ImageFilePath,
  273. __in_opt PFIND_EXE_FILE_CALLBACK Callback,
  274. __in_opt PVOID CallerData
  275. );
  276. HANDLE
  277. IMAGEAPI
  278. FindExecutableImageExW(
  279. __in PCWSTR FileName,
  280. __in PCWSTR SymbolPath,
  281. __out_ecount(MAX_PATH + 1) PWSTR ImageFilePath,
  282. __in_opt PFIND_EXE_FILE_CALLBACKW Callback,
  283. __in PVOID CallerData
  284. );
  285. PIMAGE_NT_HEADERS
  286. IMAGEAPI
  287. ImageNtHeader (
  288. __in PVOID Base
  289. );
  290. PVOID
  291. IMAGEAPI
  292. ImageDirectoryEntryToDataEx (
  293. __in PVOID Base,
  294. __in BOOLEAN MappedAsImage,
  295. __in USHORT DirectoryEntry,
  296. __out PULONG Size,
  297. __out_opt PIMAGE_SECTION_HEADER *FoundHeader
  298. );
  299. PVOID
  300. IMAGEAPI
  301. ImageDirectoryEntryToData (
  302. __in PVOID Base,
  303. __in BOOLEAN MappedAsImage,
  304. __in USHORT DirectoryEntry,
  305. __out PULONG Size
  306. );
  307. PIMAGE_SECTION_HEADER
  308. IMAGEAPI
  309. ImageRvaToSection(
  310. __in PIMAGE_NT_HEADERS NtHeaders,
  311. __in PVOID Base,
  312. __in ULONG Rva
  313. );
  314. PVOID
  315. IMAGEAPI
  316. ImageRvaToVa(
  317. __in PIMAGE_NT_HEADERS NtHeaders,
  318. __in PVOID Base,
  319. __in ULONG Rva,
  320. __in_opt OUT PIMAGE_SECTION_HEADER *LastRvaSection
  321. );
  322. #ifndef _WIN64
  323. // This api won't be ported to Win64 - Fix your code.
  324. typedef struct _IMAGE_DEBUG_INFORMATION {
  325. LIST_ENTRY List;
  326. DWORD ReservedSize;
  327. PVOID ReservedMappedBase;
  328. USHORT ReservedMachine;
  329. USHORT ReservedCharacteristics;
  330. DWORD ReservedCheckSum;
  331. DWORD ImageBase;
  332. DWORD SizeOfImage;
  333. DWORD ReservedNumberOfSections;
  334. PIMAGE_SECTION_HEADER ReservedSections;
  335. DWORD ReservedExportedNamesSize;
  336. PSTR ReservedExportedNames;
  337. DWORD ReservedNumberOfFunctionTableEntries;
  338. PIMAGE_FUNCTION_ENTRY ReservedFunctionTableEntries;
  339. DWORD ReservedLowestFunctionStartingAddress;
  340. DWORD ReservedHighestFunctionEndingAddress;
  341. DWORD ReservedNumberOfFpoTableEntries;
  342. PFPO_DATA ReservedFpoTableEntries;
  343. DWORD SizeOfCoffSymbols;
  344. PIMAGE_COFF_SYMBOLS_HEADER CoffSymbols;
  345. DWORD ReservedSizeOfCodeViewSymbols;
  346. PVOID ReservedCodeViewSymbols;
  347. PSTR ImageFilePath;
  348. PSTR ImageFileName;
  349. PSTR ReservedDebugFilePath;
  350. DWORD ReservedTimeDateStamp;
  351. BOOL ReservedRomImage;
  352. PIMAGE_DEBUG_DIRECTORY ReservedDebugDirectory;
  353. DWORD ReservedNumberOfDebugDirectories;
  354. DWORD ReservedOriginalFunctionTableBaseAddress;
  355. DWORD Reserved[ 2 ];
  356. } IMAGE_DEBUG_INFORMATION, *PIMAGE_DEBUG_INFORMATION;
  357. PIMAGE_DEBUG_INFORMATION
  358. IMAGEAPI
  359. MapDebugInformation(
  360. __in_opt HANDLE FileHandle,
  361. __in PCSTR FileName,
  362. __in_opt PCSTR SymbolPath,
  363. __in ULONG ImageBase
  364. );
  365. BOOL
  366. IMAGEAPI
  367. UnmapDebugInformation(
  368. __out_xcount(unknown) PIMAGE_DEBUG_INFORMATION DebugInfo
  369. );
  370. #endif
  371. BOOL
  372. IMAGEAPI
  373. SearchTreeForFile(
  374. __in PCSTR RootPath,
  375. __in PCSTR InputPathName,
  376. __out_ecount(MAX_PATH + 1) PSTR OutputPathBuffer
  377. );
  378. BOOL
  379. IMAGEAPI
  380. SearchTreeForFileW(
  381. __in PCWSTR RootPath,
  382. __in PCWSTR InputPathName,
  383. __out_ecount(MAX_PATH + 1) PWSTR OutputPathBuffer
  384. );
  385. typedef BOOL
  386. (CALLBACK *PENUMDIRTREE_CALLBACK)(
  387. __in PCSTR FilePath,
  388. __in_opt PVOID CallerData
  389. );
  390. BOOL
  391. IMAGEAPI
  392. EnumDirTree(
  393. __in_opt HANDLE hProcess,
  394. __in PCSTR RootPath,
  395. __in PCSTR InputPathName,
  396. __out_ecount_opt(MAX_PATH + 1) PSTR OutputPathBuffer,
  397. __in_opt PENUMDIRTREE_CALLBACK cb,
  398. __in_opt PVOID data
  399. );
  400. typedef BOOL
  401. (CALLBACK *PENUMDIRTREE_CALLBACKW)(
  402. __in PCWSTR FilePath,
  403. __in_opt PVOID CallerData
  404. );
  405. BOOL
  406. IMAGEAPI
  407. EnumDirTreeW(
  408. __in_opt HANDLE hProcess,
  409. __in PCWSTR RootPath,
  410. __in PCWSTR InputPathName,
  411. __out_ecount_opt(MAX_PATH + 1) PWSTR OutputPathBuffer,
  412. __in_opt PENUMDIRTREE_CALLBACKW cb,
  413. __in_opt PVOID data
  414. );
  415. BOOL
  416. IMAGEAPI
  417. MakeSureDirectoryPathExists(
  418. __in PCSTR DirPath
  419. );
  420. //
  421. // UnDecorateSymbolName Flags
  422. //
  423. #define UNDNAME_COMPLETE (0x0000) // Enable full undecoration
  424. #define UNDNAME_NO_LEADING_UNDERSCORES (0x0001) // Remove leading underscores from MS extended keywords
  425. #define UNDNAME_NO_MS_KEYWORDS (0x0002) // Disable expansion of MS extended keywords
  426. #define UNDNAME_NO_FUNCTION_RETURNS (0x0004) // Disable expansion of return type for primary declaration
  427. #define UNDNAME_NO_ALLOCATION_MODEL (0x0008) // Disable expansion of the declaration model
  428. #define UNDNAME_NO_ALLOCATION_LANGUAGE (0x0010) // Disable expansion of the declaration language specifier
  429. #define UNDNAME_NO_MS_THISTYPE (0x0020) // NYI Disable expansion of MS keywords on the 'this' type for primary declaration
  430. #define UNDNAME_NO_CV_THISTYPE (0x0040) // NYI Disable expansion of CV modifiers on the 'this' type for primary declaration
  431. #define UNDNAME_NO_THISTYPE (0x0060) // Disable all modifiers on the 'this' type
  432. #define UNDNAME_NO_ACCESS_SPECIFIERS (0x0080) // Disable expansion of access specifiers for members
  433. #define UNDNAME_NO_THROW_SIGNATURES (0x0100) // Disable expansion of 'throw-signatures' for functions and pointers to functions
  434. #define UNDNAME_NO_MEMBER_TYPE (0x0200) // Disable expansion of 'static' or 'virtual'ness of members
  435. #define UNDNAME_NO_RETURN_UDT_MODEL (0x0400) // Disable expansion of MS model for UDT returns
  436. #define UNDNAME_32_BIT_DECODE (0x0800) // Undecorate 32-bit decorated names
  437. #define UNDNAME_NAME_ONLY (0x1000) // Crack only the name for primary declaration;
  438. // return just [scope::]name. Does expand template params
  439. #define UNDNAME_NO_ARGUMENTS (0x2000) // Don't undecorate arguments to function
  440. #define UNDNAME_NO_SPECIAL_SYMS (0x4000) // Don't undecorate special names (v-table, vcall, vector xxx, metatype, etc)
  441. DWORD
  442. IMAGEAPI
  443. WINAPI
  444. UnDecorateSymbolName(
  445. __in PCSTR name,
  446. __out_ecount(maxStringLength) PSTR outputString,
  447. __in DWORD maxStringLength,
  448. __in DWORD flags
  449. );
  450. DWORD
  451. IMAGEAPI
  452. WINAPI
  453. UnDecorateSymbolNameW(
  454. __in PCWSTR name,
  455. __out_ecount(maxStringLength) PWSTR outputString,
  456. __in DWORD maxStringLength,
  457. __in DWORD flags
  458. );
  459. //
  460. // these values are used for synthesized file types
  461. // that can be passed in as image headers instead of
  462. // the standard ones from ntimage.h
  463. //
  464. #define DBHHEADER_DEBUGDIRS 0x1
  465. #define DBHHEADER_CVMISC 0x2
  466. #define DBHHEADER_PDBGUID 0x3
  467. typedef struct _MODLOAD_DATA {
  468. DWORD ssize; // size of this struct
  469. DWORD ssig; // signature identifying the passed data
  470. PVOID data; // pointer to passed data
  471. DWORD size; // size of passed data
  472. DWORD flags; // options
  473. } MODLOAD_DATA, *PMODLOAD_DATA;
  474. typedef struct _MODLOAD_CVMISC {
  475. DWORD oCV; // ofset to the codeview record
  476. size_t cCV; // size of the codeview record
  477. DWORD oMisc; // offset to the misc record
  478. size_t cMisc; // size of the misc record
  479. DWORD dtImage; // datetime stamp of the image
  480. DWORD cImage; // size of the image
  481. } MODLOAD_CVMISC, *PMODLOAD_CVMISC;
  482. typedef struct _MODLOAD_PDBGUID_PDBAGE {
  483. GUID PdbGuid; // Pdb Guid
  484. DWORD PdbAge; // Pdb Age
  485. } MODLOAD_PDBGUID_PDBAGE, *PMODLOAD_PDBGUID_PDBAGE;
  486. //
  487. // StackWalking API
  488. //
  489. typedef enum {
  490. AddrMode1616,
  491. AddrMode1632,
  492. AddrModeReal,
  493. AddrModeFlat
  494. } ADDRESS_MODE;
  495. typedef struct _tagADDRESS64 {
  496. DWORD64 Offset;
  497. WORD Segment;
  498. ADDRESS_MODE Mode;
  499. } ADDRESS64, *LPADDRESS64;
  500. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  501. #define ADDRESS ADDRESS64
  502. #define LPADDRESS LPADDRESS64
  503. #else
  504. typedef struct _tagADDRESS {
  505. DWORD Offset;
  506. WORD Segment;
  507. ADDRESS_MODE Mode;
  508. } ADDRESS, *LPADDRESS;
  509. __inline
  510. void
  511. Address32To64(
  512. __in LPADDRESS a32,
  513. __out LPADDRESS64 a64
  514. )
  515. {
  516. a64->Offset = (ULONG64)(LONG64)(LONG)a32->Offset;
  517. a64->Segment = a32->Segment;
  518. a64->Mode = a32->Mode;
  519. }
  520. __inline
  521. void
  522. Address64To32(
  523. __in LPADDRESS64 a64,
  524. __out LPADDRESS a32
  525. )
  526. {
  527. a32->Offset = (ULONG)a64->Offset;
  528. a32->Segment = a64->Segment;
  529. a32->Mode = a64->Mode;
  530. }
  531. #endif
  532. //
  533. // This structure is included in the STACKFRAME structure,
  534. // and is used to trace through usermode callbacks in a thread's
  535. // kernel stack. The values must be copied by the kernel debugger
  536. // from the DBGKD_GET_VERSION and WAIT_STATE_CHANGE packets.
  537. //
  538. //
  539. // New KDHELP structure for 64 bit system support.
  540. // This structure is preferred in new code.
  541. //
  542. typedef struct _KDHELP64 {
  543. //
  544. // address of kernel thread object, as provided in the
  545. // WAIT_STATE_CHANGE packet.
  546. //
  547. DWORD64 Thread;
  548. //
  549. // offset in thread object to pointer to the current callback frame
  550. // in kernel stack.
  551. //
  552. DWORD ThCallbackStack;
  553. //
  554. // offset in thread object to pointer to the current callback backing
  555. // store frame in kernel stack.
  556. //
  557. DWORD ThCallbackBStore;
  558. //
  559. // offsets to values in frame:
  560. //
  561. // address of next callback frame
  562. DWORD NextCallback;
  563. // address of saved frame pointer (if applicable)
  564. DWORD FramePointer;
  565. //
  566. // Address of the kernel function that calls out to user mode
  567. //
  568. DWORD64 KiCallUserMode;
  569. //
  570. // Address of the user mode dispatcher function
  571. //
  572. DWORD64 KeUserCallbackDispatcher;
  573. //
  574. // Lowest kernel mode address
  575. //
  576. DWORD64 SystemRangeStart;
  577. //
  578. // Address of the user mode exception dispatcher function.
  579. // Added in API version 10.
  580. //
  581. DWORD64 KiUserExceptionDispatcher;
  582. //
  583. // Stack bounds, added in API version 11.
  584. //
  585. DWORD64 StackBase;
  586. DWORD64 StackLimit;
  587. DWORD64 Reserved[5];
  588. } KDHELP64, *PKDHELP64;
  589. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  590. #define KDHELP KDHELP64
  591. #define PKDHELP PKDHELP64
  592. #else
  593. typedef struct _KDHELP {
  594. //
  595. // address of kernel thread object, as provided in the
  596. // WAIT_STATE_CHANGE packet.
  597. //
  598. DWORD Thread;
  599. //
  600. // offset in thread object to pointer to the current callback frame
  601. // in kernel stack.
  602. //
  603. DWORD ThCallbackStack;
  604. //
  605. // offsets to values in frame:
  606. //
  607. // address of next callback frame
  608. DWORD NextCallback;
  609. // address of saved frame pointer (if applicable)
  610. DWORD FramePointer;
  611. //
  612. // Address of the kernel function that calls out to user mode
  613. //
  614. DWORD KiCallUserMode;
  615. //
  616. // Address of the user mode dispatcher function
  617. //
  618. DWORD KeUserCallbackDispatcher;
  619. //
  620. // Lowest kernel mode address
  621. //
  622. DWORD SystemRangeStart;
  623. //
  624. // offset in thread object to pointer to the current callback backing
  625. // store frame in kernel stack.
  626. //
  627. DWORD ThCallbackBStore;
  628. //
  629. // Address of the user mode exception dispatcher function.
  630. // Added in API version 10.
  631. //
  632. DWORD KiUserExceptionDispatcher;
  633. //
  634. // Stack bounds, added in API version 11.
  635. //
  636. DWORD StackBase;
  637. DWORD StackLimit;
  638. DWORD Reserved[5];
  639. } KDHELP, *PKDHELP;
  640. __inline
  641. void
  642. KdHelp32To64(
  643. __in PKDHELP p32,
  644. __out PKDHELP64 p64
  645. )
  646. {
  647. p64->Thread = p32->Thread;
  648. p64->ThCallbackStack = p32->ThCallbackStack;
  649. p64->NextCallback = p32->NextCallback;
  650. p64->FramePointer = p32->FramePointer;
  651. p64->KiCallUserMode = p32->KiCallUserMode;
  652. p64->KeUserCallbackDispatcher = p32->KeUserCallbackDispatcher;
  653. p64->SystemRangeStart = p32->SystemRangeStart;
  654. p64->KiUserExceptionDispatcher = p32->KiUserExceptionDispatcher;
  655. p64->StackBase = p32->StackBase;
  656. p64->StackLimit = p32->StackLimit;
  657. }
  658. #endif
  659. typedef struct _tagSTACKFRAME64 {
  660. ADDRESS64 AddrPC; // program counter
  661. ADDRESS64 AddrReturn; // return address
  662. ADDRESS64 AddrFrame; // frame pointer
  663. ADDRESS64 AddrStack; // stack pointer
  664. ADDRESS64 AddrBStore; // backing store pointer
  665. PVOID FuncTableEntry; // pointer to pdata/fpo or NULL
  666. DWORD64 Params[4]; // possible arguments to the function
  667. BOOL Far; // WOW far call
  668. BOOL Virtual; // is this a virtual frame?
  669. DWORD64 Reserved[3];
  670. KDHELP64 KdHelp;
  671. } STACKFRAME64, *LPSTACKFRAME64;
  672. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  673. #define STACKFRAME STACKFRAME64
  674. #define LPSTACKFRAME LPSTACKFRAME64
  675. #else
  676. typedef struct _tagSTACKFRAME {
  677. ADDRESS AddrPC; // program counter
  678. ADDRESS AddrReturn; // return address
  679. ADDRESS AddrFrame; // frame pointer
  680. ADDRESS AddrStack; // stack pointer
  681. PVOID FuncTableEntry; // pointer to pdata/fpo or NULL
  682. DWORD Params[4]; // possible arguments to the function
  683. BOOL Far; // WOW far call
  684. BOOL Virtual; // is this a virtual frame?
  685. DWORD Reserved[3];
  686. KDHELP KdHelp;
  687. ADDRESS AddrBStore; // backing store pointer
  688. } STACKFRAME, *LPSTACKFRAME;
  689. #endif
  690. typedef
  691. BOOL
  692. (__stdcall *PREAD_PROCESS_MEMORY_ROUTINE64)(
  693. __in HANDLE hProcess,
  694. __in DWORD64 qwBaseAddress,
  695. __out_bcount(nSize) PVOID lpBuffer,
  696. __in DWORD nSize,
  697. __out LPDWORD lpNumberOfBytesRead
  698. );
  699. typedef
  700. PVOID
  701. (__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE64)(
  702. __in HANDLE ahProcess,
  703. __in DWORD64 AddrBase
  704. );
  705. typedef
  706. DWORD64
  707. (__stdcall *PGET_MODULE_BASE_ROUTINE64)(
  708. __in HANDLE hProcess,
  709. __in DWORD64 Address
  710. );
  711. typedef
  712. DWORD64
  713. (__stdcall *PTRANSLATE_ADDRESS_ROUTINE64)(
  714. __in HANDLE hProcess,
  715. __in HANDLE hThread,
  716. __in LPADDRESS64 lpaddr
  717. );
  718. BOOL
  719. IMAGEAPI
  720. StackWalk64(
  721. __in DWORD MachineType,
  722. __in HANDLE hProcess,
  723. __in HANDLE hThread,
  724. __inout LPSTACKFRAME64 StackFrame,
  725. __inout PVOID ContextRecord,
  726. __in_opt PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
  727. __in_opt PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
  728. __in_opt PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
  729. __in_opt PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress
  730. );
  731. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  732. #define PREAD_PROCESS_MEMORY_ROUTINE PREAD_PROCESS_MEMORY_ROUTINE64
  733. #define PFUNCTION_TABLE_ACCESS_ROUTINE PFUNCTION_TABLE_ACCESS_ROUTINE64
  734. #define PGET_MODULE_BASE_ROUTINE PGET_MODULE_BASE_ROUTINE64
  735. #define PTRANSLATE_ADDRESS_ROUTINE PTRANSLATE_ADDRESS_ROUTINE64
  736. #define StackWalk StackWalk64
  737. #else
  738. typedef
  739. BOOL
  740. (__stdcall *PREAD_PROCESS_MEMORY_ROUTINE)(
  741. __in HANDLE hProcess,
  742. __in DWORD lpBaseAddress,
  743. __out_bcount(nSize) PVOID lpBuffer,
  744. __in DWORD nSize,
  745. __out PDWORD lpNumberOfBytesRead
  746. );
  747. typedef
  748. PVOID
  749. (__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE)(
  750. __in HANDLE hProcess,
  751. __in DWORD AddrBase
  752. );
  753. typedef
  754. DWORD
  755. (__stdcall *PGET_MODULE_BASE_ROUTINE)(
  756. __in HANDLE hProcess,
  757. __in DWORD Address
  758. );
  759. typedef
  760. DWORD
  761. (__stdcall *PTRANSLATE_ADDRESS_ROUTINE)(
  762. __in HANDLE hProcess,
  763. __in HANDLE hThread,
  764. __out LPADDRESS lpaddr
  765. );
  766. BOOL
  767. IMAGEAPI
  768. StackWalk(
  769. DWORD MachineType,
  770. __in HANDLE hProcess,
  771. __in HANDLE hThread,
  772. __inout LPSTACKFRAME StackFrame,
  773. __inout PVOID ContextRecord,
  774. __in_opt PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine,
  775. __in_opt PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine,
  776. __in_opt PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine,
  777. __in_opt PTRANSLATE_ADDRESS_ROUTINE TranslateAddress
  778. );
  779. #endif
  780. #define API_VERSION_NUMBER 11
  781. typedef struct API_VERSION {
  782. USHORT MajorVersion;
  783. USHORT MinorVersion;
  784. USHORT Revision;
  785. USHORT Reserved;
  786. } API_VERSION, *LPAPI_VERSION;
  787. LPAPI_VERSION
  788. IMAGEAPI
  789. ImagehlpApiVersion(
  790. VOID
  791. );
  792. LPAPI_VERSION
  793. IMAGEAPI
  794. ImagehlpApiVersionEx(
  795. __in LPAPI_VERSION AppVersion
  796. );
  797. DWORD
  798. IMAGEAPI
  799. GetTimestampForLoadedLibrary(
  800. __in HMODULE Module
  801. );
  802. //
  803. // typedefs for function pointers
  804. //
  805. typedef BOOL
  806. (CALLBACK *PSYM_ENUMMODULES_CALLBACK64)(
  807. __in PCSTR ModuleName,
  808. __in DWORD64 BaseOfDll,
  809. __in_opt PVOID UserContext
  810. );
  811. typedef BOOL
  812. (CALLBACK *PSYM_ENUMMODULES_CALLBACKW64)(
  813. __in PCWSTR ModuleName,
  814. __in DWORD64 BaseOfDll,
  815. __in_opt PVOID UserContext
  816. );
  817. typedef BOOL
  818. (CALLBACK *PENUMLOADED_MODULES_CALLBACK64)(
  819. __in PCSTR ModuleName,
  820. __in DWORD64 ModuleBase,
  821. __in ULONG ModuleSize,
  822. __in_opt PVOID UserContext
  823. );
  824. typedef BOOL
  825. (CALLBACK *PENUMLOADED_MODULES_CALLBACKW64)(
  826. __in PCWSTR ModuleName,
  827. __in DWORD64 ModuleBase,
  828. __in ULONG ModuleSize,
  829. __in_opt PVOID UserContext
  830. );
  831. typedef BOOL
  832. (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64)(
  833. __in PCSTR SymbolName,
  834. __in DWORD64 SymbolAddress,
  835. __in ULONG SymbolSize,
  836. __in_opt PVOID UserContext
  837. );
  838. typedef BOOL
  839. (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64W)(
  840. __in PCWSTR SymbolName,
  841. __in DWORD64 SymbolAddress,
  842. __in ULONG SymbolSize,
  843. __in_opt PVOID UserContext
  844. );
  845. typedef BOOL
  846. (CALLBACK *PSYMBOL_REGISTERED_CALLBACK64)(
  847. __in HANDLE hProcess,
  848. __in ULONG ActionCode,
  849. __in_opt ULONG64 CallbackData,
  850. __in_opt ULONG64 UserContext
  851. );
  852. typedef
  853. PVOID
  854. (CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK)(
  855. __in HANDLE hProcess,
  856. __in DWORD AddrBase,
  857. __in_opt PVOID UserContext
  858. );
  859. typedef
  860. PVOID
  861. (CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK64)(
  862. __in HANDLE hProcess,
  863. __in ULONG64 AddrBase,
  864. __in ULONG64 UserContext
  865. );
  866. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  867. #define PSYM_ENUMMODULES_CALLBACK PSYM_ENUMMODULES_CALLBACK64
  868. #define PSYM_ENUMSYMBOLS_CALLBACK PSYM_ENUMSYMBOLS_CALLBACK64
  869. #define PSYM_ENUMSYMBOLS_CALLBACKW PSYM_ENUMSYMBOLS_CALLBACK64W
  870. #define PENUMLOADED_MODULES_CALLBACK PENUMLOADED_MODULES_CALLBACK64
  871. #define PSYMBOL_REGISTERED_CALLBACK PSYMBOL_REGISTERED_CALLBACK64
  872. #define PSYMBOL_FUNCENTRY_CALLBACK PSYMBOL_FUNCENTRY_CALLBACK64
  873. #else
  874. typedef BOOL
  875. (CALLBACK *PSYM_ENUMMODULES_CALLBACK)(
  876. __in PCSTR ModuleName,
  877. __in ULONG BaseOfDll,
  878. __in_opt PVOID UserContext
  879. );
  880. typedef BOOL
  881. (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK)(
  882. __in PCSTR SymbolName,
  883. __in ULONG SymbolAddress,
  884. __in ULONG SymbolSize,
  885. __in_opt PVOID UserContext
  886. );
  887. typedef BOOL
  888. (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACKW)(
  889. __in PCWSTR SymbolName,
  890. __in ULONG SymbolAddress,
  891. __in ULONG SymbolSize,
  892. __in_opt PVOID UserContext
  893. );
  894. typedef BOOL
  895. (CALLBACK *PENUMLOADED_MODULES_CALLBACK)(
  896. __in PCSTR ModuleName,
  897. __in ULONG ModuleBase,
  898. __in ULONG ModuleSize,
  899. __in_opt PVOID UserContext
  900. );
  901. typedef BOOL
  902. (CALLBACK *PSYMBOL_REGISTERED_CALLBACK)(
  903. __in HANDLE hProcess,
  904. __in ULONG ActionCode,
  905. __in_opt PVOID CallbackData,
  906. __in_opt PVOID UserContext
  907. );
  908. #endif
  909. // values found in SYMBOL_INFO.Tag
  910. //
  911. // This was taken from cvconst.h and should
  912. // not override any values found there.
  913. //
  914. // #define _NO_CVCONST_H_ if you don't
  915. // have access to that file...
  916. #ifdef _NO_CVCONST_H
  917. // DIA enums
  918. enum SymTagEnum
  919. {
  920. SymTagNull,
  921. SymTagExe,
  922. SymTagCompiland,
  923. SymTagCompilandDetails,
  924. SymTagCompilandEnv,
  925. SymTagFunction,
  926. SymTagBlock,
  927. SymTagData,
  928. SymTagAnnotation,
  929. SymTagLabel,
  930. SymTagPublicSymbol,
  931. SymTagUDT,
  932. SymTagEnum,
  933. SymTagFunctionType,
  934. SymTagPointerType,
  935. SymTagArrayType,
  936. SymTagBaseType,
  937. SymTagTypedef,
  938. SymTagBaseClass,
  939. SymTagFriend,
  940. SymTagFunctionArgType,
  941. SymTagFuncDebugStart,
  942. SymTagFuncDebugEnd,
  943. SymTagUsingNamespace,
  944. SymTagVTableShape,
  945. SymTagVTable,
  946. SymTagCustom,
  947. SymTagThunk,
  948. SymTagCustomType,
  949. SymTagManagedType,
  950. SymTagDimension,
  951. SymTagCallSite,
  952. SymTagMax
  953. };
  954. #endif
  955. //
  956. // flags found in SYMBOL_INFO.Flags
  957. //
  958. #define SYMFLAG_VALUEPRESENT 0x00000001
  959. #define SYMFLAG_REGISTER 0x00000008
  960. #define SYMFLAG_REGREL 0x00000010
  961. #define SYMFLAG_FRAMEREL 0x00000020
  962. #define SYMFLAG_PARAMETER 0x00000040
  963. #define SYMFLAG_LOCAL 0x00000080
  964. #define SYMFLAG_CONSTANT 0x00000100
  965. #define SYMFLAG_EXPORT 0x00000200
  966. #define SYMFLAG_FORWARDER 0x00000400
  967. #define SYMFLAG_FUNCTION 0x00000800
  968. #define SYMFLAG_VIRTUAL 0x00001000
  969. #define SYMFLAG_THUNK 0x00002000
  970. #define SYMFLAG_TLSREL 0x00004000
  971. #define SYMFLAG_SLOT 0x00008000
  972. #define SYMFLAG_ILREL 0x00010000
  973. #define SYMFLAG_METADATA 0x00020000
  974. #define SYMFLAG_CLR_TOKEN 0x00040000
  975. #define SYMFLAG_NULL 0x00080000
  976. // this resets SymNext/Prev to the beginning
  977. // of the module passed in the address field
  978. #define SYMFLAG_RESET 0x80000000
  979. //
  980. // symbol type enumeration
  981. //
  982. typedef enum {
  983. SymNone = 0,
  984. SymCoff,
  985. SymCv,
  986. SymPdb,
  987. SymExport,
  988. SymDeferred,
  989. SymSym, // .sym file
  990. SymDia,
  991. SymVirtual,
  992. NumSymTypes
  993. } SYM_TYPE;
  994. //
  995. // symbol data structure
  996. //
  997. typedef struct _IMAGEHLP_SYMBOL64 {
  998. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_SYMBOL64)
  999. DWORD64 Address; // virtual address including dll base address
  1000. DWORD Size; // estimated size of symbol, can be zero
  1001. DWORD Flags; // info about the symbols, see the SYMF defines
  1002. DWORD MaxNameLength; // maximum size of symbol name in 'Name'
  1003. CHAR Name[1]; // symbol name (null terminated string)
  1004. } IMAGEHLP_SYMBOL64, *PIMAGEHLP_SYMBOL64;
  1005. typedef struct _IMAGEHLP_SYMBOL64_PACKAGE {
  1006. IMAGEHLP_SYMBOL64 sym;
  1007. CHAR name[MAX_SYM_NAME + 1];
  1008. } IMAGEHLP_SYMBOL64_PACKAGE, *PIMAGEHLP_SYMBOL64_PACKAGE;
  1009. typedef struct _IMAGEHLP_SYMBOLW64 {
  1010. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_SYMBOLW64)
  1011. DWORD64 Address; // virtual address including dll base address
  1012. DWORD Size; // estimated size of symbol, can be zero
  1013. DWORD Flags; // info about the symbols, see the SYMF defines
  1014. DWORD MaxNameLength; // maximum size of symbol name in 'Name'
  1015. WCHAR Name[1]; // symbol name (null terminated string)
  1016. } IMAGEHLP_SYMBOLW64, *PIMAGEHLP_SYMBOLW64;
  1017. typedef struct _IMAGEHLP_SYMBOLW64_PACKAGE {
  1018. IMAGEHLP_SYMBOLW64 sym;
  1019. WCHAR name[MAX_SYM_NAME + 1];
  1020. } IMAGEHLP_SYMBOLW64_PACKAGE, *PIMAGEHLP_SYMBOLW64_PACKAGE;
  1021. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1022. #define IMAGEHLP_SYMBOL IMAGEHLP_SYMBOL64
  1023. #define PIMAGEHLP_SYMBOL PIMAGEHLP_SYMBOL64
  1024. #define IMAGEHLP_SYMBOL_PACKAGE IMAGEHLP_SYMBOL64_PACKAGE
  1025. #define PIMAGEHLP_SYMBOL_PACKAGE PIMAGEHLP_SYMBOL64_PACKAGE
  1026. #define IMAGEHLP_SYMBOLW IMAGEHLP_SYMBOLW64
  1027. #define PIMAGEHLP_SYMBOLW PIMAGEHLP_SYMBOLW64
  1028. #define IMAGEHLP_SYMBOLW_PACKAGE IMAGEHLP_SYMBOLW64_PACKAGE
  1029. #define PIMAGEHLP_SYMBOLW_PACKAGE PIMAGEHLP_SYMBOLW64_PACKAGE
  1030. #else
  1031. typedef struct _IMAGEHLP_SYMBOL {
  1032. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_SYMBOL)
  1033. DWORD Address; // virtual address including dll base address
  1034. DWORD Size; // estimated size of symbol, can be zero
  1035. DWORD Flags; // info about the symbols, see the SYMF defines
  1036. DWORD MaxNameLength; // maximum size of symbol name in 'Name'
  1037. CHAR Name[1]; // symbol name (null terminated string)
  1038. } IMAGEHLP_SYMBOL, *PIMAGEHLP_SYMBOL;
  1039. typedef struct _IMAGEHLP_SYMBOL_PACKAGE {
  1040. IMAGEHLP_SYMBOL sym;
  1041. CHAR name[MAX_SYM_NAME + 1];
  1042. } IMAGEHLP_SYMBOL_PACKAGE, *PIMAGEHLP_SYMBOL_PACKAGE;
  1043. typedef struct _IMAGEHLP_SYMBOLW {
  1044. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_SYMBOLW)
  1045. DWORD Address; // virtual address including dll base address
  1046. DWORD Size; // estimated size of symbol, can be zero
  1047. DWORD Flags; // info about the symbols, see the SYMF defines
  1048. DWORD MaxNameLength; // maximum size of symbol name in 'Name'
  1049. WCHAR Name[1]; // symbol name (null terminated string)
  1050. } IMAGEHLP_SYMBOLW, *PIMAGEHLP_SYMBOLW;
  1051. typedef struct _IMAGEHLP_SYMBOLW_PACKAGE {
  1052. IMAGEHLP_SYMBOLW sym;
  1053. WCHAR name[MAX_SYM_NAME + 1];
  1054. } IMAGEHLP_SYMBOLW_PACKAGE, *PIMAGEHLP_SYMBOLW_PACKAGE;
  1055. #endif
  1056. //
  1057. // module data structure
  1058. //
  1059. typedef struct _IMAGEHLP_MODULE64 {
  1060. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE64)
  1061. DWORD64 BaseOfImage; // base load address of module
  1062. DWORD ImageSize; // virtual size of the loaded module
  1063. DWORD TimeDateStamp; // date/time stamp from pe header
  1064. DWORD CheckSum; // checksum from the pe header
  1065. DWORD NumSyms; // number of symbols in the symbol table
  1066. SYM_TYPE SymType; // type of symbols loaded
  1067. CHAR ModuleName[32]; // module name
  1068. CHAR ImageName[256]; // image name
  1069. CHAR LoadedImageName[256]; // symbol file name
  1070. // new elements: 07-Jun-2002
  1071. CHAR LoadedPdbName[256]; // pdb file name
  1072. DWORD CVSig; // Signature of the CV record in the debug directories
  1073. CHAR CVData[MAX_PATH * 3]; // Contents of the CV record
  1074. DWORD PdbSig; // Signature of PDB
  1075. GUID PdbSig70; // Signature of PDB (VC 7 and up)
  1076. DWORD PdbAge; // DBI age of pdb
  1077. BOOL PdbUnmatched; // loaded an unmatched pdb
  1078. BOOL DbgUnmatched; // loaded an unmatched dbg
  1079. BOOL LineNumbers; // we have line number information
  1080. BOOL GlobalSymbols; // we have internal symbol information
  1081. BOOL TypeInfo; // we have type information
  1082. // new elements: 17-Dec-2003
  1083. BOOL SourceIndexed; // pdb supports source server
  1084. BOOL Publics; // contains public symbols
  1085. // new element: 15-Jul-2009
  1086. DWORD MachineType; // IMAGE_FILE_MACHINE_XXX from ntimage.h and winnt.h
  1087. DWORD Reserved; // Padding - don't remove.
  1088. } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
  1089. typedef struct _IMAGEHLP_MODULEW64 {
  1090. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE64)
  1091. DWORD64 BaseOfImage; // base load address of module
  1092. DWORD ImageSize; // virtual size of the loaded module
  1093. DWORD TimeDateStamp; // date/time stamp from pe header
  1094. DWORD CheckSum; // checksum from the pe header
  1095. DWORD NumSyms; // number of symbols in the symbol table
  1096. SYM_TYPE SymType; // type of symbols loaded
  1097. WCHAR ModuleName[32]; // module name
  1098. WCHAR ImageName[256]; // image name
  1099. // new elements: 07-Jun-2002
  1100. WCHAR LoadedImageName[256]; // symbol file name
  1101. WCHAR LoadedPdbName[256]; // pdb file name
  1102. DWORD CVSig; // Signature of the CV record in the debug directories
  1103. WCHAR CVData[MAX_PATH * 3]; // Contents of the CV record
  1104. DWORD PdbSig; // Signature of PDB
  1105. GUID PdbSig70; // Signature of PDB (VC 7 and up)
  1106. DWORD PdbAge; // DBI age of pdb
  1107. BOOL PdbUnmatched; // loaded an unmatched pdb
  1108. BOOL DbgUnmatched; // loaded an unmatched dbg
  1109. BOOL LineNumbers; // we have line number information
  1110. BOOL GlobalSymbols; // we have internal symbol information
  1111. BOOL TypeInfo; // we have type information
  1112. // new elements: 17-Dec-2003
  1113. BOOL SourceIndexed; // pdb supports source server
  1114. BOOL Publics; // contains public symbols
  1115. // new element: 15-Jul-2009
  1116. DWORD MachineType; // IMAGE_FILE_MACHINE_XXX from ntimage.h and winnt.h
  1117. DWORD Reserved; // Padding - don't remove.
  1118. } IMAGEHLP_MODULEW64, *PIMAGEHLP_MODULEW64;
  1119. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1120. #define IMAGEHLP_MODULE IMAGEHLP_MODULE64
  1121. #define PIMAGEHLP_MODULE PIMAGEHLP_MODULE64
  1122. #define IMAGEHLP_MODULEW IMAGEHLP_MODULEW64
  1123. #define PIMAGEHLP_MODULEW PIMAGEHLP_MODULEW64
  1124. #else
  1125. typedef struct _IMAGEHLP_MODULE {
  1126. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE)
  1127. DWORD BaseOfImage; // base load address of module
  1128. DWORD ImageSize; // virtual size of the loaded module
  1129. DWORD TimeDateStamp; // date/time stamp from pe header
  1130. DWORD CheckSum; // checksum from the pe header
  1131. DWORD NumSyms; // number of symbols in the symbol table
  1132. SYM_TYPE SymType; // type of symbols loaded
  1133. CHAR ModuleName[32]; // module name
  1134. CHAR ImageName[256]; // image name
  1135. CHAR LoadedImageName[256]; // symbol file name
  1136. } IMAGEHLP_MODULE, *PIMAGEHLP_MODULE;
  1137. typedef struct _IMAGEHLP_MODULEW {
  1138. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE)
  1139. DWORD BaseOfImage; // base load address of module
  1140. DWORD ImageSize; // virtual size of the loaded module
  1141. DWORD TimeDateStamp; // date/time stamp from pe header
  1142. DWORD CheckSum; // checksum from the pe header
  1143. DWORD NumSyms; // number of symbols in the symbol table
  1144. SYM_TYPE SymType; // type of symbols loaded
  1145. WCHAR ModuleName[32]; // module name
  1146. WCHAR ImageName[256]; // image name
  1147. WCHAR LoadedImageName[256]; // symbol file name
  1148. } IMAGEHLP_MODULEW, *PIMAGEHLP_MODULEW;
  1149. #endif
  1150. //
  1151. // source file line data structure
  1152. //
  1153. typedef struct _IMAGEHLP_LINE64 {
  1154. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_LINE64)
  1155. PVOID Key; // internal
  1156. DWORD LineNumber; // line number in file
  1157. PCHAR FileName; // full filename
  1158. DWORD64 Address; // first instruction of line
  1159. } IMAGEHLP_LINE64, *PIMAGEHLP_LINE64;
  1160. typedef struct _IMAGEHLP_LINEW64 {
  1161. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_LINE64)
  1162. PVOID Key; // internal
  1163. DWORD LineNumber; // line number in file
  1164. PWSTR FileName; // full filename
  1165. DWORD64 Address; // first instruction of line
  1166. } IMAGEHLP_LINEW64, *PIMAGEHLP_LINEW64;
  1167. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1168. #define IMAGEHLP_LINE IMAGEHLP_LINE64
  1169. #define PIMAGEHLP_LINE PIMAGEHLP_LINE64
  1170. #else
  1171. typedef struct _IMAGEHLP_LINE {
  1172. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_LINE)
  1173. PVOID Key; // internal
  1174. DWORD LineNumber; // line number in file
  1175. PCHAR FileName; // full filename
  1176. DWORD Address; // first instruction of line
  1177. } IMAGEHLP_LINE, *PIMAGEHLP_LINE;
  1178. typedef struct _IMAGEHLP_LINEW {
  1179. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_LINE64)
  1180. PVOID Key; // internal
  1181. DWORD LineNumber; // line number in file
  1182. PCHAR FileName; // full filename
  1183. DWORD64 Address; // first instruction of line
  1184. } IMAGEHLP_LINEW, *PIMAGEHLP_LINEW;
  1185. #endif
  1186. //
  1187. // source file structure
  1188. //
  1189. typedef struct _SOURCEFILE {
  1190. DWORD64 ModBase; // base address of loaded module
  1191. PCHAR FileName; // full filename of source
  1192. } SOURCEFILE, *PSOURCEFILE;
  1193. typedef struct _SOURCEFILEW {
  1194. DWORD64 ModBase; // base address of loaded module
  1195. PWSTR FileName; // full filename of source
  1196. } SOURCEFILEW, *PSOURCEFILEW;
  1197. //
  1198. // data structures used for registered symbol callbacks
  1199. //
  1200. #define CBA_DEFERRED_SYMBOL_LOAD_START 0x00000001
  1201. #define CBA_DEFERRED_SYMBOL_LOAD_COMPLETE 0x00000002
  1202. #define CBA_DEFERRED_SYMBOL_LOAD_FAILURE 0x00000003
  1203. #define CBA_SYMBOLS_UNLOADED 0x00000004
  1204. #define CBA_DUPLICATE_SYMBOL 0x00000005
  1205. #define CBA_READ_MEMORY 0x00000006
  1206. #define CBA_DEFERRED_SYMBOL_LOAD_CANCEL 0x00000007
  1207. #define CBA_SET_OPTIONS 0x00000008
  1208. #define CBA_EVENT 0x00000010
  1209. #define CBA_DEFERRED_SYMBOL_LOAD_PARTIAL 0x00000020
  1210. #define CBA_DEBUG_INFO 0x10000000
  1211. #define CBA_SRCSRV_INFO 0x20000000
  1212. #define CBA_SRCSRV_EVENT 0x40000000
  1213. typedef struct _IMAGEHLP_CBA_READ_MEMORY {
  1214. DWORD64 addr; // address to read from
  1215. PVOID buf; // buffer to read to
  1216. DWORD bytes; // amount of bytes to read
  1217. DWORD *bytesread; // pointer to store amount of bytes read
  1218. } IMAGEHLP_CBA_READ_MEMORY, *PIMAGEHLP_CBA_READ_MEMORY;
  1219. enum {
  1220. sevInfo = 0,
  1221. sevProblem,
  1222. sevAttn,
  1223. sevFatal,
  1224. sevMax // unused
  1225. };
  1226. #define EVENT_SRCSPEW_START 100
  1227. #define EVENT_SRCSPEW 100
  1228. #define EVENT_SRCSPEW_END 199
  1229. typedef struct _IMAGEHLP_CBA_EVENT {
  1230. DWORD severity; // values from sevInfo to sevFatal
  1231. DWORD code; // numerical code IDs the error
  1232. PCHAR desc; // may contain a text description of the error
  1233. PVOID object; // value dependant upon the error code
  1234. } IMAGEHLP_CBA_EVENT, *PIMAGEHLP_CBA_EVENT;
  1235. typedef struct _IMAGEHLP_CBA_EVENTW {
  1236. DWORD severity; // values from sevInfo to sevFatal
  1237. DWORD code; // numerical code IDs the error
  1238. PCWSTR desc; // may contain a text description of the error
  1239. PVOID object; // value dependant upon the error code
  1240. } IMAGEHLP_CBA_EVENTW, *PIMAGEHLP_CBA_EVENTW;
  1241. typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD64 {
  1242. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOAD64)
  1243. DWORD64 BaseOfImage; // base load address of module
  1244. DWORD CheckSum; // checksum from the pe header
  1245. DWORD TimeDateStamp; // date/time stamp from pe header
  1246. CHAR FileName[MAX_PATH]; // symbols file or image name
  1247. BOOLEAN Reparse; // load failure reparse
  1248. HANDLE hFile; // file handle, if passed
  1249. DWORD Flags; //
  1250. } IMAGEHLP_DEFERRED_SYMBOL_LOAD64, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD64;
  1251. typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOADW64 {
  1252. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOADW64)
  1253. DWORD64 BaseOfImage; // base load address of module
  1254. DWORD CheckSum; // checksum from the pe header
  1255. DWORD TimeDateStamp; // date/time stamp from pe header
  1256. WCHAR FileName[MAX_PATH + 1]; // symbols file or image name
  1257. BOOLEAN Reparse; // load failure reparse
  1258. HANDLE hFile; // file handle, if passed
  1259. DWORD Flags; //
  1260. } IMAGEHLP_DEFERRED_SYMBOL_LOADW64, *PIMAGEHLP_DEFERRED_SYMBOL_LOADW64;
  1261. #define DSLFLAG_MISMATCHED_PDB 0x1
  1262. #define DSLFLAG_MISMATCHED_DBG 0x2
  1263. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1264. #define IMAGEHLP_DEFERRED_SYMBOL_LOAD IMAGEHLP_DEFERRED_SYMBOL_LOAD64
  1265. #define PIMAGEHLP_DEFERRED_SYMBOL_LOAD PIMAGEHLP_DEFERRED_SYMBOL_LOAD64
  1266. #else
  1267. typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD {
  1268. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOAD)
  1269. DWORD BaseOfImage; // base load address of module
  1270. DWORD CheckSum; // checksum from the pe header
  1271. DWORD TimeDateStamp; // date/time stamp from pe header
  1272. CHAR FileName[MAX_PATH]; // symbols file or image name
  1273. BOOLEAN Reparse; // load failure reparse
  1274. HANDLE hFile; // file handle, if passed
  1275. } IMAGEHLP_DEFERRED_SYMBOL_LOAD, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD;
  1276. #endif
  1277. typedef struct _IMAGEHLP_DUPLICATE_SYMBOL64 {
  1278. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_DUPLICATE_SYMBOL64)
  1279. DWORD NumberOfDups; // number of duplicates in the Symbol array
  1280. PIMAGEHLP_SYMBOL64 Symbol; // array of duplicate symbols
  1281. DWORD SelectedSymbol; // symbol selected (-1 to start)
  1282. } IMAGEHLP_DUPLICATE_SYMBOL64, *PIMAGEHLP_DUPLICATE_SYMBOL64;
  1283. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1284. #define IMAGEHLP_DUPLICATE_SYMBOL IMAGEHLP_DUPLICATE_SYMBOL64
  1285. #define PIMAGEHLP_DUPLICATE_SYMBOL PIMAGEHLP_DUPLICATE_SYMBOL64
  1286. #else
  1287. typedef struct _IMAGEHLP_DUPLICATE_SYMBOL {
  1288. DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_DUPLICATE_SYMBOL)
  1289. DWORD NumberOfDups; // number of duplicates in the Symbol array
  1290. PIMAGEHLP_SYMBOL Symbol; // array of duplicate symbols
  1291. DWORD SelectedSymbol; // symbol selected (-1 to start)
  1292. } IMAGEHLP_DUPLICATE_SYMBOL, *PIMAGEHLP_DUPLICATE_SYMBOL;
  1293. #endif
  1294. // If dbghelp ever needs to display graphical UI, it will use this as the parent window.
  1295. BOOL
  1296. IMAGEAPI
  1297. SymSetParentWindow(
  1298. __in HWND hwnd
  1299. );
  1300. PCHAR
  1301. IMAGEAPI
  1302. SymSetHomeDirectory(
  1303. __in_opt HANDLE hProcess,
  1304. __in_opt PCSTR dir
  1305. );
  1306. PWSTR
  1307. IMAGEAPI
  1308. SymSetHomeDirectoryW(
  1309. __in_opt HANDLE hProcess,
  1310. __in_opt PCWSTR dir
  1311. );
  1312. PCHAR
  1313. IMAGEAPI
  1314. SymGetHomeDirectory(
  1315. __in DWORD type,
  1316. __out_ecount(size) PSTR dir,
  1317. __in size_t size
  1318. );
  1319. PWSTR
  1320. IMAGEAPI
  1321. SymGetHomeDirectoryW(
  1322. __in DWORD type,
  1323. __out_ecount(size) PWSTR dir,
  1324. __in size_t size
  1325. );
  1326. typedef enum {
  1327. hdBase = 0, // root directory for dbghelp
  1328. hdSym, // where symbols are stored
  1329. hdSrc, // where source is stored
  1330. hdMax // end marker
  1331. };
  1332. typedef struct _OMAP {
  1333. ULONG rva;
  1334. ULONG rvaTo;
  1335. } OMAP, *POMAP;
  1336. BOOL
  1337. IMAGEAPI
  1338. SymGetOmaps(
  1339. __in HANDLE hProcess,
  1340. __in DWORD64 BaseOfDll,
  1341. __out POMAP *OmapTo,
  1342. __out PDWORD64 cOmapTo,
  1343. __out POMAP *OmapFrom,
  1344. __out PDWORD64 cOmapFrom
  1345. );
  1346. //
  1347. // options that are set/returned by SymSetOptions() & SymGetOptions()
  1348. // these are used as a mask
  1349. //
  1350. #define SYMOPT_CASE_INSENSITIVE 0x00000001
  1351. #define SYMOPT_UNDNAME 0x00000002
  1352. #define SYMOPT_DEFERRED_LOADS 0x00000004
  1353. #define SYMOPT_NO_CPP 0x00000008
  1354. #define SYMOPT_LOAD_LINES 0x00000010
  1355. #define SYMOPT_OMAP_FIND_NEAREST 0x00000020
  1356. #define SYMOPT_LOAD_ANYTHING 0x00000040
  1357. #define SYMOPT_IGNORE_CVREC 0x00000080
  1358. #define SYMOPT_NO_UNQUALIFIED_LOADS 0x00000100
  1359. #define SYMOPT_FAIL_CRITICAL_ERRORS 0x00000200
  1360. #define SYMOPT_EXACT_SYMBOLS 0x00000400
  1361. #define SYMOPT_ALLOW_ABSOLUTE_SYMBOLS 0x00000800
  1362. #define SYMOPT_IGNORE_NT_SYMPATH 0x00001000
  1363. #define SYMOPT_INCLUDE_32BIT_MODULES 0x00002000
  1364. #define SYMOPT_PUBLICS_ONLY 0x00004000
  1365. #define SYMOPT_NO_PUBLICS 0x00008000
  1366. #define SYMOPT_AUTO_PUBLICS 0x00010000
  1367. #define SYMOPT_NO_IMAGE_SEARCH 0x00020000
  1368. #define SYMOPT_SECURE 0x00040000
  1369. #define SYMOPT_NO_PROMPTS 0x00080000
  1370. #define SYMOPT_OVERWRITE 0x00100000
  1371. #define SYMOPT_IGNORE_IMAGEDIR 0x00200000
  1372. #define SYMOPT_FLAT_DIRECTORY 0x00400000
  1373. #define SYMOPT_FAVOR_COMPRESSED 0x00800000
  1374. #define SYMOPT_ALLOW_ZERO_ADDRESS 0x01000000
  1375. #define SYMOPT_DISABLE_SYMSRV_AUTODETECT 0x02000000
  1376. #define SYMOPT_DEBUG 0x80000000
  1377. DWORD
  1378. IMAGEAPI
  1379. SymSetOptions(
  1380. __in DWORD SymOptions
  1381. );
  1382. DWORD
  1383. IMAGEAPI
  1384. SymGetOptions(
  1385. VOID
  1386. );
  1387. BOOL
  1388. IMAGEAPI
  1389. SymCleanup(
  1390. __in HANDLE hProcess
  1391. );
  1392. BOOL
  1393. IMAGEAPI
  1394. SymMatchString(
  1395. __in PCSTR string,
  1396. __in PCSTR expression,
  1397. __in BOOL fCase
  1398. );
  1399. BOOL
  1400. IMAGEAPI
  1401. SymMatchStringA(
  1402. __in PCSTR string,
  1403. __in PCSTR expression,
  1404. __in BOOL fCase
  1405. );
  1406. BOOL
  1407. IMAGEAPI
  1408. SymMatchStringW(
  1409. __in PCWSTR string,
  1410. __in PCWSTR expression,
  1411. __in BOOL fCase
  1412. );
  1413. typedef BOOL
  1414. (CALLBACK *PSYM_ENUMSOURCEFILES_CALLBACK)(
  1415. __in PSOURCEFILE pSourceFile,
  1416. __in_opt PVOID UserContext
  1417. );
  1418. // for backwards compatibility - don't use this
  1419. #define PSYM_ENUMSOURCFILES_CALLBACK PSYM_ENUMSOURCEFILES_CALLBACK
  1420. BOOL
  1421. IMAGEAPI
  1422. SymEnumSourceFiles(
  1423. __in HANDLE hProcess,
  1424. __in ULONG64 ModBase,
  1425. __in_opt PCSTR Mask,
  1426. __in PSYM_ENUMSOURCEFILES_CALLBACK cbSrcFiles,
  1427. __in_opt PVOID UserContext
  1428. );
  1429. typedef BOOL
  1430. (CALLBACK *PSYM_ENUMSOURCEFILES_CALLBACKW)(
  1431. __in PSOURCEFILEW pSourceFile,
  1432. __in_opt PVOID UserContext
  1433. );
  1434. BOOL
  1435. IMAGEAPI
  1436. SymEnumSourceFilesW(
  1437. __in HANDLE hProcess,
  1438. __in ULONG64 ModBase,
  1439. __in_opt PCWSTR Mask,
  1440. __in PSYM_ENUMSOURCEFILES_CALLBACKW cbSrcFiles,
  1441. __in_opt PVOID UserContext
  1442. );
  1443. BOOL
  1444. IMAGEAPI
  1445. SymEnumerateModules64(
  1446. __in HANDLE hProcess,
  1447. __in PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback,
  1448. __in_opt PVOID UserContext
  1449. );
  1450. BOOL
  1451. IMAGEAPI
  1452. SymEnumerateModulesW64(
  1453. __in HANDLE hProcess,
  1454. __in PSYM_ENUMMODULES_CALLBACKW64 EnumModulesCallback,
  1455. __in_opt PVOID UserContext
  1456. );
  1457. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1458. #define SymEnumerateModules SymEnumerateModules64
  1459. #else
  1460. BOOL
  1461. IMAGEAPI
  1462. SymEnumerateModules(
  1463. __in HANDLE hProcess,
  1464. __in PSYM_ENUMMODULES_CALLBACK EnumModulesCallback,
  1465. __in_opt PVOID UserContext
  1466. );
  1467. #endif
  1468. BOOL
  1469. IMAGEAPI
  1470. EnumerateLoadedModulesEx(
  1471. __in HANDLE hProcess,
  1472. __in PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback,
  1473. __in_opt PVOID UserContext
  1474. );
  1475. BOOL
  1476. IMAGEAPI
  1477. EnumerateLoadedModulesExW(
  1478. __in HANDLE hProcess,
  1479. __in PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback,
  1480. __in_opt PVOID UserContext
  1481. );
  1482. BOOL
  1483. IMAGEAPI
  1484. EnumerateLoadedModules64(
  1485. __in HANDLE hProcess,
  1486. __in PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback,
  1487. __in_opt PVOID UserContext
  1488. );
  1489. BOOL
  1490. IMAGEAPI
  1491. EnumerateLoadedModulesW64(
  1492. __in HANDLE hProcess,
  1493. __in PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback,
  1494. __in_opt PVOID UserContext
  1495. );
  1496. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1497. #define EnumerateLoadedModules EnumerateLoadedModules64
  1498. #else
  1499. BOOL
  1500. IMAGEAPI
  1501. EnumerateLoadedModules(
  1502. __in HANDLE hProcess,
  1503. __in PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback,
  1504. __in_opt PVOID UserContext
  1505. );
  1506. #endif
  1507. PVOID
  1508. IMAGEAPI
  1509. SymFunctionTableAccess64(
  1510. __in HANDLE hProcess,
  1511. __in DWORD64 AddrBase
  1512. );
  1513. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1514. #define SymFunctionTableAccess SymFunctionTableAccess64
  1515. #else
  1516. PVOID
  1517. IMAGEAPI
  1518. SymFunctionTableAccess(
  1519. __in HANDLE hProcess,
  1520. __in DWORD AddrBase
  1521. );
  1522. #endif
  1523. BOOL
  1524. IMAGEAPI
  1525. SymGetUnwindInfo(
  1526. __in HANDLE hProcess,
  1527. __in DWORD64 Address,
  1528. __out_bcount_opt(*Size) PVOID Buffer,
  1529. __inout PULONG Size
  1530. );
  1531. BOOL
  1532. IMAGEAPI
  1533. SymGetModuleInfo64(
  1534. __in HANDLE hProcess,
  1535. __in DWORD64 qwAddr,
  1536. __out PIMAGEHLP_MODULE64 ModuleInfo
  1537. );
  1538. BOOL
  1539. IMAGEAPI
  1540. SymGetModuleInfoW64(
  1541. __in HANDLE hProcess,
  1542. __in DWORD64 qwAddr,
  1543. __out PIMAGEHLP_MODULEW64 ModuleInfo
  1544. );
  1545. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1546. #define SymGetModuleInfo SymGetModuleInfo64
  1547. #define SymGetModuleInfoW SymGetModuleInfoW64
  1548. #else
  1549. BOOL
  1550. IMAGEAPI
  1551. SymGetModuleInfo(
  1552. __in HANDLE hProcess,
  1553. __in DWORD dwAddr,
  1554. __out PIMAGEHLP_MODULE ModuleInfo
  1555. );
  1556. BOOL
  1557. IMAGEAPI
  1558. SymGetModuleInfoW(
  1559. __in HANDLE hProcess,
  1560. __in DWORD dwAddr,
  1561. __out PIMAGEHLP_MODULEW ModuleInfo
  1562. );
  1563. #endif
  1564. DWORD64
  1565. IMAGEAPI
  1566. SymGetModuleBase64(
  1567. __in HANDLE hProcess,
  1568. __in DWORD64 qwAddr
  1569. );
  1570. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1571. #define SymGetModuleBase SymGetModuleBase64
  1572. #else
  1573. DWORD
  1574. IMAGEAPI
  1575. SymGetModuleBase(
  1576. __in HANDLE hProcess,
  1577. __in DWORD dwAddr
  1578. );
  1579. #endif
  1580. typedef struct _SRCCODEINFO {
  1581. DWORD SizeOfStruct; // set to sizeof(SRCCODEINFO)
  1582. PVOID Key; // not used
  1583. DWORD64 ModBase; // base address of module this applies to
  1584. CHAR Obj[MAX_PATH + 1]; // the object file within the module
  1585. CHAR FileName[MAX_PATH + 1]; // full filename
  1586. DWORD LineNumber; // line number in file
  1587. DWORD64 Address; // first instruction of line
  1588. } SRCCODEINFO, *PSRCCODEINFO;
  1589. typedef struct _SRCCODEINFOW {
  1590. DWORD SizeOfStruct; // set to sizeof(SRCCODEINFO)
  1591. PVOID Key; // not used
  1592. DWORD64 ModBase; // base address of module this applies to
  1593. WCHAR Obj[MAX_PATH + 1]; // the object file within the module
  1594. WCHAR FileName[MAX_PATH + 1]; // full filename
  1595. DWORD LineNumber; // line number in file
  1596. DWORD64 Address; // first instruction of line
  1597. } SRCCODEINFOW, *PSRCCODEINFOW;
  1598. typedef BOOL
  1599. (CALLBACK *PSYM_ENUMLINES_CALLBACK)(
  1600. __in PSRCCODEINFO LineInfo,
  1601. __in_opt PVOID UserContext
  1602. );
  1603. BOOL
  1604. IMAGEAPI
  1605. SymEnumLines(
  1606. __in HANDLE hProcess,
  1607. __in ULONG64 Base,
  1608. __in_opt PCSTR Obj,
  1609. __in_opt PCSTR File,
  1610. __in PSYM_ENUMLINES_CALLBACK EnumLinesCallback,
  1611. __in_opt PVOID UserContext
  1612. );
  1613. typedef BOOL
  1614. (CALLBACK *PSYM_ENUMLINES_CALLBACKW)(
  1615. __in PSRCCODEINFOW LineInfo,
  1616. __in_opt PVOID UserContext
  1617. );
  1618. BOOL
  1619. IMAGEAPI
  1620. SymEnumLinesW(
  1621. __in HANDLE hProcess,
  1622. __in ULONG64 Base,
  1623. __in_opt PCWSTR Obj,
  1624. __in_opt PCWSTR File,
  1625. __in PSYM_ENUMLINES_CALLBACKW EnumLinesCallback,
  1626. __in_opt PVOID UserContext
  1627. );
  1628. BOOL
  1629. IMAGEAPI
  1630. SymGetLineFromAddr64(
  1631. __in HANDLE hProcess,
  1632. __in DWORD64 qwAddr,
  1633. __out PDWORD pdwDisplacement,
  1634. __out PIMAGEHLP_LINE64 Line64
  1635. );
  1636. BOOL
  1637. IMAGEAPI
  1638. SymGetLineFromAddrW64(
  1639. __in HANDLE hProcess,
  1640. __in DWORD64 dwAddr,
  1641. __out PDWORD pdwDisplacement,
  1642. __out PIMAGEHLP_LINEW64 Line
  1643. );
  1644. BOOL
  1645. IMAGEAPI
  1646. SymEnumSourceLines(
  1647. __in HANDLE hProcess,
  1648. __in ULONG64 Base,
  1649. __in_opt PCSTR Obj,
  1650. __in_opt PCSTR File,
  1651. __in_opt DWORD Line,
  1652. __in DWORD Flags,
  1653. __in PSYM_ENUMLINES_CALLBACK EnumLinesCallback,
  1654. __in_opt PVOID UserContext
  1655. );
  1656. BOOL
  1657. IMAGEAPI
  1658. SymEnumSourceLinesW(
  1659. __in HANDLE hProcess,
  1660. __in ULONG64 Base,
  1661. __in_opt PCWSTR Obj,
  1662. __in_opt PCWSTR File,
  1663. __in_opt DWORD Line,
  1664. __in DWORD Flags,
  1665. __in PSYM_ENUMLINES_CALLBACKW EnumLinesCallback,
  1666. __in_opt PVOID UserContext
  1667. );
  1668. // flags for SymEnumSourceLines
  1669. #define ESLFLAG_FULLPATH 0x1
  1670. #define ESLFLAG_NEAREST 0x2
  1671. #define ESLFLAG_PREV 0x4
  1672. #define ESLFLAG_NEXT 0x8
  1673. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1674. #define SymGetLineFromAddr SymGetLineFromAddr64
  1675. #define SymGetLineFromAddrW SymGetLineFromAddrW64
  1676. #else
  1677. BOOL
  1678. IMAGEAPI
  1679. SymGetLineFromAddr(
  1680. __in HANDLE hProcess,
  1681. __in DWORD dwAddr,
  1682. __out PDWORD pdwDisplacement,
  1683. __out PIMAGEHLP_LINE Line
  1684. );
  1685. BOOL
  1686. IMAGEAPI
  1687. SymGetLineFromAddrW(
  1688. __in HANDLE hProcess,
  1689. __in DWORD dwAddr,
  1690. __out PDWORD pdwDisplacement,
  1691. __out PIMAGEHLP_LINEW Line
  1692. );
  1693. #endif
  1694. BOOL
  1695. IMAGEAPI
  1696. SymGetLineFromName64(
  1697. __in HANDLE hProcess,
  1698. __in_opt PCSTR ModuleName,
  1699. __in_opt PCSTR FileName,
  1700. __in DWORD dwLineNumber,
  1701. __out PLONG plDisplacement,
  1702. __inout PIMAGEHLP_LINE64 Line
  1703. );
  1704. BOOL
  1705. IMAGEAPI
  1706. SymGetLineFromNameW64(
  1707. __in HANDLE hProcess,
  1708. __in_opt PCWSTR ModuleName,
  1709. __in_opt PCWSTR FileName,
  1710. __in DWORD dwLineNumber,
  1711. __out PLONG plDisplacement,
  1712. __inout PIMAGEHLP_LINEW64 Line
  1713. );
  1714. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1715. #define SymGetLineFromName SymGetLineFromName64
  1716. #else
  1717. BOOL
  1718. IMAGEAPI
  1719. SymGetLineFromName(
  1720. __in HANDLE hProcess,
  1721. __in_opt PCSTR ModuleName,
  1722. __in_opt PCSTR FileName,
  1723. __in DWORD dwLineNumber,
  1724. __out PLONG plDisplacement,
  1725. __inout PIMAGEHLP_LINE Line
  1726. );
  1727. #endif
  1728. BOOL
  1729. IMAGEAPI
  1730. SymGetLineNext64(
  1731. __in HANDLE hProcess,
  1732. __inout PIMAGEHLP_LINE64 Line
  1733. );
  1734. BOOL
  1735. IMAGEAPI
  1736. SymGetLineNextW64(
  1737. __in HANDLE hProcess,
  1738. __inout PIMAGEHLP_LINEW64 Line
  1739. );
  1740. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1741. #define SymGetLineNext SymGetLineNext64
  1742. #else
  1743. BOOL
  1744. IMAGEAPI
  1745. SymGetLineNext(
  1746. __in HANDLE hProcess,
  1747. __inout PIMAGEHLP_LINE Line
  1748. );
  1749. BOOL
  1750. IMAGEAPI
  1751. SymGetLineNextW(
  1752. __in HANDLE hProcess,
  1753. __inout PIMAGEHLP_LINEW Line
  1754. );
  1755. #endif
  1756. BOOL
  1757. IMAGEAPI
  1758. SymGetLinePrev64(
  1759. __in HANDLE hProcess,
  1760. __inout PIMAGEHLP_LINE64 Line
  1761. );
  1762. BOOL
  1763. IMAGEAPI
  1764. SymGetLinePrevW64(
  1765. __in HANDLE hProcess,
  1766. __inout PIMAGEHLP_LINEW64 Line
  1767. );
  1768. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1769. #define SymGetLinePrev SymGetLinePrev64
  1770. #else
  1771. BOOL
  1772. IMAGEAPI
  1773. SymGetLinePrev(
  1774. __in HANDLE hProcess,
  1775. __inout PIMAGEHLP_LINE Line
  1776. );
  1777. BOOL
  1778. IMAGEAPI
  1779. SymGetLinePrevW(
  1780. __in HANDLE hProcess,
  1781. __inout PIMAGEHLP_LINEW Line
  1782. );
  1783. #endif
  1784. ULONG
  1785. IMAGEAPI
  1786. SymGetFileLineOffsets64(
  1787. __in HANDLE hProcess,
  1788. __in_opt PCSTR ModuleName,
  1789. __in PCSTR FileName,
  1790. __out_ecount(BufferLines) PDWORD64 Buffer,
  1791. __in ULONG BufferLines
  1792. );
  1793. BOOL
  1794. IMAGEAPI
  1795. SymMatchFileName(
  1796. __in PCSTR FileName,
  1797. __in PCSTR Match,
  1798. __deref_opt_out PSTR *FileNameStop,
  1799. __deref_opt_out PSTR *MatchStop
  1800. );
  1801. BOOL
  1802. IMAGEAPI
  1803. SymMatchFileNameW(
  1804. __in PCWSTR FileName,
  1805. __in PCWSTR Match,
  1806. __deref_opt_out PWSTR *FileNameStop,
  1807. __deref_opt_out PWSTR *MatchStop
  1808. );
  1809. BOOL
  1810. IMAGEAPI
  1811. SymGetSourceFile(
  1812. __in HANDLE hProcess,
  1813. __in ULONG64 Base,
  1814. __in_opt PCSTR Params,
  1815. __in PCSTR FileSpec,
  1816. __out_ecount(Size) PSTR FilePath,
  1817. __in DWORD Size
  1818. );
  1819. BOOL
  1820. IMAGEAPI
  1821. SymGetSourceFileW(
  1822. __in HANDLE hProcess,
  1823. __in ULONG64 Base,
  1824. __in_opt PCWSTR Params,
  1825. __in PCWSTR FileSpec,
  1826. __out_ecount(Size) PWSTR FilePath,
  1827. __in DWORD Size
  1828. );
  1829. BOOL
  1830. IMAGEAPI
  1831. SymGetSourceFileToken(
  1832. __in HANDLE hProcess,
  1833. __in ULONG64 Base,
  1834. __in PCSTR FileSpec,
  1835. __deref_out PVOID *Token,
  1836. __out DWORD *Size
  1837. );
  1838. BOOL
  1839. IMAGEAPI
  1840. SymGetSourceFileTokenW(
  1841. __in HANDLE hProcess,
  1842. __in ULONG64 Base,
  1843. __in PCWSTR FileSpec,
  1844. __deref_out PVOID *Token,
  1845. __out DWORD *Size
  1846. );
  1847. BOOL
  1848. IMAGEAPI
  1849. SymGetSourceFileFromToken(
  1850. __in HANDLE hProcess,
  1851. __in PVOID Token,
  1852. __in_opt PCSTR Params,
  1853. __out_ecount(Size) PSTR FilePath,
  1854. __in DWORD Size
  1855. );
  1856. BOOL
  1857. IMAGEAPI
  1858. SymGetSourceFileFromTokenW(
  1859. __in HANDLE hProcess,
  1860. __in PVOID Token,
  1861. __in_opt PCWSTR Params,
  1862. __out_ecount(Size) PWSTR FilePath,
  1863. __in DWORD Size
  1864. );
  1865. BOOL
  1866. IMAGEAPI
  1867. SymGetSourceVarFromToken(
  1868. __in HANDLE hProcess,
  1869. __in PVOID Token,
  1870. __in_opt PCSTR Params,
  1871. __in PCSTR VarName,
  1872. __out_ecount(Size) PSTR Value,
  1873. __in DWORD Size
  1874. );
  1875. BOOL
  1876. IMAGEAPI
  1877. SymGetSourceVarFromTokenW(
  1878. __in HANDLE hProcess,
  1879. __in PVOID Token,
  1880. __in_opt PCWSTR Params,
  1881. __in PCWSTR VarName,
  1882. __out_ecount(Size) PWSTR Value,
  1883. __in DWORD Size
  1884. );
  1885. typedef BOOL (CALLBACK *PENUMSOURCEFILETOKENSCALLBACK)(__in PVOID token, __in size_t size);
  1886. BOOL
  1887. IMAGEAPI
  1888. SymEnumSourceFileTokens(
  1889. __in HANDLE hProcess,
  1890. __in ULONG64 Base,
  1891. __in PENUMSOURCEFILETOKENSCALLBACK Callback
  1892. );
  1893. BOOL
  1894. IMAGEAPI
  1895. SymInitialize(
  1896. __in HANDLE hProcess,
  1897. __in_opt PCSTR UserSearchPath,
  1898. __in BOOL fInvadeProcess
  1899. );
  1900. BOOL
  1901. IMAGEAPI
  1902. SymInitializeW(
  1903. __in HANDLE hProcess,
  1904. __in_opt PCWSTR UserSearchPath,
  1905. __in BOOL fInvadeProcess
  1906. );
  1907. BOOL
  1908. IMAGEAPI
  1909. SymGetSearchPath(
  1910. __in HANDLE hProcess,
  1911. __out_ecount(SearchPathLength) PSTR SearchPath,
  1912. __in DWORD SearchPathLength
  1913. );
  1914. BOOL
  1915. IMAGEAPI
  1916. SymGetSearchPathW(
  1917. __in HANDLE hProcess,
  1918. __out_ecount(SearchPathLength) PWSTR SearchPath,
  1919. __in DWORD SearchPathLength
  1920. );
  1921. BOOL
  1922. IMAGEAPI
  1923. SymSetSearchPath(
  1924. __in HANDLE hProcess,
  1925. __in_opt PCSTR SearchPath
  1926. );
  1927. BOOL
  1928. IMAGEAPI
  1929. SymSetSearchPathW(
  1930. __in HANDLE hProcess,
  1931. __in_opt PCWSTR SearchPath
  1932. );
  1933. #define SLMFLAG_VIRTUAL 0x1
  1934. #define SLMFLAG_ALT_INDEX 0x2
  1935. #define SLMFLAG_NO_SYMBOLS 0x4
  1936. DWORD64
  1937. IMAGEAPI
  1938. SymLoadModuleEx(
  1939. __in HANDLE hProcess,
  1940. __in_opt HANDLE hFile,
  1941. __in_opt PCSTR ImageName,
  1942. __in_opt PCSTR ModuleName,
  1943. __in DWORD64 BaseOfDll,
  1944. __in DWORD DllSize,
  1945. __in_opt PMODLOAD_DATA Data,
  1946. __in_opt DWORD Flags
  1947. );
  1948. DWORD64
  1949. IMAGEAPI
  1950. SymLoadModuleExW(
  1951. __in HANDLE hProcess,
  1952. __in_opt HANDLE hFile,
  1953. __in_opt PCWSTR ImageName,
  1954. __in_opt PCWSTR ModuleName,
  1955. __in DWORD64 BaseOfDll,
  1956. __in DWORD DllSize,
  1957. __in_opt PMODLOAD_DATA Data,
  1958. __in_opt DWORD Flags
  1959. );
  1960. BOOL
  1961. IMAGEAPI
  1962. SymUnloadModule64(
  1963. __in HANDLE hProcess,
  1964. __in DWORD64 BaseOfDll
  1965. );
  1966. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1967. #define SymUnloadModule SymUnloadModule64
  1968. #else
  1969. BOOL
  1970. IMAGEAPI
  1971. SymUnloadModule(
  1972. __in HANDLE hProcess,
  1973. __in DWORD BaseOfDll
  1974. );
  1975. #endif
  1976. BOOL
  1977. IMAGEAPI
  1978. SymUnDName64(
  1979. __in PIMAGEHLP_SYMBOL64 sym, // Symbol to undecorate
  1980. __out_ecount(UnDecNameLength) PSTR UnDecName, // Buffer to store undecorated name in
  1981. __in DWORD UnDecNameLength // Size of the buffer
  1982. );
  1983. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  1984. #define SymUnDName SymUnDName64
  1985. #else
  1986. BOOL
  1987. IMAGEAPI
  1988. SymUnDName(
  1989. __in PIMAGEHLP_SYMBOL sym, // Symbol to undecorate
  1990. __out_ecount(UnDecNameLength) PSTR UnDecName, // Buffer to store undecorated name in
  1991. __in DWORD UnDecNameLength // Size of the buffer
  1992. );
  1993. #endif
  1994. BOOL
  1995. IMAGEAPI
  1996. SymRegisterCallback64(
  1997. __in HANDLE hProcess,
  1998. __in PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction,
  1999. __in ULONG64 UserContext
  2000. );
  2001. BOOL
  2002. IMAGEAPI
  2003. SymRegisterCallbackW64(
  2004. __in HANDLE hProcess,
  2005. __in PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction,
  2006. __in ULONG64 UserContext
  2007. );
  2008. BOOL
  2009. IMAGEAPI
  2010. SymRegisterFunctionEntryCallback64(
  2011. __in HANDLE hProcess,
  2012. __in PSYMBOL_FUNCENTRY_CALLBACK64 CallbackFunction,
  2013. __in ULONG64 UserContext
  2014. );
  2015. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  2016. #define SymRegisterCallback SymRegisterCallback64
  2017. #define SymRegisterFunctionEntryCallback SymRegisterFunctionEntryCallback64
  2018. #else
  2019. BOOL
  2020. IMAGEAPI
  2021. SymRegisterCallback(
  2022. __in HANDLE hProcess,
  2023. __in PSYMBOL_REGISTERED_CALLBACK CallbackFunction,
  2024. __in_opt PVOID UserContext
  2025. );
  2026. BOOL
  2027. IMAGEAPI
  2028. SymRegisterFunctionEntryCallback(
  2029. __in HANDLE hProcess,
  2030. __in PSYMBOL_FUNCENTRY_CALLBACK CallbackFunction,
  2031. __in_opt PVOID UserContext
  2032. );
  2033. #endif
  2034. typedef struct _IMAGEHLP_SYMBOL_SRC {
  2035. DWORD sizeofstruct;
  2036. DWORD type;
  2037. char file[MAX_PATH];
  2038. } IMAGEHLP_SYMBOL_SRC, *PIMAGEHLP_SYMBOL_SRC;
  2039. typedef struct _MODULE_TYPE_INFO { // AKA TYPTYP
  2040. USHORT dataLength;
  2041. USHORT leaf;
  2042. BYTE data[1];
  2043. } MODULE_TYPE_INFO, *PMODULE_TYPE_INFO;
  2044. typedef struct _SYMBOL_INFO {
  2045. ULONG SizeOfStruct;
  2046. ULONG TypeIndex; // Type Index of symbol
  2047. ULONG64 Reserved[2];
  2048. ULONG Index;
  2049. ULONG Size;
  2050. ULONG64 ModBase; // Base Address of module comtaining this symbol
  2051. ULONG Flags;
  2052. ULONG64 Value; // Value of symbol, ValuePresent should be 1
  2053. ULONG64 Address; // Address of symbol including base address of module
  2054. ULONG Register; // register holding value or pointer to value
  2055. ULONG Scope; // scope of the symbol
  2056. ULONG Tag; // pdb classification
  2057. ULONG NameLen; // Actual length of name
  2058. ULONG MaxNameLen;
  2059. CHAR Name[1]; // Name of symbol
  2060. } SYMBOL_INFO, *PSYMBOL_INFO;
  2061. typedef struct _SYMBOL_INFO_PACKAGE {
  2062. SYMBOL_INFO si;
  2063. CHAR name[MAX_SYM_NAME + 1];
  2064. } SYMBOL_INFO_PACKAGE, *PSYMBOL_INFO_PACKAGE;
  2065. typedef struct _SYMBOL_INFOW {
  2066. ULONG SizeOfStruct;
  2067. ULONG TypeIndex; // Type Index of symbol
  2068. ULONG64 Reserved[2];
  2069. ULONG Index;
  2070. ULONG Size;
  2071. ULONG64 ModBase; // Base Address of module comtaining this symbol
  2072. ULONG Flags;
  2073. ULONG64 Value; // Value of symbol, ValuePresent should be 1
  2074. ULONG64 Address; // Address of symbol including base address of module
  2075. ULONG Register; // register holding value or pointer to value
  2076. ULONG Scope; // scope of the symbol
  2077. ULONG Tag; // pdb classification
  2078. ULONG NameLen; // Actual length of name
  2079. ULONG MaxNameLen;
  2080. WCHAR Name[1]; // Name of symbol
  2081. } SYMBOL_INFOW, *PSYMBOL_INFOW;
  2082. typedef struct _SYMBOL_INFO_PACKAGEW {
  2083. SYMBOL_INFOW si;
  2084. WCHAR name[MAX_SYM_NAME + 1];
  2085. } SYMBOL_INFO_PACKAGEW, *PSYMBOL_INFO_PACKAGEW;
  2086. typedef struct _IMAGEHLP_STACK_FRAME
  2087. {
  2088. ULONG64 InstructionOffset;
  2089. ULONG64 ReturnOffset;
  2090. ULONG64 FrameOffset;
  2091. ULONG64 StackOffset;
  2092. ULONG64 BackingStoreOffset;
  2093. ULONG64 FuncTableEntry;
  2094. ULONG64 Params[4];
  2095. ULONG64 Reserved[5];
  2096. BOOL Virtual;
  2097. ULONG Reserved2;
  2098. } IMAGEHLP_STACK_FRAME, *PIMAGEHLP_STACK_FRAME;
  2099. typedef VOID IMAGEHLP_CONTEXT, *PIMAGEHLP_CONTEXT;
  2100. BOOL
  2101. IMAGEAPI
  2102. SymSetContext(
  2103. __in HANDLE hProcess,
  2104. __in PIMAGEHLP_STACK_FRAME StackFrame,
  2105. __in_opt PIMAGEHLP_CONTEXT Context
  2106. );
  2107. BOOL
  2108. IMAGEAPI
  2109. SymSetScopeFromAddr(
  2110. __in HANDLE hProcess,
  2111. __in ULONG64 Address
  2112. );
  2113. BOOL
  2114. IMAGEAPI
  2115. SymSetScopeFromIndex(
  2116. __in HANDLE hProcess,
  2117. __in ULONG64 BaseOfDll,
  2118. __in DWORD Index
  2119. );
  2120. typedef BOOL
  2121. (CALLBACK *PSYM_ENUMPROCESSES_CALLBACK)(
  2122. __in HANDLE hProcess,
  2123. __in PVOID UserContext
  2124. );
  2125. BOOL
  2126. IMAGEAPI
  2127. SymEnumProcesses(
  2128. __in PSYM_ENUMPROCESSES_CALLBACK EnumProcessesCallback,
  2129. __in PVOID UserContext
  2130. );
  2131. BOOL
  2132. IMAGEAPI
  2133. SymFromAddr(
  2134. __in HANDLE hProcess,
  2135. __in DWORD64 Address,
  2136. __out_opt PDWORD64 Displacement,
  2137. __inout PSYMBOL_INFO Symbol
  2138. );
  2139. BOOL
  2140. IMAGEAPI
  2141. SymFromAddrW(
  2142. __in HANDLE hProcess,
  2143. __in DWORD64 Address,
  2144. __out_opt PDWORD64 Displacement,
  2145. __inout PSYMBOL_INFOW Symbol
  2146. );
  2147. BOOL
  2148. IMAGEAPI
  2149. SymFromToken(
  2150. __in HANDLE hProcess,
  2151. __in DWORD64 Base,
  2152. __in DWORD Token,
  2153. __inout PSYMBOL_INFO Symbol
  2154. );
  2155. BOOL
  2156. IMAGEAPI
  2157. SymFromTokenW(
  2158. __in HANDLE hProcess,
  2159. __in DWORD64 Base,
  2160. __in DWORD Token,
  2161. __inout PSYMBOL_INFOW Symbol
  2162. );
  2163. BOOL
  2164. IMAGEAPI
  2165. SymNext(
  2166. __in HANDLE hProcess,
  2167. __inout PSYMBOL_INFO si
  2168. );
  2169. BOOL
  2170. IMAGEAPI
  2171. SymNextW(
  2172. __in HANDLE hProcess,
  2173. __inout PSYMBOL_INFOW siw
  2174. );
  2175. BOOL
  2176. IMAGEAPI
  2177. SymPrev(
  2178. __in HANDLE hProcess,
  2179. __inout PSYMBOL_INFO si
  2180. );
  2181. BOOL
  2182. IMAGEAPI
  2183. SymPrevW(
  2184. __in HANDLE hProcess,
  2185. __inout PSYMBOL_INFOW siw
  2186. );
  2187. // While SymFromName will provide a symbol from a name,
  2188. // SymEnumSymbols can provide the same matching information
  2189. // for ALL symbols with a matching name, even regular
  2190. // expressions. That way you can search across modules
  2191. // and differentiate between identically named symbols.
  2192. BOOL
  2193. IMAGEAPI
  2194. SymFromName(
  2195. __in HANDLE hProcess,
  2196. __in PCSTR Name,
  2197. __inout PSYMBOL_INFO Symbol
  2198. );
  2199. BOOL
  2200. IMAGEAPI
  2201. SymFromNameW(
  2202. __in HANDLE hProcess,
  2203. __in PCWSTR Name,
  2204. __inout PSYMBOL_INFOW Symbol
  2205. );
  2206. typedef BOOL
  2207. (CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACK)(
  2208. __in PSYMBOL_INFO pSymInfo,
  2209. __in ULONG SymbolSize,
  2210. __in_opt PVOID UserContext
  2211. );
  2212. BOOL
  2213. IMAGEAPI
  2214. SymEnumSymbols(
  2215. __in HANDLE hProcess,
  2216. __in ULONG64 BaseOfDll,
  2217. __in_opt PCSTR Mask,
  2218. __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
  2219. __in_opt PVOID UserContext
  2220. );
  2221. typedef BOOL
  2222. (CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACKW)(
  2223. __in PSYMBOL_INFOW pSymInfo,
  2224. __in ULONG SymbolSize,
  2225. __in_opt PVOID UserContext
  2226. );
  2227. BOOL
  2228. IMAGEAPI
  2229. SymEnumSymbolsW(
  2230. __in HANDLE hProcess,
  2231. __in ULONG64 BaseOfDll,
  2232. __in_opt PCWSTR Mask,
  2233. __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback,
  2234. __in_opt PVOID UserContext
  2235. );
  2236. BOOL
  2237. IMAGEAPI
  2238. SymEnumSymbolsForAddr(
  2239. __in HANDLE hProcess,
  2240. __in DWORD64 Address,
  2241. __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
  2242. __in_opt PVOID UserContext
  2243. );
  2244. BOOL
  2245. IMAGEAPI
  2246. SymEnumSymbolsForAddrW(
  2247. __in HANDLE hProcess,
  2248. __in DWORD64 Address,
  2249. __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback,
  2250. __in_opt PVOID UserContext
  2251. );
  2252. #define SYMSEARCH_MASKOBJS 0x01 // used internally to implement other APIs
  2253. #define SYMSEARCH_RECURSE 0X02 // recurse scopes
  2254. #define SYMSEARCH_GLOBALSONLY 0X04 // search only for global symbols
  2255. #define SYMSEARCH_ALLITEMS 0X08 // search for everything in the pdb, not just normal scoped symbols
  2256. BOOL
  2257. IMAGEAPI
  2258. SymSearch(
  2259. __in HANDLE hProcess,
  2260. __in ULONG64 BaseOfDll,
  2261. __in_opt DWORD Index,
  2262. __in_opt DWORD SymTag,
  2263. __in_opt PCSTR Mask,
  2264. __in_opt DWORD64 Address,
  2265. __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
  2266. __in_opt PVOID UserContext,
  2267. __in DWORD Options
  2268. );
  2269. BOOL
  2270. IMAGEAPI
  2271. SymSearchW(
  2272. __in HANDLE hProcess,
  2273. __in ULONG64 BaseOfDll,
  2274. __in_opt DWORD Index,
  2275. __in_opt DWORD SymTag,
  2276. __in_opt PCWSTR Mask,
  2277. __in_opt DWORD64 Address,
  2278. __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback,
  2279. __in_opt PVOID UserContext,
  2280. __in DWORD Options
  2281. );
  2282. BOOL
  2283. IMAGEAPI
  2284. SymGetScope(
  2285. __in HANDLE hProcess,
  2286. __in ULONG64 BaseOfDll,
  2287. __in DWORD Index,
  2288. __inout PSYMBOL_INFO Symbol
  2289. );
  2290. BOOL
  2291. IMAGEAPI
  2292. SymGetScopeW(
  2293. __in HANDLE hProcess,
  2294. __in ULONG64 BaseOfDll,
  2295. __in DWORD Index,
  2296. __inout PSYMBOL_INFOW Symbol
  2297. );
  2298. BOOL
  2299. IMAGEAPI
  2300. SymFromIndex(
  2301. __in HANDLE hProcess,
  2302. __in ULONG64 BaseOfDll,
  2303. __in DWORD Index,
  2304. __inout PSYMBOL_INFO Symbol
  2305. );
  2306. BOOL
  2307. IMAGEAPI
  2308. SymFromIndexW(
  2309. __in HANDLE hProcess,
  2310. __in ULONG64 BaseOfDll,
  2311. __in DWORD Index,
  2312. __inout PSYMBOL_INFOW Symbol
  2313. );
  2314. typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO {
  2315. TI_GET_SYMTAG,
  2316. TI_GET_SYMNAME,
  2317. TI_GET_LENGTH,
  2318. TI_GET_TYPE,
  2319. TI_GET_TYPEID,
  2320. TI_GET_BASETYPE,
  2321. TI_GET_ARRAYINDEXTYPEID,
  2322. TI_FINDCHILDREN,
  2323. TI_GET_DATAKIND,
  2324. TI_GET_ADDRESSOFFSET,
  2325. TI_GET_OFFSET,
  2326. TI_GET_VALUE,
  2327. TI_GET_COUNT,
  2328. TI_GET_CHILDRENCOUNT,
  2329. TI_GET_BITPOSITION,
  2330. TI_GET_VIRTUALBASECLASS,
  2331. TI_GET_VIRTUALTABLESHAPEID,
  2332. TI_GET_VIRTUALBASEPOINTEROFFSET,
  2333. TI_GET_CLASSPARENTID,
  2334. TI_GET_NESTED,
  2335. TI_GET_SYMINDEX,
  2336. TI_GET_LEXICALPARENT,
  2337. TI_GET_ADDRESS,
  2338. TI_GET_THISADJUST,
  2339. TI_GET_UDTKIND,
  2340. TI_IS_EQUIV_TO,
  2341. TI_GET_CALLING_CONVENTION,
  2342. TI_IS_CLOSE_EQUIV_TO,
  2343. TI_GTIEX_REQS_VALID,
  2344. TI_GET_VIRTUALBASEOFFSET,
  2345. TI_GET_VIRTUALBASEDISPINDEX,
  2346. TI_GET_IS_REFERENCE,
  2347. TI_GET_INDIRECTVIRTUALBASECLASS,
  2348. TI_GET_VIRTUALBASETABLETYPE,
  2349. IMAGEHLP_SYMBOL_TYPE_INFO_MAX,
  2350. } IMAGEHLP_SYMBOL_TYPE_INFO;
  2351. typedef struct _TI_FINDCHILDREN_PARAMS {
  2352. ULONG Count;
  2353. ULONG Start;
  2354. ULONG ChildId[1];
  2355. } TI_FINDCHILDREN_PARAMS;
  2356. BOOL
  2357. IMAGEAPI
  2358. SymGetTypeInfo(
  2359. __in HANDLE hProcess,
  2360. __in DWORD64 ModBase,
  2361. __in ULONG TypeId,
  2362. __in IMAGEHLP_SYMBOL_TYPE_INFO GetType,
  2363. __out PVOID pInfo
  2364. );
  2365. #define IMAGEHLP_GET_TYPE_INFO_UNCACHED 0x00000001
  2366. #define IMAGEHLP_GET_TYPE_INFO_CHILDREN 0x00000002
  2367. typedef struct _IMAGEHLP_GET_TYPE_INFO_PARAMS {
  2368. IN ULONG SizeOfStruct;
  2369. IN ULONG Flags;
  2370. IN ULONG NumIds;
  2371. IN PULONG TypeIds;
  2372. IN ULONG64 TagFilter;
  2373. IN ULONG NumReqs;
  2374. IN IMAGEHLP_SYMBOL_TYPE_INFO* ReqKinds;
  2375. IN PULONG_PTR ReqOffsets;
  2376. IN PULONG ReqSizes;
  2377. IN ULONG_PTR ReqStride;
  2378. IN ULONG_PTR BufferSize;
  2379. OUT PVOID Buffer;
  2380. OUT ULONG EntriesMatched;
  2381. OUT ULONG EntriesFilled;
  2382. OUT ULONG64 TagsFound;
  2383. OUT ULONG64 AllReqsValid;
  2384. IN ULONG NumReqsValid;
  2385. OUT PULONG64 ReqsValid OPTIONAL;
  2386. } IMAGEHLP_GET_TYPE_INFO_PARAMS, *PIMAGEHLP_GET_TYPE_INFO_PARAMS;
  2387. BOOL
  2388. IMAGEAPI
  2389. SymGetTypeInfoEx(
  2390. __in HANDLE hProcess,
  2391. __in DWORD64 ModBase,
  2392. __inout PIMAGEHLP_GET_TYPE_INFO_PARAMS Params
  2393. );
  2394. BOOL
  2395. IMAGEAPI
  2396. SymEnumTypes(
  2397. __in HANDLE hProcess,
  2398. __in ULONG64 BaseOfDll,
  2399. __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
  2400. __in_opt PVOID UserContext
  2401. );
  2402. BOOL
  2403. IMAGEAPI
  2404. SymEnumTypesW(
  2405. __in HANDLE hProcess,
  2406. __in ULONG64 BaseOfDll,
  2407. __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback,
  2408. __in_opt PVOID UserContext
  2409. );
  2410. BOOL
  2411. IMAGEAPI
  2412. SymEnumTypesByName(
  2413. __in HANDLE hProcess,
  2414. __in ULONG64 BaseOfDll,
  2415. __in_opt PCSTR mask,
  2416. __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
  2417. __in_opt PVOID UserContext
  2418. );
  2419. BOOL
  2420. IMAGEAPI
  2421. SymEnumTypesByNameW(
  2422. __in HANDLE hProcess,
  2423. __in ULONG64 BaseOfDll,
  2424. __in_opt PCWSTR mask,
  2425. __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback,
  2426. __in_opt PVOID UserContext
  2427. );
  2428. BOOL
  2429. IMAGEAPI
  2430. SymGetTypeFromName(
  2431. __in HANDLE hProcess,
  2432. __in ULONG64 BaseOfDll,
  2433. __in PCSTR Name,
  2434. __inout PSYMBOL_INFO Symbol
  2435. );
  2436. BOOL
  2437. IMAGEAPI
  2438. SymGetTypeFromNameW(
  2439. __in HANDLE hProcess,
  2440. __in ULONG64 BaseOfDll,
  2441. __in PCWSTR Name,
  2442. __inout PSYMBOL_INFOW Symbol
  2443. );
  2444. BOOL
  2445. IMAGEAPI
  2446. SymAddSymbol(
  2447. __in HANDLE hProcess,
  2448. __in ULONG64 BaseOfDll,
  2449. __in PCSTR Name,
  2450. __in DWORD64 Address,
  2451. __in DWORD Size,
  2452. __in DWORD Flags
  2453. );
  2454. BOOL
  2455. IMAGEAPI
  2456. SymAddSymbolW(
  2457. __in HANDLE hProcess,
  2458. __in ULONG64 BaseOfDll,
  2459. __in PCWSTR Name,
  2460. __in DWORD64 Address,
  2461. __in DWORD Size,
  2462. __in DWORD Flags
  2463. );
  2464. BOOL
  2465. IMAGEAPI
  2466. SymDeleteSymbol(
  2467. __in HANDLE hProcess,
  2468. __in ULONG64 BaseOfDll,
  2469. __in_opt PCSTR Name,
  2470. __in DWORD64 Address,
  2471. __in DWORD Flags
  2472. );
  2473. BOOL
  2474. IMAGEAPI
  2475. SymDeleteSymbolW(
  2476. __in HANDLE hProcess,
  2477. __in ULONG64 BaseOfDll,
  2478. __in_opt PCWSTR Name,
  2479. __in DWORD64 Address,
  2480. __in DWORD Flags
  2481. );
  2482. BOOL
  2483. IMAGEAPI
  2484. SymRefreshModuleList(
  2485. __in HANDLE hProcess
  2486. );
  2487. BOOL
  2488. IMAGEAPI
  2489. SymAddSourceStream(
  2490. __in HANDLE hProcess,
  2491. __in ULONG64 Base,
  2492. __in_opt PCSTR StreamFile,
  2493. __in_bcount_opt(Size) PBYTE Buffer,
  2494. __in size_t Size
  2495. );
  2496. typedef BOOL (WINAPI *SYMADDSOURCESTREAM)(HANDLE, ULONG64, PCSTR, PBYTE, size_t);
  2497. BOOL
  2498. IMAGEAPI
  2499. SymAddSourceStreamA(
  2500. __in HANDLE hProcess,
  2501. __in ULONG64 Base,
  2502. __in_opt PCSTR StreamFile,
  2503. __in_bcount_opt(Size) PBYTE Buffer,
  2504. __in size_t Size
  2505. );
  2506. typedef BOOL (WINAPI *SYMADDSOURCESTREAMA)(HANDLE, ULONG64, PCSTR, PBYTE, size_t);
  2507. BOOL
  2508. IMAGEAPI
  2509. SymAddSourceStreamW(
  2510. __in HANDLE hProcess,
  2511. __in ULONG64 Base,
  2512. __in_opt PCWSTR FileSpec,
  2513. __in_bcount_opt(Size) PBYTE Buffer,
  2514. __in size_t Size
  2515. );
  2516. BOOL
  2517. IMAGEAPI
  2518. SymSrvIsStoreW(
  2519. __in_opt HANDLE hProcess,
  2520. __in PCWSTR path
  2521. );
  2522. BOOL
  2523. IMAGEAPI
  2524. SymSrvIsStore(
  2525. __in_opt HANDLE hProcess,
  2526. __in PCSTR path
  2527. );
  2528. PCSTR
  2529. IMAGEAPI
  2530. SymSrvDeltaName(
  2531. __in HANDLE hProcess,
  2532. __in_opt PCSTR SymPath,
  2533. __in PCSTR Type,
  2534. __in PCSTR File1,
  2535. __in PCSTR File2
  2536. );
  2537. PCWSTR
  2538. IMAGEAPI
  2539. SymSrvDeltaNameW(
  2540. __in HANDLE hProcess,
  2541. __in_opt PCWSTR SymPath,
  2542. __in PCWSTR Type,
  2543. __in PCWSTR File1,
  2544. __in PCWSTR File2
  2545. );
  2546. PCSTR
  2547. IMAGEAPI
  2548. SymSrvGetSupplement(
  2549. __in HANDLE hProcess,
  2550. __in_opt PCSTR SymPath,
  2551. __in PCSTR Node,
  2552. __in PCSTR File
  2553. );
  2554. PCWSTR
  2555. IMAGEAPI
  2556. SymSrvGetSupplementW(
  2557. __in HANDLE hProcess,
  2558. __in_opt PCWSTR SymPath,
  2559. __in PCWSTR Node,
  2560. __in PCWSTR File
  2561. );
  2562. BOOL
  2563. IMAGEAPI
  2564. SymSrvGetFileIndexes(
  2565. __in PCSTR File,
  2566. __out GUID *Id,
  2567. __out PDWORD Val1,
  2568. __out_opt PDWORD Val2,
  2569. __in DWORD Flags
  2570. );
  2571. BOOL
  2572. IMAGEAPI
  2573. SymSrvGetFileIndexesW(
  2574. __in PCWSTR File,
  2575. __out GUID *Id,
  2576. __out PDWORD Val1,
  2577. __out_opt PDWORD Val2,
  2578. __in DWORD Flags
  2579. );
  2580. BOOL
  2581. IMAGEAPI
  2582. SymSrvGetFileIndexStringW(
  2583. __in HANDLE hProcess,
  2584. __in_opt PCWSTR SrvPath,
  2585. __in PCWSTR File,
  2586. __out_ecount(Size) PWSTR Index,
  2587. __in size_t Size,
  2588. __in DWORD Flags
  2589. );
  2590. BOOL
  2591. IMAGEAPI
  2592. SymSrvGetFileIndexString(
  2593. __in HANDLE hProcess,
  2594. __in_opt PCSTR SrvPath,
  2595. __in PCSTR File,
  2596. __out_ecount(Size) PSTR Index,
  2597. __in size_t Size,
  2598. __in DWORD Flags
  2599. );
  2600. typedef struct {
  2601. DWORD sizeofstruct;
  2602. char file[MAX_PATH +1];
  2603. BOOL stripped;
  2604. DWORD timestamp;
  2605. DWORD size;
  2606. char dbgfile[MAX_PATH +1];
  2607. char pdbfile[MAX_PATH + 1];
  2608. GUID guid;
  2609. DWORD sig;
  2610. DWORD age;
  2611. } SYMSRV_INDEX_INFO, *PSYMSRV_INDEX_INFO;
  2612. typedef struct {
  2613. DWORD sizeofstruct;
  2614. WCHAR file[MAX_PATH +1];
  2615. BOOL stripped;
  2616. DWORD timestamp;
  2617. DWORD size;
  2618. WCHAR dbgfile[MAX_PATH +1];
  2619. WCHAR pdbfile[MAX_PATH + 1];
  2620. GUID guid;
  2621. DWORD sig;
  2622. DWORD age;
  2623. } SYMSRV_INDEX_INFOW, *PSYMSRV_INDEX_INFOW;
  2624. BOOL
  2625. IMAGEAPI
  2626. SymSrvGetFileIndexInfo(
  2627. __in PCSTR File,
  2628. __out PSYMSRV_INDEX_INFO Info,
  2629. __in DWORD Flags
  2630. );
  2631. BOOL
  2632. IMAGEAPI
  2633. SymSrvGetFileIndexInfoW(
  2634. __in PCWSTR File,
  2635. __out PSYMSRV_INDEX_INFOW Info,
  2636. __in DWORD Flags
  2637. );
  2638. PCSTR
  2639. IMAGEAPI
  2640. SymSrvStoreSupplement(
  2641. __in HANDLE hProcess,
  2642. __in_opt PCSTR SrvPath,
  2643. __in PCSTR Node,
  2644. __in PCSTR File,
  2645. __in DWORD Flags
  2646. );
  2647. PCWSTR
  2648. IMAGEAPI
  2649. SymSrvStoreSupplementW(
  2650. __in HANDLE hProcess,
  2651. __in_opt PCWSTR SymPath,
  2652. __in PCWSTR Node,
  2653. __in PCWSTR File,
  2654. __in DWORD Flags
  2655. );
  2656. PCSTR
  2657. IMAGEAPI
  2658. SymSrvStoreFile(
  2659. __in HANDLE hProcess,
  2660. __in_opt PCSTR SrvPath,
  2661. __in PCSTR File,
  2662. __in DWORD Flags
  2663. );
  2664. PCWSTR
  2665. IMAGEAPI
  2666. SymSrvStoreFileW(
  2667. __in HANDLE hProcess,
  2668. __in_opt PCWSTR SrvPath,
  2669. __in PCWSTR File,
  2670. __in DWORD Flags
  2671. );
  2672. // used by SymGetSymbolFile's "Type" parameter
  2673. typedef enum {
  2674. sfImage = 0,
  2675. sfDbg,
  2676. sfPdb,
  2677. sfMpd,
  2678. sfMax
  2679. };
  2680. BOOL
  2681. IMAGEAPI
  2682. SymGetSymbolFile(
  2683. __in_opt HANDLE hProcess,
  2684. __in_opt PCSTR SymPath,
  2685. __in PCSTR ImageFile,
  2686. __in DWORD Type,
  2687. __out_ecount(cSymbolFile) PSTR SymbolFile,
  2688. __in size_t cSymbolFile,
  2689. __out_ecount(cDbgFile) PSTR DbgFile,
  2690. __in size_t cDbgFile
  2691. );
  2692. BOOL
  2693. IMAGEAPI
  2694. SymGetSymbolFileW(
  2695. __in_opt HANDLE hProcess,
  2696. __in_opt PCWSTR SymPath,
  2697. __in PCWSTR ImageFile,
  2698. __in DWORD Type,
  2699. __out_ecount(cSymbolFile) PWSTR SymbolFile,
  2700. __in size_t cSymbolFile,
  2701. __out_ecount(cDbgFile) PWSTR DbgFile,
  2702. __in size_t cDbgFile
  2703. );
  2704. //
  2705. // Full user-mode dump creation.
  2706. //
  2707. typedef BOOL (WINAPI *PDBGHELP_CREATE_USER_DUMP_CALLBACK)(
  2708. __in DWORD DataType,
  2709. __in PVOID* Data,
  2710. __out LPDWORD DataLength,
  2711. __in_opt PVOID UserData
  2712. );
  2713. BOOL
  2714. WINAPI
  2715. DbgHelpCreateUserDump(
  2716. __in_opt LPCSTR FileName,
  2717. __in PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback,
  2718. __in_opt PVOID UserData
  2719. );
  2720. BOOL
  2721. WINAPI
  2722. DbgHelpCreateUserDumpW(
  2723. __in_opt LPCWSTR FileName,
  2724. __in PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback,
  2725. __in_opt PVOID UserData
  2726. );
  2727. // -----------------------------------------------------------------
  2728. // The following 4 legacy APIs are fully supported, but newer
  2729. // ones are recommended. SymFromName and SymFromAddr provide
  2730. // much more detailed info on the returned symbol.
  2731. BOOL
  2732. IMAGEAPI
  2733. SymGetSymFromAddr64(
  2734. __in HANDLE hProcess,
  2735. __in DWORD64 qwAddr,
  2736. __out_opt PDWORD64 pdwDisplacement,
  2737. __inout PIMAGEHLP_SYMBOL64 Symbol
  2738. );
  2739. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  2740. #define SymGetSymFromAddr SymGetSymFromAddr64
  2741. #else
  2742. BOOL
  2743. IMAGEAPI
  2744. SymGetSymFromAddr(
  2745. __in HANDLE hProcess,
  2746. __in DWORD dwAddr,
  2747. __out_opt PDWORD pdwDisplacement,
  2748. __inout PIMAGEHLP_SYMBOL Symbol
  2749. );
  2750. #endif
  2751. // While following two APIs will provide a symbol from a name,
  2752. // SymEnumSymbols can provide the same matching information
  2753. // for ALL symbols with a matching name, even regular
  2754. // expressions. That way you can search across modules
  2755. // and differentiate between identically named symbols.
  2756. BOOL
  2757. IMAGEAPI
  2758. SymGetSymFromName64(
  2759. __in HANDLE hProcess,
  2760. __in PCSTR Name,
  2761. __inout PIMAGEHLP_SYMBOL64 Symbol
  2762. );
  2763. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  2764. #define SymGetSymFromName SymGetSymFromName64
  2765. #else
  2766. BOOL
  2767. IMAGEAPI
  2768. SymGetSymFromName(
  2769. __in HANDLE hProcess,
  2770. __in PCSTR Name,
  2771. __inout PIMAGEHLP_SYMBOL Symbol
  2772. );
  2773. #endif
  2774. // Symbol server exports
  2775. typedef BOOL (WINAPI *PSYMBOLSERVERPROC)(PCSTR, PCSTR, PVOID, DWORD, DWORD, PSTR);
  2776. typedef BOOL (WINAPI *PSYMBOLSERVERPROCA)(PCSTR, PCSTR, PVOID, DWORD, DWORD, PSTR);
  2777. typedef BOOL (WINAPI *PSYMBOLSERVERPROCW)(PCWSTR, PCWSTR, PVOID, DWORD, DWORD, PWSTR);
  2778. typedef BOOL (WINAPI *PSYMBOLSERVERBYINDEXPROC)(PCSTR, PCSTR, PCSTR, PSTR);
  2779. typedef BOOL (WINAPI *PSYMBOLSERVERBYINDEXPROCA)(PCSTR, PCSTR, PCSTR, PSTR);
  2780. typedef BOOL (WINAPI *PSYMBOLSERVERBYINDEXPROCW)(PCWSTR, PCWSTR, PCWSTR, PWSTR);
  2781. typedef BOOL (WINAPI *PSYMBOLSERVEROPENPROC)(VOID);
  2782. typedef BOOL (WINAPI *PSYMBOLSERVERCLOSEPROC)(VOID);
  2783. typedef BOOL (WINAPI *PSYMBOLSERVERSETOPTIONSPROC)(UINT_PTR, ULONG64);
  2784. typedef BOOL (WINAPI *PSYMBOLSERVERSETOPTIONSWPROC)(UINT_PTR, ULONG64);
  2785. typedef BOOL (CALLBACK WINAPI *PSYMBOLSERVERCALLBACKPROC)(UINT_PTR action, ULONG64 data, ULONG64 context);
  2786. typedef UINT_PTR (WINAPI *PSYMBOLSERVERGETOPTIONSPROC)();
  2787. typedef BOOL (WINAPI *PSYMBOLSERVERPINGPROC)(PCSTR);
  2788. typedef BOOL (WINAPI *PSYMBOLSERVERPINGPROCA)(PCSTR);
  2789. typedef BOOL (WINAPI *PSYMBOLSERVERPINGPROCW)(PCWSTR);
  2790. typedef BOOL (WINAPI *PSYMBOLSERVERGETVERSION)(LPAPI_VERSION);
  2791. typedef BOOL (WINAPI *PSYMBOLSERVERDELTANAME)(PCSTR, PVOID, DWORD, DWORD, PVOID, DWORD, DWORD, PSTR, size_t);
  2792. typedef BOOL (WINAPI *PSYMBOLSERVERDELTANAMEW)(PCWSTR, PVOID, DWORD, DWORD, PVOID, DWORD, DWORD, PWSTR, size_t);
  2793. typedef BOOL (WINAPI *PSYMBOLSERVERGETSUPPLEMENT)(PCSTR, PCSTR, PCSTR, PSTR, size_t);
  2794. typedef BOOL (WINAPI *PSYMBOLSERVERGETSUPPLEMENTW)(PCWSTR, PCWSTR, PCWSTR, PWSTR, size_t);
  2795. typedef BOOL (WINAPI *PSYMBOLSERVERSTORESUPPLEMENT)(PCSTR, PCSTR, PCSTR, PSTR, size_t, DWORD);
  2796. typedef BOOL (WINAPI *PSYMBOLSERVERSTORESUPPLEMENTW)(PCWSTR, PCWSTR, PCWSTR, PWSTR, size_t, DWORD);
  2797. typedef BOOL (WINAPI *PSYMBOLSERVERGETINDEXSTRING)(PVOID, DWORD, DWORD, PSTR, size_t);
  2798. typedef BOOL (WINAPI *PSYMBOLSERVERGETINDEXSTRINGW)(PVOID, DWORD, DWORD, PWSTR, size_t);
  2799. typedef BOOL (WINAPI *PSYMBOLSERVERSTOREFILE)(PCSTR, PCSTR, PVOID, DWORD, DWORD, PSTR, size_t, DWORD);
  2800. typedef BOOL (WINAPI *PSYMBOLSERVERSTOREFILEW)(PCWSTR, PCWSTR, PVOID, DWORD, DWORD, PWSTR, size_t, DWORD);
  2801. typedef BOOL (WINAPI *PSYMBOLSERVERISSTORE)(PCSTR);
  2802. typedef BOOL (WINAPI *PSYMBOLSERVERISSTOREW)(PCWSTR);
  2803. typedef DWORD (WINAPI *PSYMBOLSERVERVERSION)();
  2804. typedef BOOL (CALLBACK WINAPI *PSYMBOLSERVERMESSAGEPROC)(UINT_PTR action, ULONG64 data, ULONG64 context);
  2805. #define SYMSRV_VERSION 2
  2806. #define SSRVOPT_CALLBACK 0x00000001
  2807. #define SSRVOPT_DWORD 0x00000002
  2808. #define SSRVOPT_DWORDPTR 0x00000004
  2809. #define SSRVOPT_GUIDPTR 0x00000008
  2810. #define SSRVOPT_OLDGUIDPTR 0x00000010
  2811. #define SSRVOPT_UNATTENDED 0x00000020
  2812. #define SSRVOPT_NOCOPY 0x00000040
  2813. #define SSRVOPT_GETPATH 0x00000040
  2814. #define SSRVOPT_PARENTWIN 0x00000080
  2815. #define SSRVOPT_PARAMTYPE 0x00000100
  2816. #define SSRVOPT_SECURE 0x00000200
  2817. #define SSRVOPT_TRACE 0x00000400
  2818. #define SSRVOPT_SETCONTEXT 0x00000800
  2819. #define SSRVOPT_PROXY 0x00001000
  2820. #define SSRVOPT_DOWNSTREAM_STORE 0x00002000
  2821. #define SSRVOPT_OVERWRITE 0x00004000
  2822. #define SSRVOPT_RESETTOU 0x00008000
  2823. #define SSRVOPT_CALLBACKW 0x00010000
  2824. #define SSRVOPT_FLAT_DEFAULT_STORE 0x00020000
  2825. #define SSRVOPT_PROXYW 0x00040000
  2826. #define SSRVOPT_MESSAGE 0x00080000
  2827. #define SSRVOPT_SERVICE 0x00100000 // deprecated
  2828. #define SSRVOPT_FAVOR_COMPRESSED 0x00200000
  2829. #define SSRVOPT_STRING 0x00400000
  2830. #define SSRVOPT_WINHTTP 0x00800000
  2831. #define SSRVOPT_WININET 0x01000000
  2832. #define SSRVOPT_MAX 0x0100000
  2833. #define SSRVOPT_RESET ((ULONG_PTR)-1)
  2834. #define NUM_SSRVOPTS 30
  2835. #define SSRVACTION_TRACE 1
  2836. #define SSRVACTION_QUERYCANCEL 2
  2837. #define SSRVACTION_EVENT 3
  2838. #define SSRVACTION_EVENTW 4
  2839. #define SSRVACTION_SIZE 5
  2840. #define SYMSTOREOPT_COMPRESS 0x01
  2841. #define SYMSTOREOPT_OVERWRITE 0x02
  2842. #define SYMSTOREOPT_RETURNINDEX 0x04
  2843. #define SYMSTOREOPT_POINTER 0x08
  2844. #define SYMSTOREOPT_ALT_INDEX 0x10
  2845. #define SYMSTOREOPT_UNICODE 0x20
  2846. #define SYMSTOREOPT_PASS_IF_EXISTS 0x40
  2847. #ifdef DBGHELP_TRANSLATE_TCHAR
  2848. #define SymInitialize SymInitializeW
  2849. #define SymAddSymbol SymAddSymbolW
  2850. #define SymDeleteSymbol SymDeleteSymbolW
  2851. #define SearchTreeForFile SearchTreeForFileW
  2852. #define UnDecorateSymbolName UnDecorateSymbolNameW
  2853. #define SymGetLineFromName64 SymGetLineFromNameW64
  2854. #define SymGetLineFromAddr64 SymGetLineFromAddrW64
  2855. #define SymGetLineNext64 SymGetLineNextW64
  2856. #define SymGetLinePrev64 SymGetLinePrevW64
  2857. #define SymFromName SymFromNameW
  2858. #define SymFindExecutableImage SymFindExecutableImageW
  2859. #define FindExecutableImageEx FindExecutableImageExW
  2860. #define SymSearch SymSearchW
  2861. #define SymEnumLines SymEnumLinesW
  2862. #define SymEnumSourceLines SymEnumSourceLinesW
  2863. #define SymGetTypeFromName SymGetTypeFromNameW
  2864. #define SymEnumSymbolsForAddr SymEnumSymbolsForAddrW
  2865. #define SymFromAddr SymFromAddrW
  2866. #define SymMatchString SymMatchStringW
  2867. #define SymEnumSourceFiles SymEnumSourceFilesW
  2868. #define SymEnumSymbols SymEnumSymbolsW
  2869. #define SymLoadModuleEx SymLoadModuleExW
  2870. #define SymSetSearchPath SymSetSearchPathW
  2871. #define SymGetSearchPath SymGetSearchPathW
  2872. #define EnumDirTree EnumDirTreeW
  2873. #define SymFromToken SymFromTokenW
  2874. #define SymFromIndex SymFromIndexW
  2875. #define SymGetScope SymGetScopeW
  2876. #define SymNext SymNextW
  2877. #define SymPrev SymPrevW
  2878. #define SymEnumTypes SymEnumTypesW
  2879. #define SymEnumTypesByName SymEnumTypesByNameW
  2880. #define SymRegisterCallback64 SymRegisterCallbackW64
  2881. #define SymFindDebugInfoFile SymFindDebugInfoFileW
  2882. #define FindDebugInfoFileEx FindDebugInfoFileExW
  2883. #define SymFindFileInPath SymFindFileInPathW
  2884. #define SymEnumerateModules64 SymEnumerateModulesW64
  2885. #define SymSetHomeDirectory SymSetHomeDirectoryW
  2886. #define SymGetHomeDirectory SymGetHomeDirectoryW
  2887. #define SymGetSourceFile SymGetSourceFileW
  2888. #define SymGetSourceFileToken SymGetSourceFileTokenW
  2889. #define SymGetSourceFileFromToken SymGetSourceFileFromTokenW
  2890. #define SymGetSourceVarFromToken SymGetSourceVarFromTokenW
  2891. #define SymGetSourceFileToken SymGetSourceFileTokenW
  2892. #define SymGetFileLineOffsets64 SymGetFileLineOffsetsW64
  2893. #define SymFindFileInPath SymFindFileInPathW
  2894. #define SymMatchFileName SymMatchFileNameW
  2895. #define SymGetSourceFileFromToken SymGetSourceFileFromTokenW
  2896. #define SymGetSourceVarFromToken SymGetSourceVarFromTokenW
  2897. #define SymGetModuleInfo64 SymGetModuleInfoW64
  2898. #define SymSrvIsStore SymSrvIsStoreW
  2899. #define SymSrvDeltaName SymSrvDeltaNameW
  2900. #define SymSrvGetSupplement SymSrvGetSupplementW
  2901. #define SymSrvStoreSupplement SymSrvStoreSupplementW
  2902. #define SymSrvGetFileIndexes SymSrvGetFileIndexes
  2903. #define SymSrvGetFileIndexString SymSrvGetFileIndexStringW
  2904. #define SymSrvStoreFile SymSrvStoreFileW
  2905. #define SymGetSymbolFile SymGetSymbolFileW
  2906. #define EnumerateLoadedModules64 EnumerateLoadedModulesW64
  2907. #define EnumerateLoadedModulesEx EnumerateLoadedModulesExW
  2908. #define SymSrvGetFileIndexInfo SymSrvGetFileIndexInfoW
  2909. #define IMAGEHLP_LINE64 IMAGEHLP_LINEW64
  2910. #define PIMAGEHLP_LINE64 PIMAGEHLP_LINEW64
  2911. #define SYMBOL_INFO SYMBOL_INFOW
  2912. #define PSYMBOL_INFO PSYMBOL_INFOW
  2913. #define SYMBOL_INFO_PACKAGE SYMBOL_INFO_PACKAGEW
  2914. #define PSYMBOL_INFO_PACKAGE PSYMBOL_INFO_PACKAGEW
  2915. #define FIND_EXE_FILE_CALLBACK FIND_EXE_FILE_CALLBACKW
  2916. #define PFIND_EXE_FILE_CALLBACK PFIND_EXE_FILE_CALLBACKW
  2917. #define SYM_ENUMERATESYMBOLS_CALLBACK SYM_ENUMERATESYMBOLS_CALLBACKW
  2918. #define PSYM_ENUMERATESYMBOLS_CALLBACK PSYM_ENUMERATESYMBOLS_CALLBACKW
  2919. #define SRCCODEINFO SRCCODEINFOW
  2920. #define PSRCCODEINFO PSRCCODEINFOW
  2921. #define SOURCEFILE SOURCEFILEW
  2922. #define PSOURCEFILE PSOURCEFILEW
  2923. #define SYM_ENUMSOURECFILES_CALLBACK SYM_ENUMSOURCEFILES_CALLBACKW
  2924. #define PSYM_ENUMSOURCEFILES_CALLBACK PSYM_ENUMSOURECFILES_CALLBACKW
  2925. #define IMAGEHLP_CBA_EVENT IMAGEHLP_CBA_EVENTW
  2926. #define PIMAGEHLP_CBA_EVENT PIMAGEHLP_CBA_EVENTW
  2927. #define PENUMDIRTREE_CALLBACK PENUMDIRTREE_CALLBACKW
  2928. #define IMAGEHLP_DEFERRED_SYMBOL_LOAD64 IMAGEHLP_DEFERRED_SYMBOL_LOADW64
  2929. #define PIMAGEHLP_DEFERRED_SYMBOL_LOAD64 PIMAGEHLP_DEFERRED_SYMBOL_LOADW64
  2930. #define PFIND_DEBUG_FILE_CALLBACK PFIND_DEBUG_FILE_CALLBACKW
  2931. #define PFINDFILEINPATHCALLBACK PFINDFILEINPATHCALLBACKW
  2932. #define IMAGEHLP_MODULE64 IMAGEHLP_MODULEW64
  2933. #define PIMAGEHLP_MODULE64 PIMAGEHLP_MODULEW64
  2934. #define SYMSRV_INDEX_INFO SYMSRV_INDEX_INFOW
  2935. #define PSYMSRV_INDEX_INFO PSYMSRV_INDEX_INFOW
  2936. #define PSYMBOLSERVERPROC PSYMBOLSERVERPROCW
  2937. #define PSYMBOLSERVERPINGPROC PSYMBOLSERVERPINGPROCW
  2938. #endif
  2939. // -----------------------------------------------------------------
  2940. // The following APIs exist only for backwards compatibility
  2941. // with a pre-release version documented in an MSDN release.
  2942. // You should use SymFindFileInPath if you want to maintain
  2943. // future compatibility.
  2944. DBHLP_DEPRECIATED
  2945. BOOL
  2946. IMAGEAPI
  2947. FindFileInPath(
  2948. __in HANDLE hprocess,
  2949. __in PCSTR SearchPath,
  2950. __in PCSTR FileName,
  2951. __in PVOID id,
  2952. __in DWORD two,
  2953. __in DWORD three,
  2954. __in DWORD flags,
  2955. __out_ecount(MAX_PATH + 1) PSTR FilePath
  2956. );
  2957. // You should use SymFindFileInPath if you want to maintain
  2958. // future compatibility.
  2959. DBHLP_DEPRECIATED
  2960. BOOL
  2961. IMAGEAPI
  2962. FindFileInSearchPath(
  2963. __in HANDLE hprocess,
  2964. __in PCSTR SearchPath,
  2965. __in PCSTR FileName,
  2966. __in DWORD one,
  2967. __in DWORD two,
  2968. __in DWORD three,
  2969. __out_ecount(MAX_PATH + 1) PSTR FilePath
  2970. );
  2971. DBHLP_DEPRECIATED
  2972. BOOL
  2973. IMAGEAPI
  2974. SymEnumSym(
  2975. __in HANDLE hProcess,
  2976. __in ULONG64 BaseOfDll,
  2977. __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
  2978. __in_opt PVOID UserContext
  2979. );
  2980. DBHLP_DEPRECIATED
  2981. BOOL
  2982. IMAGEAPI
  2983. SymEnumerateSymbols64(
  2984. __in HANDLE hProcess,
  2985. __in ULONG64 BaseOfDll,
  2986. __in PSYM_ENUMSYMBOLS_CALLBACK64 EnumSymbolsCallback,
  2987. __in_opt PVOID UserContext
  2988. );
  2989. DBHLP_DEPRECIATED
  2990. BOOL
  2991. IMAGEAPI
  2992. SymEnumerateSymbolsW64(
  2993. __in HANDLE hProcess,
  2994. __in ULONG64 BaseOfDll,
  2995. __in PSYM_ENUMSYMBOLS_CALLBACK64W EnumSymbolsCallback,
  2996. __in_opt PVOID UserContext
  2997. );
  2998. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  2999. #define SymEnumerateSymbols SymEnumerateSymbols64
  3000. #define SymEnumerateSymbolsW SymEnumerateSymbolsW64
  3001. #else
  3002. DBHLP_DEPRECIATED
  3003. BOOL
  3004. IMAGEAPI
  3005. SymEnumerateSymbols(
  3006. __in HANDLE hProcess,
  3007. __in ULONG BaseOfDll,
  3008. __in PSYM_ENUMSYMBOLS_CALLBACK EnumSymbolsCallback,
  3009. __in_opt PVOID UserContext
  3010. );
  3011. DBHLP_DEPRECIATED
  3012. BOOL
  3013. IMAGEAPI
  3014. SymEnumerateSymbolsW(
  3015. __in HANDLE hProcess,
  3016. __in ULONG BaseOfDll,
  3017. __in PSYM_ENUMSYMBOLS_CALLBACKW EnumSymbolsCallback,
  3018. __in_opt PVOID UserContext
  3019. );
  3020. #endif
  3021. // use SymLoadModuleEx
  3022. DWORD64
  3023. IMAGEAPI
  3024. SymLoadModule64(
  3025. __in HANDLE hProcess,
  3026. __in_opt HANDLE hFile,
  3027. __in_opt PCSTR ImageName,
  3028. __in_opt PCSTR ModuleName,
  3029. __in DWORD64 BaseOfDll,
  3030. __in DWORD SizeOfDll
  3031. );
  3032. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  3033. #define SymLoadModule SymLoadModule64
  3034. #else
  3035. DWORD
  3036. IMAGEAPI
  3037. SymLoadModule(
  3038. __in HANDLE hProcess,
  3039. __in_opt HANDLE hFile,
  3040. __in_opt PCSTR ImageName,
  3041. __in_opt PCSTR ModuleName,
  3042. __in DWORD BaseOfDll,
  3043. __in DWORD SizeOfDll
  3044. );
  3045. #endif
  3046. BOOL
  3047. IMAGEAPI
  3048. SymGetSymNext64(
  3049. __in HANDLE hProcess,
  3050. __inout PIMAGEHLP_SYMBOL64 Symbol
  3051. );
  3052. BOOL
  3053. IMAGEAPI
  3054. SymGetSymNextW64(
  3055. __in HANDLE hProcess,
  3056. __inout PIMAGEHLP_SYMBOLW64 Symbol
  3057. );
  3058. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  3059. #define SymGetSymNext SymGetSymNext64
  3060. #define SymGetSymNextW SymGetSymNextW64
  3061. #else
  3062. BOOL
  3063. IMAGEAPI
  3064. SymGetSymNext(
  3065. __in HANDLE hProcess,
  3066. __inout PIMAGEHLP_SYMBOL Symbol
  3067. );
  3068. BOOL
  3069. IMAGEAPI
  3070. SymGetSymNextW(
  3071. __in HANDLE hProcess,
  3072. __inout PIMAGEHLP_SYMBOLW Symbol
  3073. );
  3074. #endif
  3075. BOOL
  3076. IMAGEAPI
  3077. SymGetSymPrev64(
  3078. __in HANDLE hProcess,
  3079. __inout PIMAGEHLP_SYMBOL64 Symbol
  3080. );
  3081. BOOL
  3082. IMAGEAPI
  3083. SymGetSymPrevW64(
  3084. __in HANDLE hProcess,
  3085. __inout PIMAGEHLP_SYMBOLW64 Symbol
  3086. );
  3087. #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
  3088. #define SymGetSymPrev SymGetSymPrev64
  3089. #define SymGetSymPrevW SymGetSymPrevW64
  3090. #else
  3091. BOOL
  3092. IMAGEAPI
  3093. SymGetSymPrev(
  3094. __in HANDLE hProcess,
  3095. __inout PIMAGEHLP_SYMBOL Symbol
  3096. );
  3097. BOOL
  3098. IMAGEAPI
  3099. SymGetSymPrevW(
  3100. __in HANDLE hProcess,
  3101. __inout PIMAGEHLP_SYMBOLW Symbol
  3102. );
  3103. #endif
  3104. // These values should not be used.
  3105. // They have been replaced by SYMFLAG_ values.
  3106. #define SYMF_OMAP_GENERATED 0x00000001
  3107. #define SYMF_OMAP_MODIFIED 0x00000002
  3108. #define SYMF_REGISTER 0x00000008
  3109. #define SYMF_REGREL 0x00000010
  3110. #define SYMF_FRAMEREL 0x00000020
  3111. #define SYMF_PARAMETER 0x00000040
  3112. #define SYMF_LOCAL 0x00000080
  3113. #define SYMF_CONSTANT 0x00000100
  3114. #define SYMF_EXPORT 0x00000200
  3115. #define SYMF_FORWARDER 0x00000400
  3116. #define SYMF_FUNCTION 0x00000800
  3117. #define SYMF_VIRTUAL 0x00001000
  3118. #define SYMF_THUNK 0x00002000
  3119. #define SYMF_TLSREL 0x00004000
  3120. // These values should also not be used.
  3121. // They have been replaced by SYMFLAG_ values.
  3122. #define IMAGEHLP_SYMBOL_INFO_VALUEPRESENT 1
  3123. #define IMAGEHLP_SYMBOL_INFO_REGISTER SYMF_REGISTER // 0x0008
  3124. #define IMAGEHLP_SYMBOL_INFO_REGRELATIVE SYMF_REGREL // 0x0010
  3125. #define IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE SYMF_FRAMEREL // 0x0020
  3126. #define IMAGEHLP_SYMBOL_INFO_PARAMETER SYMF_PARAMETER // 0x0040
  3127. #define IMAGEHLP_SYMBOL_INFO_LOCAL SYMF_LOCAL // 0x0080
  3128. #define IMAGEHLP_SYMBOL_INFO_CONSTANT SYMF_CONSTANT // 0x0100
  3129. #define IMAGEHLP_SYMBOL_FUNCTION SYMF_FUNCTION // 0x0800
  3130. #define IMAGEHLP_SYMBOL_VIRTUAL SYMF_VIRTUAL // 0x1000
  3131. #define IMAGEHLP_SYMBOL_THUNK SYMF_THUNK // 0x2000
  3132. #define IMAGEHLP_SYMBOL_INFO_TLSRELATIVE SYMF_TLSREL // 0x4000
  3133. #include <poppack.h>
  3134. #include <pshpack4.h>
  3135. #if defined(_MSC_VER)
  3136. #if _MSC_VER >= 800
  3137. #if _MSC_VER >= 1200
  3138. #pragma warning(push)
  3139. #endif
  3140. #pragma warning(disable:4200) /* Zero length array */
  3141. #pragma warning(disable:4201) /* Nameless struct/union */
  3142. #endif
  3143. #endif
  3144. #define MINIDUMP_SIGNATURE ('PMDM')
  3145. #define MINIDUMP_VERSION (42899)
  3146. typedef DWORD RVA;
  3147. typedef ULONG64 RVA64;
  3148. typedef struct _MINIDUMP_LOCATION_DESCRIPTOR {
  3149. ULONG32 DataSize;
  3150. RVA Rva;
  3151. } MINIDUMP_LOCATION_DESCRIPTOR;
  3152. typedef struct _MINIDUMP_LOCATION_DESCRIPTOR64 {
  3153. ULONG64 DataSize;
  3154. RVA64 Rva;
  3155. } MINIDUMP_LOCATION_DESCRIPTOR64;
  3156. typedef struct _MINIDUMP_MEMORY_DESCRIPTOR {
  3157. ULONG64 StartOfMemoryRange;
  3158. MINIDUMP_LOCATION_DESCRIPTOR Memory;
  3159. } MINIDUMP_MEMORY_DESCRIPTOR, *PMINIDUMP_MEMORY_DESCRIPTOR;
  3160. // DESCRIPTOR64 is used for full-memory minidumps where
  3161. // all of the raw memory is laid out sequentially at the
  3162. // end of the dump. There is no need for individual RVAs
  3163. // as the RVA is the base RVA plus the sum of the preceeding
  3164. // data blocks.
  3165. typedef struct _MINIDUMP_MEMORY_DESCRIPTOR64 {
  3166. ULONG64 StartOfMemoryRange;
  3167. ULONG64 DataSize;
  3168. } MINIDUMP_MEMORY_DESCRIPTOR64, *PMINIDUMP_MEMORY_DESCRIPTOR64;
  3169. typedef struct _MINIDUMP_HEADER {
  3170. ULONG32 Signature;
  3171. ULONG32 Version;
  3172. ULONG32 NumberOfStreams;
  3173. RVA StreamDirectoryRva;
  3174. ULONG32 CheckSum;
  3175. union {
  3176. ULONG32 Reserved;
  3177. ULONG32 TimeDateStamp;
  3178. };
  3179. ULONG64 Flags;
  3180. } MINIDUMP_HEADER, *PMINIDUMP_HEADER;
  3181. //
  3182. // The MINIDUMP_HEADER field StreamDirectoryRva points to
  3183. // an array of MINIDUMP_DIRECTORY structures.
  3184. //
  3185. typedef struct _MINIDUMP_DIRECTORY {
  3186. ULONG32 StreamType;
  3187. MINIDUMP_LOCATION_DESCRIPTOR Location;
  3188. } MINIDUMP_DIRECTORY, *PMINIDUMP_DIRECTORY;
  3189. typedef struct _MINIDUMP_STRING {
  3190. ULONG32 Length; // Length in bytes of the string
  3191. WCHAR Buffer [0]; // Variable size buffer
  3192. } MINIDUMP_STRING, *PMINIDUMP_STRING;
  3193. //
  3194. // The MINIDUMP_DIRECTORY field StreamType may be one of the following types.
  3195. // Types will be added in the future, so if a program reading the minidump
  3196. // header encounters a stream type it does not understand it should ignore
  3197. // the data altogether. Any tag above LastReservedStream will not be used by
  3198. // the system and is reserved for program-specific information.
  3199. //
  3200. typedef enum _MINIDUMP_STREAM_TYPE {
  3201. UnusedStream = 0,
  3202. ReservedStream0 = 1,
  3203. ReservedStream1 = 2,
  3204. ThreadListStream = 3,
  3205. ModuleListStream = 4,
  3206. MemoryListStream = 5,
  3207. ExceptionStream = 6,
  3208. SystemInfoStream = 7,
  3209. ThreadExListStream = 8,
  3210. Memory64ListStream = 9,
  3211. CommentStreamA = 10,
  3212. CommentStreamW = 11,
  3213. HandleDataStream = 12,
  3214. FunctionTableStream = 13,
  3215. UnloadedModuleListStream = 14,
  3216. MiscInfoStream = 15,
  3217. MemoryInfoListStream = 16,
  3218. ThreadInfoListStream = 17,
  3219. HandleOperationListStream = 18,
  3220. TokenStream = 19,
  3221. ceStreamNull = 0x8000,
  3222. ceStreamSystemInfo = 0x8001,
  3223. ceStreamException = 0x8002,
  3224. ceStreamModuleList = 0x8003,
  3225. ceStreamProcessList = 0x8004,
  3226. ceStreamThreadList = 0x8005,
  3227. ceStreamThreadContextList = 0x8006,
  3228. ceStreamThreadCallStackList = 0x8007,
  3229. ceStreamMemoryVirtualList = 0x8008,
  3230. ceStreamMemoryPhysicalList = 0x8009,
  3231. ceStreamBucketParameters = 0x800A,
  3232. ceStreamProcessModuleMap = 0x800B,
  3233. ceStreamDiagnosisList = 0x800C,
  3234. LastReservedStream = 0xffff
  3235. } MINIDUMP_STREAM_TYPE;
  3236. //
  3237. // The minidump system information contains processor and
  3238. // Operating System specific information.
  3239. //
  3240. //
  3241. // CPU information is obtained from one of two places.
  3242. //
  3243. // 1) On x86 computers, CPU_INFORMATION is obtained from the CPUID
  3244. // instruction. You must use the X86 portion of the union for X86
  3245. // computers.
  3246. //
  3247. // 2) On non-x86 architectures, CPU_INFORMATION is obtained by calling
  3248. // IsProcessorFeatureSupported().
  3249. //
  3250. typedef union _CPU_INFORMATION {
  3251. //
  3252. // X86 platforms use CPUID function to obtain processor information.
  3253. //
  3254. struct {
  3255. //
  3256. // CPUID Subfunction 0, register EAX (VendorId [0]),
  3257. // EBX (VendorId [1]) and ECX (VendorId [2]).
  3258. //
  3259. ULONG32 VendorId [ 3 ];
  3260. //
  3261. // CPUID Subfunction 1, register EAX
  3262. //
  3263. ULONG32 VersionInformation;
  3264. //
  3265. // CPUID Subfunction 1, register EDX
  3266. //
  3267. ULONG32 FeatureInformation;
  3268. //
  3269. // CPUID, Subfunction 80000001, register EBX. This will only
  3270. // be obtained if the vendor id is "AuthenticAMD".
  3271. //
  3272. ULONG32 AMDExtendedCpuFeatures;
  3273. } X86CpuInfo;
  3274. //
  3275. // Non-x86 platforms use processor feature flags.
  3276. //
  3277. struct {
  3278. ULONG64 ProcessorFeatures [ 2 ];
  3279. } OtherCpuInfo;
  3280. } CPU_INFORMATION, *PCPU_INFORMATION;
  3281. typedef struct _MINIDUMP_SYSTEM_INFO {
  3282. //
  3283. // ProcessorArchitecture, ProcessorLevel and ProcessorRevision are all
  3284. // taken from the SYSTEM_INFO structure obtained by GetSystemInfo( ).
  3285. //
  3286. USHORT ProcessorArchitecture;
  3287. USHORT ProcessorLevel;
  3288. USHORT ProcessorRevision;
  3289. union {
  3290. USHORT Reserved0;
  3291. struct {
  3292. UCHAR NumberOfProcessors;
  3293. UCHAR ProductType;
  3294. };
  3295. };
  3296. //
  3297. // MajorVersion, MinorVersion, BuildNumber, PlatformId and
  3298. // CSDVersion are all taken from the OSVERSIONINFO structure
  3299. // returned by GetVersionEx( ).
  3300. //
  3301. ULONG32 MajorVersion;
  3302. ULONG32 MinorVersion;
  3303. ULONG32 BuildNumber;
  3304. ULONG32 PlatformId;
  3305. //
  3306. // RVA to a CSDVersion string in the string table.
  3307. //
  3308. RVA CSDVersionRva;
  3309. union {
  3310. ULONG32 Reserved1;
  3311. struct {
  3312. USHORT SuiteMask;
  3313. USHORT Reserved2;
  3314. };
  3315. };
  3316. CPU_INFORMATION Cpu;
  3317. } MINIDUMP_SYSTEM_INFO, *PMINIDUMP_SYSTEM_INFO;
  3318. //
  3319. // The minidump thread contains standard thread
  3320. // information plus an RVA to the memory for this
  3321. // thread and an RVA to the CONTEXT structure for
  3322. // this thread.
  3323. //
  3324. //
  3325. // ThreadId must be 4 bytes on all architectures.
  3326. //
  3327. C_ASSERT (sizeof ( ((PPROCESS_INFORMATION)0)->dwThreadId ) == 4);
  3328. typedef struct _MINIDUMP_THREAD {
  3329. ULONG32 ThreadId;
  3330. ULONG32 SuspendCount;
  3331. ULONG32 PriorityClass;
  3332. ULONG32 Priority;
  3333. ULONG64 Teb;
  3334. MINIDUMP_MEMORY_DESCRIPTOR Stack;
  3335. MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
  3336. } MINIDUMP_THREAD, *PMINIDUMP_THREAD;
  3337. //
  3338. // The thread list is a container of threads.
  3339. //
  3340. typedef struct _MINIDUMP_THREAD_LIST {
  3341. ULONG32 NumberOfThreads;
  3342. MINIDUMP_THREAD Threads [0];
  3343. } MINIDUMP_THREAD_LIST, *PMINIDUMP_THREAD_LIST;
  3344. typedef struct _MINIDUMP_THREAD_EX {
  3345. ULONG32 ThreadId;
  3346. ULONG32 SuspendCount;
  3347. ULONG32 PriorityClass;
  3348. ULONG32 Priority;
  3349. ULONG64 Teb;
  3350. MINIDUMP_MEMORY_DESCRIPTOR Stack;
  3351. MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
  3352. MINIDUMP_MEMORY_DESCRIPTOR BackingStore;
  3353. } MINIDUMP_THREAD_EX, *PMINIDUMP_THREAD_EX;
  3354. //
  3355. // The thread list is a container of threads.
  3356. //
  3357. typedef struct _MINIDUMP_THREAD_EX_LIST {
  3358. ULONG32 NumberOfThreads;
  3359. MINIDUMP_THREAD_EX Threads [0];
  3360. } MINIDUMP_THREAD_EX_LIST, *PMINIDUMP_THREAD_EX_LIST;
  3361. //
  3362. // The MINIDUMP_EXCEPTION is the same as EXCEPTION on Win64.
  3363. //
  3364. typedef struct _MINIDUMP_EXCEPTION {
  3365. ULONG32 ExceptionCode;
  3366. ULONG32 ExceptionFlags;
  3367. ULONG64 ExceptionRecord;
  3368. ULONG64 ExceptionAddress;
  3369. ULONG32 NumberParameters;
  3370. ULONG32 __unusedAlignment;
  3371. ULONG64 ExceptionInformation [ EXCEPTION_MAXIMUM_PARAMETERS ];
  3372. } MINIDUMP_EXCEPTION, *PMINIDUMP_EXCEPTION;
  3373. //
  3374. // The exception information stream contains the id of the thread that caused
  3375. // the exception (ThreadId), the exception record for the exception
  3376. // (ExceptionRecord) and an RVA to the thread context where the exception
  3377. // occured.
  3378. //
  3379. typedef struct MINIDUMP_EXCEPTION_STREAM {
  3380. ULONG32 ThreadId;
  3381. ULONG32 __alignment;
  3382. MINIDUMP_EXCEPTION ExceptionRecord;
  3383. MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
  3384. } MINIDUMP_EXCEPTION_STREAM, *PMINIDUMP_EXCEPTION_STREAM;
  3385. //
  3386. // The MINIDUMP_MODULE contains information about a
  3387. // a specific module. It includes the CheckSum and
  3388. // the TimeDateStamp for the module so the module
  3389. // can be reloaded during the analysis phase.
  3390. //
  3391. typedef struct _MINIDUMP_MODULE {
  3392. ULONG64 BaseOfImage;
  3393. ULONG32 SizeOfImage;
  3394. ULONG32 CheckSum;
  3395. ULONG32 TimeDateStamp;
  3396. RVA ModuleNameRva;
  3397. VS_FIXEDFILEINFO VersionInfo;
  3398. MINIDUMP_LOCATION_DESCRIPTOR CvRecord;
  3399. MINIDUMP_LOCATION_DESCRIPTOR MiscRecord;
  3400. ULONG64 Reserved0; // Reserved for future use.
  3401. ULONG64 Reserved1; // Reserved for future use.
  3402. } MINIDUMP_MODULE, *PMINIDUMP_MODULE;
  3403. //
  3404. // The minidump module list is a container for modules.
  3405. //
  3406. typedef struct _MINIDUMP_MODULE_LIST {
  3407. ULONG32 NumberOfModules;
  3408. MINIDUMP_MODULE Modules [ 0 ];
  3409. } MINIDUMP_MODULE_LIST, *PMINIDUMP_MODULE_LIST;
  3410. //
  3411. // Memory Ranges
  3412. //
  3413. typedef struct _MINIDUMP_MEMORY_LIST {
  3414. ULONG32 NumberOfMemoryRanges;
  3415. MINIDUMP_MEMORY_DESCRIPTOR MemoryRanges [0];
  3416. } MINIDUMP_MEMORY_LIST, *PMINIDUMP_MEMORY_LIST;
  3417. typedef struct _MINIDUMP_MEMORY64_LIST {
  3418. ULONG64 NumberOfMemoryRanges;
  3419. RVA64 BaseRva;
  3420. MINIDUMP_MEMORY_DESCRIPTOR64 MemoryRanges [0];
  3421. } MINIDUMP_MEMORY64_LIST, *PMINIDUMP_MEMORY64_LIST;
  3422. //
  3423. // Support for user supplied exception information.
  3424. //
  3425. typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
  3426. DWORD ThreadId;
  3427. PEXCEPTION_POINTERS ExceptionPointers;
  3428. BOOL ClientPointers;
  3429. } MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;
  3430. typedef struct _MINIDUMP_EXCEPTION_INFORMATION64 {
  3431. DWORD ThreadId;
  3432. ULONG64 ExceptionRecord;
  3433. ULONG64 ContextRecord;
  3434. BOOL ClientPointers;
  3435. } MINIDUMP_EXCEPTION_INFORMATION64, *PMINIDUMP_EXCEPTION_INFORMATION64;
  3436. //
  3437. // Support for capturing system handle state at the time of the dump.
  3438. //
  3439. // Per-handle object information varies according to
  3440. // the OS, the OS version, the processor type and
  3441. // so on. The minidump gives a minidump identifier
  3442. // to each possible data format for identification
  3443. // purposes but does not control nor describe the actual data.
  3444. typedef enum _MINIDUMP_HANDLE_OBJECT_INFORMATION_TYPE {
  3445. MiniHandleObjectInformationNone,
  3446. MiniThreadInformation1,
  3447. MiniMutantInformation1,
  3448. MiniMutantInformation2,
  3449. MiniProcessInformation1,
  3450. MiniProcessInformation2,
  3451. MiniHandleObjectInformationTypeMax
  3452. } MINIDUMP_HANDLE_OBJECT_INFORMATION_TYPE;
  3453. typedef struct _MINIDUMP_HANDLE_OBJECT_INFORMATION {
  3454. RVA NextInfoRva;
  3455. ULONG32 InfoType;
  3456. ULONG32 SizeOfInfo;
  3457. // Raw information follows.
  3458. } MINIDUMP_HANDLE_OBJECT_INFORMATION;
  3459. typedef struct _MINIDUMP_HANDLE_DESCRIPTOR {
  3460. ULONG64 Handle;
  3461. RVA TypeNameRva;
  3462. RVA ObjectNameRva;
  3463. ULONG32 Attributes;
  3464. ULONG32 GrantedAccess;
  3465. ULONG32 HandleCount;
  3466. ULONG32 PointerCount;
  3467. } MINIDUMP_HANDLE_DESCRIPTOR, *PMINIDUMP_HANDLE_DESCRIPTOR;
  3468. typedef struct _MINIDUMP_HANDLE_DESCRIPTOR_2 {
  3469. ULONG64 Handle;
  3470. RVA TypeNameRva;
  3471. RVA ObjectNameRva;
  3472. ULONG32 Attributes;
  3473. ULONG32 GrantedAccess;
  3474. ULONG32 HandleCount;
  3475. ULONG32 PointerCount;
  3476. RVA ObjectInfoRva;
  3477. ULONG32 Reserved0;
  3478. } MINIDUMP_HANDLE_DESCRIPTOR_2, *PMINIDUMP_HANDLE_DESCRIPTOR_2;
  3479. // The latest MINIDUMP_HANDLE_DESCRIPTOR definition.
  3480. typedef MINIDUMP_HANDLE_DESCRIPTOR_2 MINIDUMP_HANDLE_DESCRIPTOR_N;
  3481. typedef MINIDUMP_HANDLE_DESCRIPTOR_N *PMINIDUMP_HANDLE_DESCRIPTOR_N;
  3482. typedef struct _MINIDUMP_HANDLE_DATA_STREAM {
  3483. ULONG32 SizeOfHeader;
  3484. ULONG32 SizeOfDescriptor;
  3485. ULONG32 NumberOfDescriptors;
  3486. ULONG32 Reserved;
  3487. } MINIDUMP_HANDLE_DATA_STREAM, *PMINIDUMP_HANDLE_DATA_STREAM;
  3488. // Some operating systems can track the last operations
  3489. // performed on a handle. For example, Application Verifier
  3490. // can enable this for some versions of Windows. The
  3491. // handle operation list collects handle operations
  3492. // known for the dump target.
  3493. // Each entry is an AVRF_HANDLE_OPERATION.
  3494. typedef struct _MINIDUMP_HANDLE_OPERATION_LIST {
  3495. ULONG32 SizeOfHeader;
  3496. ULONG32 SizeOfEntry;
  3497. ULONG32 NumberOfEntries;
  3498. ULONG32 Reserved;
  3499. } MINIDUMP_HANDLE_OPERATION_LIST, *PMINIDUMP_HANDLE_OPERATION_LIST;
  3500. //
  3501. // Support for capturing dynamic function table state at the time of the dump.
  3502. //
  3503. typedef struct _MINIDUMP_FUNCTION_TABLE_DESCRIPTOR {
  3504. ULONG64 MinimumAddress;
  3505. ULONG64 MaximumAddress;
  3506. ULONG64 BaseAddress;
  3507. ULONG32 EntryCount;
  3508. ULONG32 SizeOfAlignPad;
  3509. } MINIDUMP_FUNCTION_TABLE_DESCRIPTOR, *PMINIDUMP_FUNCTION_TABLE_DESCRIPTOR;
  3510. typedef struct _MINIDUMP_FUNCTION_TABLE_STREAM {
  3511. ULONG32 SizeOfHeader;
  3512. ULONG32 SizeOfDescriptor;
  3513. ULONG32 SizeOfNativeDescriptor;
  3514. ULONG32 SizeOfFunctionEntry;
  3515. ULONG32 NumberOfDescriptors;
  3516. ULONG32 SizeOfAlignPad;
  3517. } MINIDUMP_FUNCTION_TABLE_STREAM, *PMINIDUMP_FUNCTION_TABLE_STREAM;
  3518. //
  3519. // The MINIDUMP_UNLOADED_MODULE contains information about a
  3520. // a specific module that was previously loaded but no
  3521. // longer is. This can help with diagnosing problems where
  3522. // callers attempt to call code that is no longer loaded.
  3523. //
  3524. typedef struct _MINIDUMP_UNLOADED_MODULE {
  3525. ULONG64 BaseOfImage;
  3526. ULONG32 SizeOfImage;
  3527. ULONG32 CheckSum;
  3528. ULONG32 TimeDateStamp;
  3529. RVA ModuleNameRva;
  3530. } MINIDUMP_UNLOADED_MODULE, *PMINIDUMP_UNLOADED_MODULE;
  3531. //
  3532. // The minidump unloaded module list is a container for unloaded modules.
  3533. //
  3534. typedef struct _MINIDUMP_UNLOADED_MODULE_LIST {
  3535. ULONG32 SizeOfHeader;
  3536. ULONG32 SizeOfEntry;
  3537. ULONG32 NumberOfEntries;
  3538. } MINIDUMP_UNLOADED_MODULE_LIST, *PMINIDUMP_UNLOADED_MODULE_LIST;
  3539. //
  3540. // The miscellaneous information stream contains a variety
  3541. // of small pieces of information. A member is valid if
  3542. // it's within the available size and its corresponding
  3543. // bit is set.
  3544. //
  3545. #define MINIDUMP_MISC1_PROCESS_ID 0x00000001
  3546. #define MINIDUMP_MISC1_PROCESS_TIMES 0x00000002
  3547. #define MINIDUMP_MISC1_PROCESSOR_POWER_INFO 0x00000004
  3548. #define MINIDUMP_MISC3_PROCESS_INTEGRITY 0x00000010
  3549. #define MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS 0x00000020
  3550. #define MINIDUMP_MISC3_TIMEZONE 0x00000040
  3551. #define MINIDUMP_MISC3_PROTECTED_PROCESS 0x00000080
  3552. typedef struct _MINIDUMP_MISC_INFO {
  3553. ULONG32 SizeOfInfo;
  3554. ULONG32 Flags1;
  3555. ULONG32 ProcessId;
  3556. ULONG32 ProcessCreateTime;
  3557. ULONG32 ProcessUserTime;
  3558. ULONG32 ProcessKernelTime;
  3559. } MINIDUMP_MISC_INFO, *PMINIDUMP_MISC_INFO;
  3560. typedef struct _MINIDUMP_MISC_INFO_2 {
  3561. ULONG32 SizeOfInfo;
  3562. ULONG32 Flags1;
  3563. ULONG32 ProcessId;
  3564. ULONG32 ProcessCreateTime;
  3565. ULONG32 ProcessUserTime;
  3566. ULONG32 ProcessKernelTime;
  3567. ULONG32 ProcessorMaxMhz;
  3568. ULONG32 ProcessorCurrentMhz;
  3569. ULONG32 ProcessorMhzLimit;
  3570. ULONG32 ProcessorMaxIdleState;
  3571. ULONG32 ProcessorCurrentIdleState;
  3572. } MINIDUMP_MISC_INFO_2, *PMINIDUMP_MISC_INFO_2;
  3573. typedef struct _MINIDUMP_MISC_INFO_3 {
  3574. ULONG32 SizeOfInfo;
  3575. ULONG32 Flags1;
  3576. ULONG32 ProcessId;
  3577. ULONG32 ProcessCreateTime;
  3578. ULONG32 ProcessUserTime;
  3579. ULONG32 ProcessKernelTime;
  3580. ULONG32 ProcessorMaxMhz;
  3581. ULONG32 ProcessorCurrentMhz;
  3582. ULONG32 ProcessorMhzLimit;
  3583. ULONG32 ProcessorMaxIdleState;
  3584. ULONG32 ProcessorCurrentIdleState;
  3585. ULONG32 ProcessIntegrityLevel;
  3586. ULONG32 ProcessExecuteFlags;
  3587. ULONG32 ProtectedProcess;
  3588. ULONG32 TimeZoneId;
  3589. TIME_ZONE_INFORMATION TimeZone;
  3590. } MINIDUMP_MISC_INFO_3, *PMINIDUMP_MISC_INFO_3;
  3591. // The latest MINIDUMP_MISC_INFO definition.
  3592. typedef MINIDUMP_MISC_INFO_3 MINIDUMP_MISC_INFO_N;
  3593. typedef MINIDUMP_MISC_INFO_N* PMINIDUMP_MISC_INFO_N;
  3594. //
  3595. // The memory information stream contains memory region
  3596. // description information. This stream corresponds to
  3597. // what VirtualQuery would return for the process the
  3598. // dump was created for.
  3599. //
  3600. typedef struct _MINIDUMP_MEMORY_INFO {
  3601. ULONG64 BaseAddress;
  3602. ULONG64 AllocationBase;
  3603. ULONG32 AllocationProtect;
  3604. ULONG32 __alignment1;
  3605. ULONG64 RegionSize;
  3606. ULONG32 State;
  3607. ULONG32 Protect;
  3608. ULONG32 Type;
  3609. ULONG32 __alignment2;
  3610. } MINIDUMP_MEMORY_INFO, *PMINIDUMP_MEMORY_INFO;
  3611. typedef struct _MINIDUMP_MEMORY_INFO_LIST {
  3612. ULONG SizeOfHeader;
  3613. ULONG SizeOfEntry;
  3614. ULONG64 NumberOfEntries;
  3615. } MINIDUMP_MEMORY_INFO_LIST, *PMINIDUMP_MEMORY_INFO_LIST;
  3616. //
  3617. // The memory information stream contains memory region
  3618. // description information. This stream corresponds to
  3619. // what VirtualQuery would return for the process the
  3620. // dump was created for.
  3621. //
  3622. // Thread dump writer status flags.
  3623. #define MINIDUMP_THREAD_INFO_ERROR_THREAD 0x00000001
  3624. #define MINIDUMP_THREAD_INFO_WRITING_THREAD 0x00000002
  3625. #define MINIDUMP_THREAD_INFO_EXITED_THREAD 0x00000004
  3626. #define MINIDUMP_THREAD_INFO_INVALID_INFO 0x00000008
  3627. #define MINIDUMP_THREAD_INFO_INVALID_CONTEXT 0x00000010
  3628. #define MINIDUMP_THREAD_INFO_INVALID_TEB 0x00000020
  3629. typedef struct _MINIDUMP_THREAD_INFO {
  3630. ULONG32 ThreadId;
  3631. ULONG32 DumpFlags;
  3632. ULONG32 DumpError;
  3633. ULONG32 ExitStatus;
  3634. ULONG64 CreateTime;
  3635. ULONG64 ExitTime;
  3636. ULONG64 KernelTime;
  3637. ULONG64 UserTime;
  3638. ULONG64 StartAddress;
  3639. ULONG64 Affinity;
  3640. } MINIDUMP_THREAD_INFO, *PMINIDUMP_THREAD_INFO;
  3641. typedef struct _MINIDUMP_THREAD_INFO_LIST {
  3642. ULONG SizeOfHeader;
  3643. ULONG SizeOfEntry;
  3644. ULONG NumberOfEntries;
  3645. } MINIDUMP_THREAD_INFO_LIST, *PMINIDUMP_THREAD_INFO_LIST;
  3646. //
  3647. // Support for token information.
  3648. //
  3649. typedef struct _MINIDUMP_TOKEN_INFO_HEADER {
  3650. ULONG TokenSize; // The size of the token structure.
  3651. ULONG TokenId; // The PID in NtOpenProcessToken() call or TID in NtOpenThreadToken() call.
  3652. ULONG64 TokenHandle; // The handle value returned.
  3653. } MINIDUMP_TOKEN_INFO_HEADER, *PMINIDUMP_TOKEN_INFO_HEADER;
  3654. typedef struct _MINIDUMP_TOKEN_INFO_LIST {
  3655. ULONG TokenListSize;
  3656. ULONG TokenListEntries;
  3657. ULONG ListHeaderSize;
  3658. ULONG ElementHeaderSize;
  3659. } MINIDUMP_TOKEN_INFO_LIST, *PMINIDUMP_TOKEN_INFO_LIST;
  3660. //
  3661. // Support for arbitrary user-defined information.
  3662. //
  3663. typedef struct _MINIDUMP_USER_RECORD {
  3664. ULONG32 Type;
  3665. MINIDUMP_LOCATION_DESCRIPTOR Memory;
  3666. } MINIDUMP_USER_RECORD, *PMINIDUMP_USER_RECORD;
  3667. typedef struct _MINIDUMP_USER_STREAM {
  3668. ULONG32 Type;
  3669. ULONG BufferSize;
  3670. PVOID Buffer;
  3671. } MINIDUMP_USER_STREAM, *PMINIDUMP_USER_STREAM;
  3672. typedef struct _MINIDUMP_USER_STREAM_INFORMATION {
  3673. ULONG UserStreamCount;
  3674. PMINIDUMP_USER_STREAM UserStreamArray;
  3675. } MINIDUMP_USER_STREAM_INFORMATION, *PMINIDUMP_USER_STREAM_INFORMATION;
  3676. //
  3677. // Callback support.
  3678. //
  3679. typedef enum _MINIDUMP_CALLBACK_TYPE {
  3680. ModuleCallback,
  3681. ThreadCallback,
  3682. ThreadExCallback,
  3683. IncludeThreadCallback,
  3684. IncludeModuleCallback,
  3685. MemoryCallback,
  3686. CancelCallback,
  3687. WriteKernelMinidumpCallback,
  3688. KernelMinidumpStatusCallback,
  3689. RemoveMemoryCallback,
  3690. IncludeVmRegionCallback,
  3691. IoStartCallback,
  3692. IoWriteAllCallback,
  3693. IoFinishCallback,
  3694. ReadMemoryFailureCallback,
  3695. SecondaryFlagsCallback,
  3696. } MINIDUMP_CALLBACK_TYPE;
  3697. typedef struct _MINIDUMP_THREAD_CALLBACK {
  3698. ULONG ThreadId;
  3699. HANDLE ThreadHandle;
  3700. CONTEXT Context;
  3701. ULONG SizeOfContext;
  3702. ULONG64 StackBase;
  3703. ULONG64 StackEnd;
  3704. } MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK;
  3705. typedef struct _MINIDUMP_THREAD_EX_CALLBACK {
  3706. ULONG ThreadId;
  3707. HANDLE ThreadHandle;
  3708. CONTEXT Context;
  3709. ULONG SizeOfContext;
  3710. ULONG64 StackBase;
  3711. ULONG64 StackEnd;
  3712. ULONG64 BackingStoreBase;
  3713. ULONG64 BackingStoreEnd;
  3714. } MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK;
  3715. typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK {
  3716. ULONG ThreadId;
  3717. } MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK;
  3718. typedef enum _THREAD_WRITE_FLAGS {
  3719. ThreadWriteThread = 0x0001,
  3720. ThreadWriteStack = 0x0002,
  3721. ThreadWriteContext = 0x0004,
  3722. ThreadWriteBackingStore = 0x0008,
  3723. ThreadWriteInstructionWindow = 0x0010,
  3724. ThreadWriteThreadData = 0x0020,
  3725. ThreadWriteThreadInfo = 0x0040,
  3726. } THREAD_WRITE_FLAGS;
  3727. typedef struct _MINIDUMP_MODULE_CALLBACK {
  3728. PWCHAR FullPath;
  3729. ULONG64 BaseOfImage;
  3730. ULONG SizeOfImage;
  3731. ULONG CheckSum;
  3732. ULONG TimeDateStamp;
  3733. VS_FIXEDFILEINFO VersionInfo;
  3734. PVOID CvRecord;
  3735. ULONG SizeOfCvRecord;
  3736. PVOID MiscRecord;
  3737. ULONG SizeOfMiscRecord;
  3738. } MINIDUMP_MODULE_CALLBACK, *PMINIDUMP_MODULE_CALLBACK;
  3739. typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK {
  3740. ULONG64 BaseOfImage;
  3741. } MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK;
  3742. typedef enum _MODULE_WRITE_FLAGS {
  3743. ModuleWriteModule = 0x0001,
  3744. ModuleWriteDataSeg = 0x0002,
  3745. ModuleWriteMiscRecord = 0x0004,
  3746. ModuleWriteCvRecord = 0x0008,
  3747. ModuleReferencedByMemory = 0x0010,
  3748. ModuleWriteTlsData = 0x0020,
  3749. ModuleWriteCodeSegs = 0x0040,
  3750. } MODULE_WRITE_FLAGS;
  3751. typedef struct _MINIDUMP_IO_CALLBACK {
  3752. HANDLE Handle;
  3753. ULONG64 Offset;
  3754. PVOID Buffer;
  3755. ULONG BufferBytes;
  3756. } MINIDUMP_IO_CALLBACK, *PMINIDUMP_IO_CALLBACK;
  3757. typedef struct _MINIDUMP_READ_MEMORY_FAILURE_CALLBACK
  3758. {
  3759. ULONG64 Offset;
  3760. ULONG Bytes;
  3761. HRESULT FailureStatus;
  3762. } MINIDUMP_READ_MEMORY_FAILURE_CALLBACK,
  3763. *PMINIDUMP_READ_MEMORY_FAILURE_CALLBACK;
  3764. typedef struct _MINIDUMP_CALLBACK_INPUT {
  3765. ULONG ProcessId;
  3766. HANDLE ProcessHandle;
  3767. ULONG CallbackType;
  3768. union {
  3769. HRESULT Status;
  3770. MINIDUMP_THREAD_CALLBACK Thread;
  3771. MINIDUMP_THREAD_EX_CALLBACK ThreadEx;
  3772. MINIDUMP_MODULE_CALLBACK Module;
  3773. MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread;
  3774. MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule;
  3775. MINIDUMP_IO_CALLBACK Io;
  3776. MINIDUMP_READ_MEMORY_FAILURE_CALLBACK ReadMemoryFailure;
  3777. ULONG SecondaryFlags;
  3778. };
  3779. } MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT;
  3780. typedef struct _MINIDUMP_CALLBACK_OUTPUT {
  3781. union {
  3782. ULONG ModuleWriteFlags;
  3783. ULONG ThreadWriteFlags;
  3784. ULONG SecondaryFlags;
  3785. struct {
  3786. ULONG64 MemoryBase;
  3787. ULONG MemorySize;
  3788. };
  3789. struct {
  3790. BOOL CheckCancel;
  3791. BOOL Cancel;
  3792. };
  3793. HANDLE Handle;
  3794. struct {
  3795. MINIDUMP_MEMORY_INFO VmRegion;
  3796. BOOL Continue;
  3797. };
  3798. HRESULT Status;
  3799. };
  3800. } MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT;
  3801. //
  3802. // A normal minidump contains just the information
  3803. // necessary to capture stack traces for all of the
  3804. // existing threads in a process.
  3805. //
  3806. // A minidump with data segments includes all of the data
  3807. // sections from loaded modules in order to capture
  3808. // global variable contents. This can make the dump much
  3809. // larger if many modules have global data.
  3810. //
  3811. // A minidump with full memory includes all of the accessible
  3812. // memory in the process and can be very large. A minidump
  3813. // with full memory always has the raw memory data at the end
  3814. // of the dump so that the initial structures in the dump can
  3815. // be mapped directly without having to include the raw
  3816. // memory information.
  3817. //
  3818. // Stack and backing store memory can be filtered to remove
  3819. // data unnecessary for stack walking. This can improve
  3820. // compression of stacks and also deletes data that may
  3821. // be private and should not be stored in a dump.
  3822. // Memory can also be scanned to see what modules are
  3823. // referenced by stack and backing store memory to allow
  3824. // omission of other modules to reduce dump size.
  3825. // In either of these modes the ModuleReferencedByMemory flag
  3826. // is set for all modules referenced before the base
  3827. // module callbacks occur.
  3828. //
  3829. // On some operating systems a list of modules that were
  3830. // recently unloaded is kept in addition to the currently
  3831. // loaded module list. This information can be saved in
  3832. // the dump if desired.
  3833. //
  3834. // Stack and backing store memory can be scanned for referenced
  3835. // pages in order to pick up data referenced by locals or other
  3836. // stack memory. This can increase the size of a dump significantly.
  3837. //
  3838. // Module paths may contain undesired information such as user names
  3839. // or other important directory names so they can be stripped. This
  3840. // option reduces the ability to locate the proper image later
  3841. // and should only be used in certain situations.
  3842. //
  3843. // Complete operating system per-process and per-thread information can
  3844. // be gathered and stored in the dump.
  3845. //
  3846. // The virtual address space can be scanned for various types
  3847. // of memory to be included in the dump.
  3848. //
  3849. // Code which is concerned with potentially private information
  3850. // getting into the minidump can set a flag that automatically
  3851. // modifies all existing and future flags to avoid placing
  3852. // unnecessary data in the dump. Basic data, such as stack
  3853. // information, will still be included but optional data, such
  3854. // as indirect memory, will not.
  3855. //
  3856. // When doing a full memory dump it's possible to store all
  3857. // of the enumerated memory region descriptive information
  3858. // in a memory information stream.
  3859. //
  3860. // Additional thread information beyond the basic thread
  3861. // structure can be collected if desired.
  3862. //
  3863. // A minidump with code segments includes all of the code
  3864. // and code-related sections from loaded modules in order
  3865. // to capture executable content.
  3866. //
  3867. // MiniDumpWithoutAuxiliaryState turns off any secondary,
  3868. // auxiliary-supported memory gathering.
  3869. //
  3870. // MiniDumpWithFullAuxiliaryState asks any present auxiliary
  3871. // data providers to include all of their state in the dump.
  3872. // The exact set of what is provided depends on the auxiliary.
  3873. // This can be quite large.
  3874. //
  3875. typedef enum _MINIDUMP_TYPE {
  3876. MiniDumpNormal = 0x00000000,
  3877. MiniDumpWithDataSegs = 0x00000001,
  3878. MiniDumpWithFullMemory = 0x00000002,
  3879. MiniDumpWithHandleData = 0x00000004,
  3880. MiniDumpFilterMemory = 0x00000008,
  3881. MiniDumpScanMemory = 0x00000010,
  3882. MiniDumpWithUnloadedModules = 0x00000020,
  3883. MiniDumpWithIndirectlyReferencedMemory = 0x00000040,
  3884. MiniDumpFilterModulePaths = 0x00000080,
  3885. MiniDumpWithProcessThreadData = 0x00000100,
  3886. MiniDumpWithPrivateReadWriteMemory = 0x00000200,
  3887. MiniDumpWithoutOptionalData = 0x00000400,
  3888. MiniDumpWithFullMemoryInfo = 0x00000800,
  3889. MiniDumpWithThreadInfo = 0x00001000,
  3890. MiniDumpWithCodeSegs = 0x00002000,
  3891. MiniDumpWithoutAuxiliaryState = 0x00004000,
  3892. MiniDumpWithFullAuxiliaryState = 0x00008000,
  3893. MiniDumpWithPrivateWriteCopyMemory = 0x00010000,
  3894. MiniDumpIgnoreInaccessibleMemory = 0x00020000,
  3895. MiniDumpWithTokenInformation = 0x00040000,
  3896. MiniDumpValidTypeFlags = 0x0007ffff,
  3897. } MINIDUMP_TYPE;
  3898. //
  3899. // In addition to the primary flags provided to
  3900. // MiniDumpWriteDump there are additional, less
  3901. // frequently used options queried via the secondary
  3902. // flags callback.
  3903. //
  3904. // MiniSecondaryWithoutPowerInfo suppresses the minidump
  3905. // query that retrieves processor power information for
  3906. // MINIDUMP_MISC_INFO.
  3907. //
  3908. typedef enum _MINIDUMP_SECONDARY_FLAGS {
  3909. MiniSecondaryWithoutPowerInfo = 0x00000001,
  3910. MiniSecondaryValidFlags = 0x00000001,
  3911. } MINIDUMP_SECONDARY_FLAGS;
  3912. //
  3913. // The minidump callback should modify the FieldsToWrite parameter to reflect
  3914. // what portions of the specified thread or module should be written to the
  3915. // file.
  3916. //
  3917. typedef
  3918. BOOL
  3919. (WINAPI * MINIDUMP_CALLBACK_ROUTINE) (
  3920. __inout PVOID CallbackParam,
  3921. __in PMINIDUMP_CALLBACK_INPUT CallbackInput,
  3922. __inout PMINIDUMP_CALLBACK_OUTPUT CallbackOutput
  3923. );
  3924. typedef struct _MINIDUMP_CALLBACK_INFORMATION {
  3925. MINIDUMP_CALLBACK_ROUTINE CallbackRoutine;
  3926. PVOID CallbackParam;
  3927. } MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION;
  3928. //++
  3929. //
  3930. // PVOID
  3931. // RVA_TO_ADDR(
  3932. // PVOID Mapping,
  3933. // ULONG Rva
  3934. // )
  3935. //
  3936. // Routine Description:
  3937. //
  3938. // Map an RVA that is contained within a mapped file to it's associated
  3939. // flat address.
  3940. //
  3941. // Arguments:
  3942. //
  3943. // Mapping - Base address of mapped file containing the RVA.
  3944. //
  3945. // Rva - An Rva to fixup.
  3946. //
  3947. // Return Values:
  3948. //
  3949. // A pointer to the desired data.
  3950. //
  3951. //--
  3952. #define RVA_TO_ADDR(Mapping,Rva) ((PVOID)(((ULONG_PTR) (Mapping)) + (Rva)))
  3953. BOOL
  3954. WINAPI
  3955. MiniDumpWriteDump(
  3956. __in HANDLE hProcess,
  3957. __in DWORD ProcessId,
  3958. __in HANDLE hFile,
  3959. __in MINIDUMP_TYPE DumpType,
  3960. __in_opt PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
  3961. __in_opt PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
  3962. __in_opt PMINIDUMP_CALLBACK_INFORMATION CallbackParam
  3963. );
  3964. BOOL
  3965. WINAPI
  3966. MiniDumpReadDumpStream(
  3967. __in PVOID BaseOfDump,
  3968. __in ULONG StreamNumber,
  3969. __deref_out_opt PMINIDUMP_DIRECTORY * Dir,
  3970. __deref_out_opt PVOID * StreamPointer,
  3971. __out_opt ULONG * StreamSize
  3972. );
  3973. #if defined(_MSC_VER)
  3974. #if _MSC_VER >= 800
  3975. #if _MSC_VER >= 1200
  3976. #pragma warning(pop)
  3977. #else
  3978. #pragma warning(default:4200) /* Zero length array */
  3979. #pragma warning(default:4201) /* Nameless struct/union */
  3980. #endif
  3981. #endif
  3982. #endif
  3983. #include <poppack.h>
  3984. #ifdef __cplusplus
  3985. }
  3986. #endif
  3987. #endif // _DBGHELP_