Windows NT 4.0 source code leak
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.

319 lines
7.4 KiB

4 years ago
  1. //
  2. // defines for symbol file searching
  3. //
  4. #define SYMBOL_PATH "_NT_SYMBOL_PATH"
  5. #define ALTERNATE_SYMBOL_PATH "_NT_ALT_SYMBOL_PATH"
  6. #define WINDIR "windir"
  7. #define HASH_MODULO 253
  8. #define OMAP_SYM_EXTRA 1024
  9. #define CPP_EXTRA 2
  10. #define OMAP_SYM_STRINGS (OMAP_SYM_EXTRA * 256)
  11. #define TMP_SYM_LEN 4096
  12. //
  13. // structures
  14. //
  15. typedef struct _LOADED_MODULE {
  16. PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback;
  17. PVOID Context;
  18. } LOADED_MODULE, *PLOADED_MODULE;
  19. typedef struct _PROCESS_ENTRY {
  20. LIST_ENTRY ListEntry;
  21. LIST_ENTRY ModuleList;
  22. ULONG Count;
  23. HANDLE hProcess;
  24. LPSTR SymbolSearchPath;
  25. PSYMBOL_REGISTERED_CALLBACK pCallbackFunction;
  26. PVOID CallbackUserContext;
  27. } PROCESS_ENTRY, *PPROCESS_ENTRY;
  28. typedef struct _OMAP {
  29. ULONG rva;
  30. ULONG rvaTo;
  31. } OMAP, *POMAP;
  32. typedef struct _OMAPLIST {
  33. struct _OMAPLIST *next;
  34. OMAP omap;
  35. ULONG cb;
  36. } OMAPLIST, *POMAPLIST;
  37. #define SYMF_DUPLICATE 0x80000001
  38. typedef struct _SYMBOL_ENTRY {
  39. struct _SYMBOL_ENTRY *Next;
  40. DWORD Size;
  41. DWORD Flags;
  42. DWORD Address;
  43. LPSTR Name;
  44. ULONG NameLength;
  45. } SYMBOL_ENTRY, *PSYMBOL_ENTRY;
  46. typedef struct _SECTION_START {
  47. DWORD Offset;
  48. DWORD Size;
  49. DWORD Flags;
  50. } SECTION_START, *PSECTION_START;
  51. //
  52. // module flags
  53. //
  54. #define MIF_DEFERRED_LOAD 0x00000001
  55. #define MIF_NO_SYMBOLS 0x00000002
  56. typedef struct _MODULE_ENTRY {
  57. LIST_ENTRY ListEntry;
  58. ULONG BaseOfDll;
  59. ULONG DllSize;
  60. ULONG TimeDateStamp;
  61. ULONG CheckSum;
  62. USHORT MachineType;
  63. CHAR ModuleName[32];
  64. CHAR AliasName[32];
  65. PSTR ImageName;
  66. PSTR LoadedImageName;
  67. PSYMBOL_ENTRY symbolTable;
  68. LPSTR SymStrings;
  69. PSYMBOL_ENTRY NameHashTable[HASH_MODULO];
  70. ULONG numsyms;
  71. ULONG MaxSyms;
  72. ULONG StringSize;
  73. SYM_TYPE SymType;
  74. PVOID pdb;
  75. PVOID dbi;
  76. PVOID gsi;
  77. PIMAGE_SECTION_HEADER SectionHdrs;
  78. ULONG NumSections;
  79. PFPO_DATA pFpoData; // pointer to fpo data (x86)
  80. PIMAGE_FUNCTION_ENTRY pExceptionData; // pointer to pdata (risc)
  81. ULONG dwEntries; // # of fpo or pdata recs
  82. POMAP pOmapFrom; // pointer to omap data
  83. ULONG cOmapFrom; // count of omap entries
  84. POMAP pOmapTo; // pointer to omap data
  85. ULONG cOmapTo; // count of omap entries
  86. SYMBOL_ENTRY TmpSym; // used only for pdb symbols
  87. ULONG Flags;
  88. HANDLE hFile;
  89. PSECTION_START SectionStart;
  90. ULONG OriginalNumSections;
  91. } MODULE_ENTRY, *PMODULE_ENTRY;
  92. typedef struct _PDB_INFO {
  93. CHAR Signature[4]; // "NBxx"
  94. ULONG Offset; // always zero
  95. ULONG sig;
  96. ULONG age;
  97. CHAR PdbName[_MAX_PATH];
  98. } PDB_INFO, *PPDB_INFO;
  99. #define n_name N.ShortName
  100. #define n_zeroes N.Name.Short
  101. #define n_nptr N.LongName[1]
  102. #define n_offset N.Name.Long
  103. //
  104. // global externs
  105. //
  106. extern LIST_ENTRY ProcessList;
  107. extern BOOL SymInitialized;
  108. extern DWORD SymOptions;
  109. //
  110. // internal prototypes
  111. //
  112. DWORD
  113. GetProcessModules(
  114. HANDLE hProcess,
  115. PINTERNAL_GET_MODULE InternalGetModule,
  116. PVOID Context
  117. );
  118. VOID
  119. InternalGetModule(
  120. HANDLE hProcess,
  121. LPSTR ModuleName,
  122. DWORD ImageBase,
  123. DWORD ImageSize,
  124. PVOID Context
  125. );
  126. VOID
  127. FreeModuleEntry(
  128. PMODULE_ENTRY ModuleEntry
  129. );
  130. PPROCESS_ENTRY
  131. FindProcessEntry(
  132. HANDLE hProcess
  133. );
  134. VOID
  135. GetSymName(
  136. PIMAGE_SYMBOL Symbol,
  137. PUCHAR StringTable,
  138. LPSTR s,
  139. DWORD size
  140. );
  141. BOOL
  142. ProcessOmapSymbol(
  143. PMODULE_ENTRY mi,
  144. PSYMBOL_ENTRY sym
  145. );
  146. DWORD
  147. ConvertOmapFromSrc(
  148. PMODULE_ENTRY mi,
  149. DWORD addr,
  150. LPDWORD bias
  151. );
  152. DWORD
  153. ConvertOmapToSrc(
  154. PMODULE_ENTRY mi,
  155. DWORD addr,
  156. LPDWORD bias
  157. );
  158. POMAP
  159. GetOmapEntry(
  160. PMODULE_ENTRY mi,
  161. DWORD addr
  162. );
  163. VOID
  164. ProcessOmapForModule(
  165. PMODULE_ENTRY mi
  166. );
  167. BOOL
  168. LoadCoffSymbols(
  169. HANDLE hProcess,
  170. PMODULE_ENTRY mi,
  171. PUCHAR stringTable,
  172. PIMAGE_SYMBOL allSymbols,
  173. DWORD numberOfSymbols
  174. );
  175. BOOL
  176. LoadCodeViewSymbols(
  177. HANDLE hProcess,
  178. PMODULE_ENTRY mi,
  179. PUCHAR pCvData,
  180. DWORD dwSize,
  181. PVOID MappedBase
  182. );
  183. ULONG
  184. LoadExportSymbols(
  185. PMODULE_ENTRY mi,
  186. PIMAGE_DEBUG_INFORMATION di
  187. );
  188. ULONG
  189. LoadSYMSymbols(
  190. PMODULE_ENTRY mi,
  191. PIMAGE_DEBUG_INFORMATION di
  192. );
  193. BOOL
  194. LoadOmap(
  195. PMODULE_ENTRY mi,
  196. PIMAGE_DEBUG_INFORMATION di
  197. );
  198. PMODULE_ENTRY
  199. GetModuleForPC(
  200. PPROCESS_ENTRY ProcessEntry,
  201. DWORD dwPcAddr,
  202. BOOL ExactMatch
  203. );
  204. PSYMBOL_ENTRY
  205. GetSymFromAddr(
  206. DWORD dwAddr,
  207. PDWORD pdwDisplacement,
  208. PMODULE_ENTRY mi
  209. );
  210. LPSTR
  211. StringDup(
  212. LPSTR str
  213. );
  214. BOOL
  215. InternalLoadModule(
  216. IN HANDLE hProcess,
  217. IN PSTR ImageName,
  218. IN PSTR ModuleName,
  219. IN DWORD BaseOfDll,
  220. IN DWORD SizeOfDll,
  221. IN HANDLE hFile
  222. );
  223. DWORD
  224. ComputeHash(
  225. LPSTR lpname,
  226. ULONG cb
  227. );
  228. PSYMBOL_ENTRY
  229. FindSymbolByName(
  230. PPROCESS_ENTRY ProcessEntry,
  231. PMODULE_ENTRY mi,
  232. LPSTR SymName
  233. );
  234. PFPO_DATA
  235. SwSearchFpoData(
  236. DWORD key,
  237. PFPO_DATA base,
  238. DWORD num
  239. );
  240. PIMAGE_FUNCTION_ENTRY
  241. LookupFunctionEntry (
  242. PIMAGE_FUNCTION_ENTRY FunctionTable,
  243. DWORD NumberOfFunctions,
  244. DWORD ControlPc
  245. );
  246. VOID
  247. LoadedModuleEnumerator(
  248. HANDLE hProcess,
  249. LPSTR ModuleName,
  250. DWORD ImageBase,
  251. DWORD ImageSize,
  252. PLOADED_MODULE lm
  253. );
  254. BOOL
  255. CompleteDeferredSymbolLoad(
  256. IN HANDLE hProcess,
  257. IN PMODULE_ENTRY mi
  258. );
  259. LPSTR
  260. symfmt(
  261. LPSTR DstName,
  262. LPSTR SrcName,
  263. ULONG Length
  264. );
  265. PIMAGEHLP_SYMBOL
  266. symcpy(
  267. PIMAGEHLP_SYMBOL External,
  268. PSYMBOL_ENTRY Internal
  269. );
  270. LPSTR
  271. SymUnDNameInternal(
  272. LPSTR UnDecName,
  273. DWORD UnDecNameLength,
  274. LPSTR DecName,
  275. DWORD MaxDecNameLength
  276. );