Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

810 lines
23 KiB

  1. #include <private.h>
  2. #include <globals.h>
  3. #include <delayimp.h>
  4. #include <copystr.h>
  5. #ifdef BUILD_DBGHELP
  6. BOOL
  7. GetDllVersionInfo(
  8. HINSTANCE hinst,
  9. LPVOID *lpVersionInfo
  10. );
  11. #define FreeLib(hDll) \
  12. {if (hDll && hDll != INVALID_HANDLE_VALUE) FreeLibrary(hDll);}
  13. #endif // #ifdef BUILD_DBGHELP
  14. typedef struct
  15. {
  16. PCHAR Name;
  17. FARPROC Function;
  18. } FUNCPTRS;
  19. #if DBG
  20. void
  21. OutputDBString(
  22. CHAR *text
  23. );
  24. #endif
  25. #ifdef BUILD_IMAGEHLP
  26. BOOL IMAGEAPI FailEnumerateLoadedModules(
  27. IN HANDLE hProcess,
  28. IN PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback,
  29. IN PVOID UserContext
  30. )
  31. { return FALSE; }
  32. BOOL IMAGEAPI FailEnumerateLoadedModules64(
  33. IN HANDLE hProcess,
  34. IN PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback,
  35. IN PVOID UserContext
  36. )
  37. { return FALSE; }
  38. HANDLE IMAGEAPI FailFindDebugInfoFile (
  39. PSTR FileName,
  40. PSTR SymbolPath,
  41. PSTR DebugFilePath
  42. )
  43. {return NULL;}
  44. HANDLE IMAGEAPI FailFindDebugInfoFileEx (
  45. PSTR FileName,
  46. PSTR SymbolPath,
  47. PSTR DebugFilePath,
  48. PFIND_DEBUG_FILE_CALLBACK Callback,
  49. PVOID CallerData
  50. )
  51. { return NULL; }
  52. HANDLE IMAGEAPI FailFindExecutableImage(
  53. PSTR FileName,
  54. PSTR SymbolPath,
  55. PSTR ImageFilePath
  56. )
  57. { return NULL; }
  58. LPAPI_VERSION IMAGEAPI FailImagehlpApiVersion(
  59. VOID
  60. )
  61. { return NULL; }
  62. LPAPI_VERSION IMAGEAPI FailImagehlpApiVersionEx(
  63. LPAPI_VERSION AppVersion
  64. )
  65. { return NULL; }
  66. BOOL IMAGEAPI FailMakeSureDirectoryPathExists(
  67. PCSTR DirPath
  68. )
  69. { return FALSE; }
  70. #ifndef _WIN64
  71. PIMAGE_DEBUG_INFORMATION IMAGEAPI FailMapDebugInformation(
  72. HANDLE FileHandle,
  73. PSTR FileName,
  74. PSTR SymbolPath,
  75. DWORD ImageBase
  76. )
  77. { return NULL; }
  78. #endif
  79. BOOL IMAGEAPI FailSearchTreeForFile(
  80. PSTR RootPath,
  81. PSTR InputPathName,
  82. PSTR OutputPathBuffer
  83. )
  84. { return FALSE; }
  85. BOOL IMAGEAPI FailStackWalk(
  86. DWORD MachineType,
  87. HANDLE hProcess,
  88. HANDLE hThread,
  89. LPSTACKFRAME StackFrame,
  90. PVOID ContextRecord,
  91. PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine,
  92. PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine,
  93. PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine,
  94. PTRANSLATE_ADDRESS_ROUTINE TranslateAddress
  95. )
  96. { return FALSE; }
  97. BOOL IMAGEAPI FailStackWalk64(
  98. DWORD MachineType,
  99. HANDLE hProcess,
  100. HANDLE hThread,
  101. LPSTACKFRAME64 StackFrame,
  102. PVOID ContextRecord,
  103. PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
  104. PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
  105. PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
  106. PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress
  107. )
  108. { return FALSE; }
  109. BOOL IMAGEAPI FailSymCleanup(
  110. IN HANDLE hProcess
  111. )
  112. { return FALSE; }
  113. BOOL IMAGEAPI FailSymEnumerateModules(
  114. IN HANDLE hProcess,
  115. IN PSYM_ENUMMODULES_CALLBACK EnumModulesCallback,
  116. IN PVOID UserContext
  117. )
  118. { return FALSE; }
  119. BOOL IMAGEAPI FailSymEnumerateModules64(
  120. IN HANDLE hProcess,
  121. IN PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback,
  122. IN PVOID UserContext
  123. )
  124. { return FALSE; }
  125. BOOL IMAGEAPI FailSymEnumerateSymbols(
  126. IN HANDLE hProcess,
  127. IN DWORD BaseOfDll,
  128. IN PSYM_ENUMSYMBOLS_CALLBACK EnumSymbolsCallback,
  129. IN PVOID UserContext
  130. )
  131. { return FALSE; }
  132. BOOL IMAGEAPI FailSymEnumerateSymbolsW(
  133. IN HANDLE hProcess,
  134. IN DWORD BaseOfDll,
  135. IN PSYM_ENUMSYMBOLS_CALLBACKW EnumSymbolsCallback,
  136. IN PVOID UserContext
  137. )
  138. { return FALSE; }
  139. BOOL IMAGEAPI FailSymEnumerateSymbols64(
  140. IN HANDLE hProcess,
  141. IN DWORD64 BaseOfDll,
  142. IN PSYM_ENUMSYMBOLS_CALLBACK64 EnumSymbolsCallback,
  143. IN PVOID UserContext
  144. )
  145. { return FALSE; }
  146. BOOL IMAGEAPI FailSymEnumerateSymbolsW64(
  147. IN HANDLE hProcess,
  148. IN DWORD64 BaseOfDll,
  149. IN PSYM_ENUMSYMBOLS_CALLBACK64W EnumSymbolsCallback,
  150. IN PVOID UserContext
  151. )
  152. { return FALSE; }
  153. PVOID IMAGEAPI FailSymFunctionTableAccess(
  154. HANDLE hProcess,
  155. DWORD AddrBase
  156. )
  157. { return NULL; }
  158. PVOID IMAGEAPI FailSymFunctionTableAccess64(
  159. HANDLE hProcess,
  160. DWORD64 AddrBase
  161. )
  162. { return NULL; }
  163. BOOL IMAGEAPI FailSymGetLineFromAddr(
  164. IN HANDLE hProcess,
  165. IN DWORD dwAddr,
  166. OUT PDWORD pdwDisplacement,
  167. OUT PIMAGEHLP_LINE Line
  168. )
  169. { return FALSE; }
  170. BOOL IMAGEAPI FailSymGetLineFromAddr64(
  171. IN HANDLE hProcess,
  172. IN DWORD64 qwAddr,
  173. OUT PDWORD pdwDisplacement,
  174. OUT PIMAGEHLP_LINE64 Line
  175. )
  176. { return FALSE; }
  177. BOOL IMAGEAPI FailSymGetLineFromName(
  178. IN HANDLE hProcess,
  179. IN PSTR ModuleName,
  180. IN PSTR FileName,
  181. IN DWORD dwLineNumber,
  182. OUT PLONG plDisplacement,
  183. IN OUT PIMAGEHLP_LINE Line
  184. )
  185. { return FALSE; }
  186. BOOL IMAGEAPI FailSymGetLineFromName64(
  187. IN HANDLE hProcess,
  188. IN PSTR ModuleName,
  189. IN PSTR FileName,
  190. IN DWORD dwLineNumber,
  191. OUT PLONG plDisplacement,
  192. IN OUT PIMAGEHLP_LINE64 Line
  193. )
  194. { return FALSE; }
  195. BOOL IMAGEAPI FailSymGetLineNext(
  196. IN HANDLE hProcess,
  197. IN OUT PIMAGEHLP_LINE Line
  198. )
  199. { return FALSE; }
  200. BOOL IMAGEAPI FailSymGetLineNext64(
  201. IN HANDLE hProcess,
  202. IN OUT PIMAGEHLP_LINE64 Line
  203. )
  204. { return FALSE; }
  205. BOOL IMAGEAPI FailSymGetLinePrev(
  206. IN HANDLE hProcess,
  207. IN OUT PIMAGEHLP_LINE Line
  208. )
  209. { return FALSE; }
  210. BOOL IMAGEAPI FailSymGetLinePrev64(
  211. IN HANDLE hProcess,
  212. IN OUT PIMAGEHLP_LINE64 Line
  213. )
  214. { return FALSE; }
  215. DWORD IMAGEAPI FailSymGetModuleBase(
  216. IN HANDLE hProcess,
  217. IN DWORD dwAddr
  218. )
  219. { return 0; }
  220. DWORD64 IMAGEAPI FailSymGetModuleBase64(
  221. IN HANDLE hProcess,
  222. IN DWORD64 qwAddr
  223. )
  224. { return 0; }
  225. BOOL IMAGEAPI FailSymGetModuleInfo(
  226. IN HANDLE hProcess,
  227. IN DWORD dwAddr,
  228. OUT PIMAGEHLP_MODULE ModuleInfo
  229. )
  230. { return FALSE; }
  231. BOOL IMAGEAPI FailSymGetModuleInfoW(
  232. IN HANDLE hProcess,
  233. IN DWORD dwAddr,
  234. OUT PIMAGEHLP_MODULEW ModuleInfo
  235. )
  236. { return FALSE; }
  237. BOOL IMAGEAPI FailSymGetModuleInfo64(
  238. IN HANDLE hProcess,
  239. IN DWORD64 qwAddr,
  240. OUT PIMAGEHLP_MODULE64 ModuleInfo
  241. )
  242. { return FALSE; }
  243. BOOL IMAGEAPI FailSymGetModuleInfoW64(
  244. IN HANDLE hProcess,
  245. IN DWORD64 qwAddr,
  246. OUT PIMAGEHLP_MODULEW64 ModuleInfo
  247. )
  248. { return FALSE; }
  249. DWORD IMAGEAPI FailSymGetOptions(
  250. VOID
  251. )
  252. { return 0; }
  253. BOOL IMAGEAPI FailSymGetSearchPath(
  254. IN HANDLE hProcess,
  255. OUT PSTR SearchPath,
  256. IN DWORD SearchPathLength
  257. )
  258. { return FALSE; }
  259. BOOL IMAGEAPI FailSymGetSymFromAddr(
  260. IN HANDLE hProcess,
  261. IN DWORD dwAddr,
  262. OUT PDWORD pdwDisplacement,
  263. OUT PIMAGEHLP_SYMBOL Symbol
  264. )
  265. { return FALSE; }
  266. BOOL IMAGEAPI FailSymGetSymFromAddr64(
  267. IN HANDLE hProcess,
  268. IN DWORD64 qwAddr,
  269. OUT PDWORD64 pdwDisplacement,
  270. OUT PIMAGEHLP_SYMBOL64 Symbol
  271. )
  272. { return FALSE; }
  273. BOOL IMAGEAPI FailSymGetSymFromName(
  274. IN HANDLE hProcess,
  275. IN PSTR Name,
  276. OUT PIMAGEHLP_SYMBOL Symbol
  277. )
  278. { return FALSE; }
  279. BOOL IMAGEAPI FailSymGetSymFromName64(
  280. IN HANDLE hProcess,
  281. IN PSTR Name,
  282. OUT PIMAGEHLP_SYMBOL64 Symbol
  283. )
  284. { return FALSE; }
  285. BOOL IMAGEAPI FailSymGetSymNext(
  286. IN HANDLE hProcess,
  287. IN OUT PIMAGEHLP_SYMBOL Symbol
  288. )
  289. { return FALSE; }
  290. BOOL IMAGEAPI FailSymGetSymNext64(
  291. IN HANDLE hProcess,
  292. IN OUT PIMAGEHLP_SYMBOL64 Symbol
  293. )
  294. { return FALSE; }
  295. BOOL IMAGEAPI FailSymGetSymPrev(
  296. IN HANDLE hProcess,
  297. IN OUT PIMAGEHLP_SYMBOL Symbol
  298. )
  299. { return FALSE; }
  300. BOOL IMAGEAPI FailSymGetSymPrev64(
  301. IN HANDLE hProcess,
  302. IN OUT PIMAGEHLP_SYMBOL64 Symbol
  303. )
  304. { return FALSE; }
  305. BOOL
  306. IMAGEAPI
  307. FailSymGetTypeInfo(
  308. IN HANDLE hProcess,
  309. IN DWORD64 ModBase,
  310. IN ULONG TypeId,
  311. IN IMAGEHLP_SYMBOL_TYPE_INFO GetType,
  312. OUT PVOID pInfo
  313. )
  314. { return FALSE; }
  315. BOOL
  316. IMAGEAPI
  317. FailSymGetTypeFromName(
  318. IN HANDLE hProcess,
  319. IN ULONG64 BaseOfDll,
  320. IN LPSTR Name,
  321. OUT PSYMBOL_INFO Symbol
  322. )
  323. { return FALSE; }
  324. BOOL
  325. IMAGEAPI
  326. FailSymEnumTypes(
  327. IN HANDLE hProcess,
  328. IN ULONG64 BaseOfDll,
  329. IN PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
  330. IN PVOID UserContext
  331. )
  332. { return FALSE; }
  333. BOOL IMAGEAPI FailSymInitialize(
  334. IN HANDLE hProcess,
  335. IN PSTR UserSearchPath,
  336. IN BOOL fInvadeProcess
  337. )
  338. { return FALSE; }
  339. DWORD IMAGEAPI FailSymLoadModule(
  340. IN HANDLE hProcess,
  341. IN HANDLE hFile,
  342. IN PSTR ImageName,
  343. IN PSTR ModuleName,
  344. IN DWORD BaseOfDll,
  345. IN DWORD SizeOfDll
  346. )
  347. { return 0; }
  348. DWORD64 IMAGEAPI FailSymLoadModule64(
  349. IN HANDLE hProcess,
  350. IN HANDLE hFile,
  351. IN PSTR ImageName,
  352. IN PSTR ModuleName,
  353. IN DWORD64 BaseOfDll,
  354. IN DWORD SizeOfDll
  355. )
  356. { return 0; }
  357. BOOL IMAGEAPI FailSymMatchFileName(
  358. IN PSTR FileName,
  359. IN PSTR Match,
  360. OUT PSTR *FileNameStop,
  361. OUT PSTR *MatchStop
  362. )
  363. { return FALSE; }
  364. BOOL IMAGEAPI FailSymRegisterCallback(
  365. IN HANDLE hProcess,
  366. IN PSYMBOL_REGISTERED_CALLBACK CallbackFunction,
  367. IN PVOID UserContext
  368. )
  369. { return FALSE; }
  370. BOOL IMAGEAPI FailSymRegisterCallback64(
  371. IN HANDLE hProcess,
  372. IN PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction,
  373. IN ULONG64 UserContext
  374. )
  375. { return FALSE; }
  376. BOOL IMAGEAPI FailSymRegisterFunctionEntryCallback(
  377. IN HANDLE hProcess,
  378. IN PSYMBOL_FUNCENTRY_CALLBACK CallbackFunction,
  379. IN PVOID UserContext
  380. )
  381. { return FALSE; }
  382. BOOL IMAGEAPI FailSymRegisterFunctionEntryCallback64(
  383. IN HANDLE hProcess,
  384. IN PSYMBOL_FUNCENTRY_CALLBACK64 CallbackFunction,
  385. IN ULONG64 UserContext
  386. )
  387. { return FALSE; }
  388. BOOL IMAGEAPI FailSymSetContext(
  389. HANDLE hProcess,
  390. PIMAGEHLP_STACK_FRAME StackFrame,
  391. PIMAGEHLP_CONTEXT Context
  392. )
  393. { return FALSE;}
  394. DWORD IMAGEAPI FailSymSetOptions(
  395. IN DWORD SymOptions
  396. )
  397. { return 0; }
  398. BOOL IMAGEAPI FailSymSetSearchPath(
  399. IN HANDLE hProcess,
  400. IN PSTR SearchPath
  401. )
  402. { return FALSE; }
  403. BOOL IMAGEAPI FailSymUnDName(
  404. IN PIMAGEHLP_SYMBOL sym, // Symbol to undecorate
  405. OUT PSTR UnDecName, // Buffer to store undecorated name in
  406. IN DWORD UnDecNameLength // Size of the buffer
  407. )
  408. { return FALSE; }
  409. BOOL IMAGEAPI FailSymUnDName64(
  410. IN PIMAGEHLP_SYMBOL64 sym, // Symbol to undecorate
  411. OUT PSTR UnDecName, // Buffer to store undecorated name in
  412. IN DWORD UnDecNameLength // Size of the buffer
  413. )
  414. { return FALSE; }
  415. BOOL IMAGEAPI FailSymUnloadModule(
  416. IN HANDLE hProcess,
  417. IN DWORD BaseOfDll
  418. )
  419. { return FALSE; }
  420. BOOL IMAGEAPI FailSymUnloadModule64(
  421. IN HANDLE hProcess,
  422. IN DWORD64 BaseOfDll
  423. )
  424. { return FALSE; }
  425. #ifndef _WIN64
  426. BOOL IMAGEAPI FailUnmapDebugInformation(
  427. PIMAGE_DEBUG_INFORMATION DebugInfo
  428. )
  429. { return FALSE; }
  430. #endif
  431. BOOL IMAGEAPI FailSymEnumSym(
  432. IN HANDLE hProcess,
  433. IN DWORD64 BaseOfDll,
  434. IN PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
  435. IN PVOID UserContext
  436. )
  437. { return FALSE; }
  438. BOOL IMAGEAPI FailSymFromAddr(
  439. IN HANDLE hProcess,
  440. IN DWORD64 dwAddr,
  441. OUT PDWORD pdwDisplacement,
  442. OUT PSYMBOL_INFO Symbol
  443. )
  444. { return FALSE; }
  445. BOOL IMAGEAPI FailSymFromName(
  446. IN HANDLE hProcess,
  447. IN PSTR Name,
  448. OUT PSYMBOL_INFO Symbol
  449. )
  450. { return FALSE; }
  451. FUNCPTRS DbgHelpFailPtrs[] = {
  452. {"EnumerateLoadedModules", (FARPROC)FailEnumerateLoadedModules},
  453. {"EnumerateLoadedModules64", (FARPROC)FailEnumerateLoadedModules64},
  454. {"FindDebugInfoFile", (FARPROC)FailFindDebugInfoFile},
  455. {"FindDebugInfoFileEx", (FARPROC)FailFindDebugInfoFileEx},
  456. {"FindExecutableImage", (FARPROC)FailFindExecutableImage},
  457. {"ImagehlpApiVersion", (FARPROC)FailImagehlpApiVersion},
  458. {"ImagehlpApiVersionEx", (FARPROC)FailImagehlpApiVersionEx},
  459. {"MakeSureDirectoryPathExists", (FARPROC)FailMakeSureDirectoryPathExists},
  460. #ifndef _WIN64
  461. {"MapDebugInformation", (FARPROC)FailMapDebugInformation},
  462. #endif
  463. {"SearchTreeForFile", (FARPROC)FailSearchTreeForFile},
  464. {"StackWalk", (FARPROC)FailStackWalk},
  465. {"StackWalk64", (FARPROC)FailStackWalk64},
  466. {"SymCleanup", (FARPROC)FailSymCleanup},
  467. {"SymEnumerateModules", (FARPROC)FailSymEnumerateModules},
  468. {"SymEnumerateModules64", (FARPROC)FailSymEnumerateModules64},
  469. {"SymEnumerateSymbols", (FARPROC)FailSymEnumerateSymbols},
  470. {"SymEnumerateSymbols64", (FARPROC)FailSymEnumerateSymbols64},
  471. {"SymEnumerateSymbolsW", (FARPROC)FailSymEnumerateSymbolsW},
  472. {"SymEnumerateSymbolsW64", (FARPROC)FailSymEnumerateSymbolsW64},
  473. {"SymEnumSym", (FARPROC)FailSymEnumSym},
  474. {"SymEnumTypes", (FARPROC)FailSymEnumTypes},
  475. {"SymFromAddr", (FARPROC)FailSymFromAddr},
  476. {"SymFromName", (FARPROC)FailSymFromName},
  477. {"SymFunctionTableAccess", (FARPROC)FailSymFunctionTableAccess},
  478. {"SymFunctionTableAccess64", (FARPROC)FailSymFunctionTableAccess64},
  479. {"SymGetLineFromAddr", (FARPROC)FailSymGetLineFromAddr},
  480. {"SymGetLineFromAddr64", (FARPROC)FailSymGetLineFromAddr64},
  481. {"SymGetLineFromName", (FARPROC)FailSymGetLineFromName},
  482. {"SymGetLineFromName64", (FARPROC)FailSymGetLineFromName64},
  483. {"SymGetLineNext", (FARPROC)FailSymGetLineNext},
  484. {"SymGetLineNext64", (FARPROC)FailSymGetLineNext64},
  485. {"SymGetLinePrev", (FARPROC)FailSymGetLinePrev},
  486. {"SymGetLinePrev64", (FARPROC)FailSymGetLinePrev64},
  487. {"SymGetModuleBase", (FARPROC)FailSymGetModuleBase},
  488. {"SymGetModuleBase64", (FARPROC)FailSymGetModuleBase64},
  489. {"SymGetModuleInfo", (FARPROC)FailSymGetModuleInfo},
  490. {"SymGetModuleInfo64", (FARPROC)FailSymGetModuleInfo64},
  491. {"SymGetModuleInfoW", (FARPROC)FailSymGetModuleInfoW},
  492. {"SymGetModuleInfoW64", (FARPROC)FailSymGetModuleInfoW64},
  493. {"SymGetOptions", (FARPROC)FailSymGetOptions},
  494. {"SymGetSearchPath", (FARPROC)FailSymGetSearchPath},
  495. {"SymGetSymFromAddr", (FARPROC)FailSymGetSymFromAddr},
  496. {"SymGetSymFromAddr64", (FARPROC)FailSymGetSymFromAddr64},
  497. {"SymGetSymFromName", (FARPROC)FailSymGetSymFromName},
  498. {"SymGetSymFromName64", (FARPROC)FailSymGetSymFromName64},
  499. {"SymGetSymNext", (FARPROC)FailSymGetSymNext},
  500. {"SymGetSymNext64", (FARPROC)FailSymGetSymNext64},
  501. {"SymGetSymPrev", (FARPROC)FailSymGetSymPrev},
  502. {"SymGetSymPrev64", (FARPROC)FailSymGetSymPrev64},
  503. {"SymGetTypeFromName", (FARPROC)FailSymGetTypeFromName},
  504. {"SymGetTypeInfo", (FARPROC)FailSymGetTypeInfo},
  505. {"SymInitialize", (FARPROC)FailSymInitialize},
  506. {"SymLoadModule", (FARPROC)FailSymLoadModule},
  507. {"SymLoadModule64", (FARPROC)FailSymLoadModule64},
  508. {"SymMatchFileName", (FARPROC)FailSymMatchFileName},
  509. {"SymRegisterCallback", (FARPROC)FailSymRegisterCallback},
  510. {"SymRegisterCallback64", (FARPROC)FailSymRegisterCallback64},
  511. {"SymRegisterFunctionEntryCallback", (FARPROC)FailSymRegisterFunctionEntryCallback},
  512. {"SymRegisterFunctionEntryCallback64", (FARPROC)FailSymRegisterFunctionEntryCallback64},
  513. {"SymSetContext", (FARPROC)FailSymSetContext},
  514. {"SymSetOptions", (FARPROC)FailSymSetOptions},
  515. {"SymSetSearchPath", (FARPROC)FailSymSetSearchPath},
  516. {"SymUnDName", (FARPROC)FailSymUnDName},
  517. {"SymUnDName64", (FARPROC)FailSymUnDName64},
  518. {"SymUnloadModule", (FARPROC)FailSymUnloadModule},
  519. {"SymUnloadModule64", (FARPROC)FailSymUnloadModule64},
  520. #ifndef _WIN64
  521. {"UnmapDebugInformation", (FARPROC)FailUnmapDebugInformation},
  522. #endif
  523. {NULL, NULL}
  524. };
  525. #endif // BUILD_IMAGEHLP
  526. #ifdef BUILD_IMAGEHLP
  527. FUNCPTRS *FailFunctions[2] = {NULL, DbgHelpFailPtrs}; // {MsDbiFailPtrs, DbgHelpFailPtrs};
  528. HINSTANCE hDelayLoadDll[2];
  529. #else
  530. FUNCPTRS *FailFunctions[1] = {MsDbiFailPtrs};
  531. HINSTANCE hDelayLoadDll[1];
  532. #endif
  533. FARPROC
  534. FindFailureProc(
  535. UINT Index,
  536. const char *szProcName
  537. )
  538. {
  539. FUNCPTRS *fp = FailFunctions[Index];
  540. UINT x = 0;
  541. while (fp[x].Name) {
  542. if (!lstrcmpi(fp[x].Name, szProcName)) {
  543. return fp[x].Function;
  544. }
  545. x++;
  546. }
  547. return NULL;
  548. }
  549. /*
  550. * this function exists to prevent us from calling msvcrt!splitpath
  551. */
  552. VOID
  553. ParsePath(
  554. CHAR *fullpath,
  555. CHAR *path,
  556. DWORD cbPath,
  557. CHAR *file,
  558. DWORD cbFile
  559. )
  560. {
  561. CHAR *c;
  562. CHAR sz[MAX_PATH + 1];
  563. assert(fullpath);
  564. if (path)
  565. *path = 0;
  566. if (file)
  567. *file = 0;
  568. CopyStrArray(sz, fullpath);
  569. for (c = sz + lstrlen(sz); c > sz; c--) {
  570. if (*c == '\\') {
  571. c++;
  572. if (file)
  573. CopyString(file, c, cbFile);
  574. *c = 0;
  575. if (path)
  576. CopyString(path, sz, cbPath);
  577. return;
  578. }
  579. }
  580. if (file)
  581. CopyString(file, fullpath, cbFile);
  582. }
  583. FARPROC
  584. WINAPI
  585. ImagehlpDelayLoadHook (
  586. UINT unReason,
  587. PDelayLoadInfo pDelayInfo
  588. )
  589. {
  590. FARPROC ReturnValue = NULL;
  591. if (dliStartProcessing == unReason)
  592. {
  593. DWORD iDll = 0;
  594. #ifdef BUILD_IMAGEHLP
  595. if (!lstrcmpi(pDelayInfo->szDll, "dbghelp.dll")) {
  596. iDll = 2;
  597. }
  598. #endif
  599. if (iDll) {
  600. iDll--;
  601. // If the dll isn't loaded and isn't inproc already, attempt to load
  602. // from the same dir as imagehlp lives...
  603. if (!hDelayLoadDll[iDll] &&
  604. !(hDelayLoadDll[iDll] = GetModuleHandle(pDelayInfo->szDll)) &&
  605. g.hinst)
  606. {
  607. CHAR szImageName[MAX_PATH + 1];
  608. CHAR szPath[_MAX_DIR];
  609. CHAR szDll[MAX_PATH + 1];
  610. // Only load if dbghelp/msdbi are in the same dir as imagehlp
  611. GetModuleFileName(g.hinst, szImageName, DIMA(szImageName));
  612. ParsePath(szImageName, szPath, DIMA(szPath), szDll, DIMA(szDll));
  613. CopyStrArray(szImageName, szPath);
  614. CatStrArray(szImageName, pDelayInfo->szDll);
  615. hDelayLoadDll[iDll] = LoadLibrary(szImageName);
  616. if (!hDelayLoadDll[iDll]) {
  617. hDelayLoadDll[iDll] = (HINSTANCE)INVALID_HANDLE_VALUE;
  618. }
  619. }
  620. if (INVALID_HANDLE_VALUE != hDelayLoadDll[iDll] && g.hinst) {
  621. ReturnValue = GetProcAddress(hDelayLoadDll[iDll], pDelayInfo->dlp.szProcName);
  622. }
  623. if (!ReturnValue) {
  624. ReturnValue = FindFailureProc(iDll, pDelayInfo->dlp.szProcName);
  625. }
  626. #if DBG
  627. if (!ReturnValue) {
  628. OutputDBString("BogusDelayLoad function encountered...\n");
  629. }
  630. } else {
  631. OutputDBString("BogusDelayLoad function encountered...\n");
  632. #endif
  633. }
  634. }
  635. if (ReturnValue && g.hinst) {
  636. *pDelayInfo->ppfn = ReturnValue;
  637. }
  638. return ReturnValue;
  639. }
  640. #ifdef BUILD_DBGHELP
  641. typedef struct tagVERHEAD {
  642. WORD wTotLen;
  643. WORD wValLen;
  644. WORD wType; /* always 0 */
  645. WCHAR szKey[(sizeof("VS_VERSION_INFO")+3)&~03];
  646. VS_FIXEDFILEINFO vsf;
  647. } VERHEAD ;
  648. BOOL
  649. GetDllVersionInfo(
  650. HINSTANCE hinst,
  651. LPVOID *lpVersionInfo
  652. )
  653. {
  654. VS_FIXEDFILEINFO *pvsFFI = NULL;
  655. HRSRC hVerRes;
  656. VERHEAD *pVerHead;
  657. BOOL rc = FALSE;
  658. assert(lpVersionInfo && hinst);
  659. *lpVersionInfo = NULL;
  660. hVerRes = FindResource(hinst, MAKEINTRESOURCE(VS_VERSION_INFO), VS_FILE_INFO);
  661. if (hVerRes == NULL)
  662. goto Cleanup;
  663. pVerHead = (VERHEAD*)LoadResource(hinst, hVerRes);
  664. if (pVerHead == NULL)
  665. goto Cleanup;
  666. *lpVersionInfo = MemAlloc(pVerHead->wTotLen + pVerHead->wTotLen/2);
  667. if (*lpVersionInfo == NULL)
  668. goto Cleanup;
  669. memcpy(*lpVersionInfo, (PVOID)pVerHead, pVerHead->wTotLen);
  670. rc = TRUE;
  671. Cleanup:
  672. if (*lpVersionInfo && rc == FALSE)
  673. MemFree(*lpVersionInfo);
  674. return rc;
  675. }
  676. #endif // #ifdef BUILD_DBGHELP
  677. PfnDliHook __pfnDliNotifyHook = ImagehlpDelayLoadHook;
  678. PfnDliHook __pfnDliFailureHook = NULL;
  679. #if DBG
  680. void
  681. OutputDBString(
  682. CHAR *text
  683. )
  684. {
  685. CHAR sz[256];
  686. CopyStrArray(sz, MOD_FILENAME);
  687. CatStrArray(sz, ": ");
  688. CatStrArray(sz, text);
  689. OutputDebugString(sz);
  690. }
  691. #endif