/sources/runtime-manager/debugger-nub/x86-win32/cv-extract.h

http://github.com/dylan-lang/opendylan · C Header · 754 lines · 543 code · 193 blank · 18 comment · 0 complexity · acf0d8e2846bf14a1155ec5dd286402e MD5 · raw file

  1. /* ********************************************************************** */
  2. /* ** cv-extract.h ** */
  3. /* ** Descriptors for COFF and CodeView formats. ** */
  4. /* ** ---------------------------------------------------------------- ** */
  5. /* ** Author: Paul Howard, Copyright: Functional Objects, Inc. 1996 ** */
  6. /* ********************************************************************** */
  7. // The macro CVMAP generates a pointer by combining the pointer to the base
  8. // of CodeView data with the required offset to something in that data.
  9. // So, if there is a SOME_STRUCT object at offset X from the base of the
  10. // image information (info), then a pointer to it is obtained with the
  11. // expression:
  12. // (SOME_STRUCT*) (CVMAP(info, X))
  13. // (Gotta love those C macros...)
  14. #define CVMAP(i, y) (((DWORD) ((i)->CodeViewSymbols)) + ((DWORD) (y)))
  15. // Constants - CV field indices.
  16. #define CV_S_COMPILE 0x0001
  17. #define CV_S_REGISTER 0x0002
  18. #define CV_S_REGISTER_NEW 0x1001
  19. #define CV_S_CONSTANT 0x0003
  20. #define CV_S_CONSTANT_NEW 0x1002
  21. #define CV_S_UDT 0x0004
  22. #define CV_S_UDT_NEW 0x1003
  23. #define CV_S_SSEARCH 0x0005
  24. #define CV_S_END 0x0006
  25. #define CV_S_SKIP 0x0007
  26. #define CV_S_CVRESERVE 0x0008
  27. #define CV_S_OBJNAME 0x0009
  28. #define CV_S_ENDARG 0x000a
  29. #define CV_S_COBOLUDT 0x000b
  30. #define CV_S_COBOLUDT_NEW 0x1004
  31. #define CV_S_MANYREG 0x000c
  32. #define CV_S_MANYREG_NEW 0x1005
  33. #define CV_S_RETURN 0x000d
  34. #define CV_S_ENTRYTHIS 0x000e
  35. #define CV_S_BPREL16 0x0100
  36. #define CV_S_LDATA16 0x0101
  37. #define CV_S_GDATA16 0x0102
  38. #define CV_S_PUB16 0x0103
  39. #define CV_S_LPROC16 0x0104
  40. #define CV_S_GPROC16 0x0105
  41. #define CV_S_THUNK16 0x0106
  42. #define CV_S_BLOCK16 0x0107
  43. #define CV_S_WITH16 0x0108
  44. #define CV_S_LABEL16 0x0109
  45. #define CV_S_CEXMODEL16 0x010a
  46. #define CV_S_VFTPATH16 0x010b
  47. #define CV_S_REGREL16 0x010c
  48. #define CV_S_BPREL32 0x0200
  49. #define CV_S_BPREL32_NEW 0x1006
  50. #define CV_S_LDATA32 0x0201
  51. #define CV_S_LDATA32_NEW 0x1007
  52. #define CV_S_GDATA32 0x0202
  53. #define CV_S_GDATA32_NEW 0x1008
  54. #define CV_S_PUB32 0x0203
  55. #define CV_S_PUB32_NEW 0x1009
  56. #define CV_S_LPROC32 0x0204
  57. #define CV_S_LPROC32_NEW 0x100a
  58. #define CV_S_GPROC32 0x0205
  59. #define CV_S_GPROC32_NEW 0x100b
  60. #define CV_S_THUNK32 0x0206
  61. #define CV_S_BLOCK32 0x0207
  62. #define CV_S_WITH32 0x0208
  63. #define CV_S_LABEL32 0x0209
  64. #define CV_S_CEXMODEL32 0x020a
  65. #define CV_S_VFTPATH32 0x020b
  66. #define CV_S_VFTPATH32_NEW 0x100c
  67. #define CV_S_REGREL32 0x020c
  68. #define CV_S_REGREL32_NEW 0x100d
  69. #define CV_S_LTHREAD32 0x020d
  70. #define CV_S_LTHREAD32_NEW 0x100e
  71. #define CV_S_GTHREAD32 0x020e
  72. #define CV_S_GTHREAD32_NEW 0x100f
  73. #define CV_S_LPROCMIPS 0x0300
  74. #define CV_S_LPROCMIPS_NEW 0x1010
  75. #define CV_S_GPROCMIPS 0x0301
  76. #define CV_S_GPROCMIPS_NEW 0x1011
  77. #define CV_S_PROCREF 0x0400
  78. #define CV_S_DATAREF 0x0401
  79. #define CV_S_ALIGN 0x0402
  80. // Constants: Subsection types
  81. #define SST_MODULE 0x120
  82. #define SST_TYPES 0x121
  83. #define SST_PUBLIC 0x122
  84. #define SST_PUBLIC_SYM 0x123
  85. #define SST_SYMBOLS 0x124
  86. #define SST_ALIGN_SYM 0x125
  87. #define SST_STATIC_SYM 0x134
  88. #define SST_SRC_LN_SEG 0x126
  89. #define SST_SRC_MODULE 0x127
  90. #define SST_LIBRARIES 0x128
  91. #define SST_GLOBAL_SYM 0x129
  92. #define SST_GLOBAL_PUB 0x12a
  93. #define SST_GLOBAL_TYPES 0x12b
  94. #define SST_MPC 0x12c
  95. #define DEFAULT_NAME_SIZE 256
  96. // Structures of CodeView records.
  97. typedef struct _CV_HEADER {
  98. // The only fields common to all codeview records.
  99. WORD Length; // The length of the codeview record.
  100. WORD Index; // One of the above values.
  101. } CV_HEADER;
  102. typedef struct _CV_COMPILE_FLAG {
  103. CV_HEADER Header;
  104. BYTE Machine;
  105. BYTE Flags[3];
  106. BYTE VersionNameLength;
  107. char Version[DEFAULT_NAME_SIZE];
  108. } CV_COMPILE_FLAG;
  109. typedef struct _CV_REGISTER {
  110. CV_HEADER Header;
  111. WORD Type;
  112. WORD Register;
  113. BYTE NameLength;
  114. char Name[DEFAULT_NAME_SIZE];
  115. } CV_REGISTER;
  116. typedef struct _CV_REGISTER_NEW {
  117. CV_HEADER Header;
  118. DWORD Type;
  119. WORD Register;
  120. BYTE NameLength;
  121. char Name[DEFAULT_NAME_SIZE];
  122. } CV_REGISTER_NEW;
  123. typedef struct _CV_CONSTANT {
  124. CV_HEADER Header;
  125. WORD Type;
  126. } CV_CONSTANT;
  127. typedef struct _CV_CONSTANT_NEW {
  128. CV_HEADER Header;
  129. DWORD Type;
  130. } CV_CONSTANT_NEW;
  131. typedef struct _CV_UDT {
  132. CV_HEADER Header;
  133. WORD Type;
  134. BYTE NameLength;
  135. char Name[DEFAULT_NAME_SIZE];
  136. } CV_UDT;
  137. typedef struct _CV_UDT_NEW {
  138. CV_HEADER Header;
  139. DWORD Type;
  140. BYTE NameLength;
  141. char Name[DEFAULT_NAME_SIZE];
  142. } CV_UDT_NEW;
  143. typedef struct _CV_SSEARCH {
  144. CV_HEADER Header;
  145. DWORD SymOff;
  146. WORD Segment;
  147. } CV_SSEARCH;
  148. typedef struct _CV_OBJECT_FILENAME {
  149. CV_HEADER Header;
  150. DWORD Signature;
  151. BYTE NameLength;
  152. char Name[DEFAULT_NAME_SIZE];
  153. } CV_OBJECT_FILENAME;
  154. typedef struct _CV_COBOLUDT {
  155. CV_HEADER Header;
  156. WORD Type;
  157. BYTE NameLength;
  158. char Name[DEFAULT_NAME_SIZE];
  159. } CV_COBOLUDT;
  160. typedef struct _CV_COBOLUDT_NEW {
  161. CV_HEADER Header;
  162. DWORD Type;
  163. BYTE NameLength;
  164. char Name[DEFAULT_NAME_SIZE];
  165. } CV_COBOLUDT_NEW;
  166. typedef struct _CV_MANYREG {
  167. CV_HEADER Header;
  168. WORD Type;
  169. BYTE Count;
  170. BYTE Data[DEFAULT_NAME_SIZE];
  171. } CV_MANYREG;
  172. typedef struct _CV_MANYREG_NEW {
  173. CV_HEADER Header;
  174. DWORD Type;
  175. BYTE Count;
  176. BYTE Data[DEFAULT_NAME_SIZE];
  177. } CV_MANYREG_NEW;
  178. typedef struct _CV_RETURN {
  179. CV_HEADER Header;
  180. WORD Flags;
  181. BYTE Style;
  182. BYTE Data[DEFAULT_NAME_SIZE];
  183. } CV_RETURN;
  184. typedef struct _CV_BPREL16 {
  185. CV_HEADER Header;
  186. WORD Offset;
  187. WORD Type;
  188. BYTE NameLength;
  189. char Name[DEFAULT_NAME_SIZE];
  190. } CV_BPREL16;
  191. typedef struct _CV_LDATA16 {
  192. CV_HEADER Header;
  193. WORD Offset;
  194. WORD Segment;
  195. WORD Type;
  196. BYTE NameLength;
  197. char Name[DEFAULT_NAME_SIZE];
  198. } CV_LDATA16;
  199. typedef struct _CV_GDATA16 {
  200. CV_HEADER Header;
  201. WORD Offset;
  202. WORD Segment;
  203. WORD Type;
  204. BYTE NameLength;
  205. char Name[DEFAULT_NAME_SIZE];
  206. } CV_GDATA16;
  207. typedef struct _CV_PUB16 {
  208. CV_HEADER Header;
  209. WORD Offset;
  210. WORD Segment;
  211. WORD Type;
  212. BYTE NameLength;
  213. char Name[DEFAULT_NAME_SIZE];
  214. } CV_PUB16;
  215. typedef struct _CV_LPROC16 {
  216. CV_HEADER Header;
  217. DWORD pParent;
  218. DWORD pEnd;
  219. DWORD pNext;
  220. WORD ProcLength;
  221. WORD DebugStart;
  222. WORD DebugEnd;
  223. WORD Offset;
  224. WORD Segment;
  225. WORD ProcType;
  226. BYTE Flags;
  227. BYTE NameLength;
  228. char Name[DEFAULT_NAME_SIZE];
  229. } CV_LPROC16;
  230. typedef struct _CV_GPROC16 {
  231. CV_HEADER Header;
  232. DWORD pParent;
  233. DWORD pEnd;
  234. DWORD pNext;
  235. WORD ProcLength;
  236. WORD DebugStart;
  237. WORD DebugEnd;
  238. WORD Offset;
  239. WORD Segment;
  240. WORD ProcType;
  241. BYTE Flags;
  242. BYTE NameLength;
  243. char Name[DEFAULT_NAME_SIZE];
  244. } CV_GPROC16;
  245. typedef struct _CV_THUNK16 {
  246. CV_HEADER Header;
  247. DWORD pParent;
  248. DWORD pEnd;
  249. WORD pNext;
  250. WORD Offset;
  251. WORD Segment;
  252. WORD Length;
  253. BYTE Ordinal;
  254. BYTE NameLength;
  255. char Name[DEFAULT_NAME_SIZE];
  256. } CV_THUNK16;
  257. typedef struct _CV_BLOCK16 {
  258. CV_HEADER Header;
  259. DWORD pParent;
  260. DWORD pEnd;
  261. WORD Length;
  262. WORD Offset;
  263. WORD Segment;
  264. BYTE NameLength;
  265. char Name[DEFAULT_NAME_SIZE];
  266. } CV_BLOCK16;
  267. typedef struct _CV_WITH16 {
  268. CV_HEADER Header;
  269. DWORD pParent;
  270. DWORD pEnd;
  271. WORD Length;
  272. WORD Offset;
  273. WORD Segment;
  274. BYTE StringLength;
  275. char String[DEFAULT_NAME_SIZE];
  276. } CV_WITH16;
  277. typedef struct _CV_LABEL16 {
  278. CV_HEADER Header;
  279. WORD Offset;
  280. WORD Segment;
  281. BYTE Flags;
  282. BYTE NameLength;
  283. char Name[DEFAULT_NAME_SIZE];
  284. } CV_LABEL16;
  285. typedef struct _CV_CEXMODEL16 {
  286. CV_HEADER Header;
  287. WORD Offset;
  288. WORD Segment;
  289. WORD Model;
  290. BYTE DataLength;
  291. BYTE Data[DEFAULT_NAME_SIZE];
  292. } CV_CEXMODEL16;
  293. typedef struct _CV_VFTPATH16 {
  294. CV_HEADER Header;
  295. WORD Offset;
  296. WORD Segment;
  297. WORD Root;
  298. WORD Path;
  299. } CV_VFTPATH16;
  300. typedef struct _CV_REGREL16 {
  301. CV_HEADER Header;
  302. WORD Offset;
  303. WORD Register;
  304. WORD Type;
  305. BYTE NameLength;
  306. char Name[DEFAULT_NAME_SIZE];
  307. } CV_REGREL16;
  308. typedef struct _CV_BPREL32 {
  309. CV_HEADER Header;
  310. DWORD Offset;
  311. WORD Type;
  312. BYTE NameLength;
  313. char Name[DEFAULT_NAME_SIZE];
  314. } CV_BPREL32;
  315. typedef struct _CV_LDATA32 {
  316. CV_HEADER Header;
  317. DWORD Offset;
  318. WORD Segment;
  319. WORD Type;
  320. BYTE NameLength;
  321. char Name[DEFAULT_NAME_SIZE];
  322. } CV_LDATA32;
  323. typedef struct _CV_GDATA32 {
  324. CV_HEADER Header;
  325. DWORD Offset;
  326. WORD Segment;
  327. WORD Type;
  328. BYTE NameLength;
  329. char Name[DEFAULT_NAME_SIZE];
  330. } CV_GDATA32;
  331. typedef struct _CV_PUB32 {
  332. CV_HEADER Header;
  333. DWORD Offset;
  334. WORD Segment;
  335. WORD Type;
  336. BYTE NameLength;
  337. char Name[DEFAULT_NAME_SIZE];
  338. } CV_PUB32;
  339. typedef struct _CV_LPROC32 {
  340. CV_HEADER Header;
  341. DWORD pParent;
  342. DWORD pEnd;
  343. DWORD pNext;
  344. DWORD ProcLength;
  345. DWORD DebugStart;
  346. DWORD DebugEnd;
  347. DWORD Offset;
  348. WORD Segment;
  349. WORD ProcType;
  350. BYTE Flags;
  351. BYTE NameLength;
  352. char Name[DEFAULT_NAME_SIZE];
  353. } CV_LPROC32;
  354. typedef struct _CV_GPROC32 {
  355. CV_HEADER Header;
  356. DWORD pParent;
  357. DWORD pEnd;
  358. DWORD pNext;
  359. DWORD ProcLength;
  360. DWORD DebugStart;
  361. DWORD DebugEnd;
  362. DWORD Offset;
  363. WORD Segment;
  364. WORD ProcType;
  365. BYTE Flags;
  366. BYTE NameLength;
  367. char Name[DEFAULT_NAME_SIZE];
  368. } CV_GPROC32;
  369. typedef struct _CV_BPREL32_NEW {
  370. CV_HEADER Header;
  371. DWORD Offset;
  372. DWORD Type;
  373. BYTE NameLength;
  374. char Name[DEFAULT_NAME_SIZE];
  375. } CV_BPREL32_NEW;
  376. typedef struct _CV_LDATA32_NEW {
  377. CV_HEADER Header;
  378. DWORD Type;
  379. DWORD Offset;
  380. WORD Segment;
  381. BYTE NameLength;
  382. char Name[DEFAULT_NAME_SIZE];
  383. } CV_LDATA32_NEW;
  384. typedef struct _CV_GDATA32_NEW {
  385. CV_HEADER Header;
  386. DWORD Type;
  387. DWORD Offset;
  388. WORD Segment;
  389. BYTE NameLength;
  390. char Name[DEFAULT_NAME_SIZE];
  391. } CV_GDATA32_NEW;
  392. typedef struct _CV_PUB32_NEW {
  393. CV_HEADER Header;
  394. DWORD Type;
  395. DWORD Offset;
  396. WORD Segment;
  397. BYTE NameLength;
  398. char Name[DEFAULT_NAME_SIZE];
  399. } CV_PUB32_NEW;
  400. typedef struct _CV_LPROC32_NEW {
  401. CV_HEADER Header;
  402. DWORD pParent;
  403. DWORD pEnd;
  404. DWORD pNext;
  405. DWORD ProcLength;
  406. DWORD DebugStart;
  407. DWORD DebugEnd;
  408. DWORD ProcType;
  409. DWORD Offset;
  410. WORD Segment;
  411. BYTE Flags;
  412. BYTE NameLength;
  413. char Name[DEFAULT_NAME_SIZE];
  414. } CV_LPROC32_NEW;
  415. typedef struct _CV_GPROC32_NEW {
  416. CV_HEADER Header;
  417. DWORD pParent;
  418. DWORD pEnd;
  419. DWORD pNext;
  420. DWORD ProcLength;
  421. DWORD DebugStart;
  422. DWORD DebugEnd;
  423. DWORD ProcType;
  424. DWORD Offset;
  425. WORD Segment;
  426. BYTE Flags;
  427. BYTE NameLength;
  428. char Name[DEFAULT_NAME_SIZE];
  429. } CV_GPROC32_NEW;
  430. typedef struct _CV_THUNK32 {
  431. CV_HEADER Header;
  432. DWORD pParent;
  433. DWORD pEnd;
  434. DWORD pNext;
  435. DWORD Offset;
  436. WORD Segment;
  437. WORD ThunkLength;
  438. BYTE Ordinal;
  439. BYTE Data[DEFAULT_NAME_SIZE];
  440. } CV_THUNK32;
  441. typedef struct _CV_BLOCK32 {
  442. CV_HEADER Header;
  443. DWORD pParent;
  444. DWORD pEnd;
  445. DWORD Length;
  446. DWORD Offset;
  447. WORD Segment;
  448. BYTE NameLength;
  449. char Name[DEFAULT_NAME_SIZE];
  450. } CV_BLOCK32;
  451. typedef struct _CV_WITH32 {
  452. CV_HEADER Header;
  453. DWORD pParent;
  454. DWORD pEnd;
  455. DWORD Length;
  456. DWORD Offset;
  457. WORD Segment;
  458. BYTE StringLength;
  459. char String[DEFAULT_NAME_SIZE];
  460. } CV_WITH32;
  461. typedef struct _CV_LABEL32 {
  462. CV_HEADER Header;
  463. DWORD Offset;
  464. WORD Segment;
  465. BYTE Flags;
  466. BYTE NameLength;
  467. char Name[DEFAULT_NAME_SIZE];
  468. } CV_LABEL32;
  469. typedef struct _CV_CEXMODEL32 {
  470. CV_HEADER Header;
  471. DWORD Offset;
  472. WORD Segment;
  473. WORD Model;
  474. BYTE Variant[DEFAULT_NAME_SIZE];
  475. } CV_CEXMODEL32;
  476. typedef struct _CV_VFTPATH32 {
  477. CV_HEADER Header;
  478. DWORD Offset;
  479. WORD Segment;
  480. WORD Root;
  481. WORD Path;
  482. } CV_VFTPATH32;
  483. typedef struct _CV_VFTPATH32_NEW {
  484. CV_HEADER Header;
  485. DWORD Root;
  486. DWORD Path;
  487. DWORD Offset;
  488. WORD Segment;
  489. } CV_VFTPATH32_NEW;
  490. typedef struct _CV_REGREL32 {
  491. CV_HEADER Header;
  492. DWORD Offset;
  493. WORD Register;
  494. WORD Type;
  495. BYTE NameLength;
  496. char Name[DEFAULT_NAME_SIZE];
  497. } CV_REGREL32;
  498. typedef struct _CV_REGREL32_NEW {
  499. CV_HEADER Header;
  500. DWORD Offset;
  501. DWORD Type;
  502. WORD Register;
  503. BYTE NameLength;
  504. char Name[DEFAULT_NAME_SIZE];
  505. } CV_REGREL32_NEW;
  506. typedef struct _CV_LTHREAD32 {
  507. CV_HEADER Header;
  508. DWORD Offset;
  509. WORD Segment;
  510. WORD Type;
  511. BYTE NameLength;
  512. char Name[DEFAULT_NAME_SIZE];
  513. } CV_LTHREAD32;
  514. typedef struct _CV_GTHREAD32 {
  515. CV_HEADER Header;
  516. DWORD Offset;
  517. WORD Segment;
  518. WORD Type;
  519. BYTE NameLength;
  520. char Name[DEFAULT_NAME_SIZE];
  521. } CV_GTHREAD32;
  522. typedef struct _CV_LTHREAD32_NEW {
  523. CV_HEADER Header;
  524. DWORD Type;
  525. DWORD Offset;
  526. WORD Segment;
  527. BYTE NameLength;
  528. char Name[DEFAULT_NAME_SIZE];
  529. } CV_LTHREAD32_NEW;
  530. typedef struct _CV_GTHREAD32_NEW {
  531. CV_HEADER Header;
  532. DWORD Type;
  533. DWORD Offset;
  534. WORD Segment;
  535. BYTE NameLength;
  536. char Name[DEFAULT_NAME_SIZE];
  537. } CV_GTHREAD32_NEW;
  538. // Missing out MIPS ones for now. Surely they aren't useful!
  539. typedef struct _CV_PROCREF {
  540. CV_HEADER Header;
  541. DWORD Checksum;
  542. DWORD Offset;
  543. WORD Module;
  544. } CV_PROCREF;
  545. typedef struct _CV_DATAREF {
  546. CV_HEADER Header;
  547. DWORD Checksum;
  548. DWORD Offset;
  549. WORD Module;
  550. } CV_DATAREF;
  551. typedef struct _BASE_POINTER {
  552. char DebugSignature[4];
  553. DWORD lfoBase;
  554. } BASE_POINTER;
  555. typedef struct _HASH_INFO_RECORD {
  556. WORD symhash;
  557. WORD addrhash;
  558. DWORD cbSymbol;
  559. DWORD cbSymHash;
  560. DWORD cbAddrHash;
  561. } HASH_INFO_RECORD;