authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-08-31 19:30:51+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-08-31 19:30:51+02:00
log540d8cd809f888042406dbcfd292c23ab71b8285
tree79f34ba71c3146589c36d683f813a512671b3bf0
parent26e98391322645f2d09aaaaf36d94cae06424a18

coff: add import table definitions


1 files changed, 85 insertions(+), 0 deletions(-)

lib/std/coff.zig+85
...@@ -419,6 +419,91 @@ pub const DebugType = enum(u32) {...@@ -419,6 +419,91 @@ pub const DebugType = enum(u32) {
419 EX_DLLCHARACTERISTICS = 20,419 EX_DLLCHARACTERISTICS = 20,
420};420};
421421
422pub const ImportDirectoryEntry = extern struct {
423 /// The RVA of the import lookup table.
424 /// This table contains a name or ordinal for each import.
425 /// (The name "Characteristics" is used in Winnt.h, but no longer describes this field.)
426 import_lookup_table_rva: u32,
427
428 /// The stamp that is set to zero until the image is bound.
429 /// After the image is bound, this field is set to the time/data stamp of the DLL.
430 time_date_stamp: u32,
431
432 /// The index of the first forwarder reference.
433 forwarder_chain: u32,
434
435 /// The address of an ASCII string that contains the name of the DLL.
436 /// This address is relative to the image base.
437 name_rva: u32,
438
439 /// The RVA of the import address table.
440 /// The contents of this table are identical to the contents of the import lookup table until the image is bound.
441 import_address_table_rva: u32,
442};
443
444pub const ImportLookupEntry32 = struct {
445 pub const ByName = packed struct {
446 name_table_rva: u31,
447 flag: u1 = 0,
448 };
449
450 pub const ByOrdinal = packed struct {
451 ordinal_number: u16,
452 unused: u15 = 0,
453 flag: u1 = 1,
454 };
455
456 const mask = 0x80000000;
457
458 pub fn getImportByName(raw: u32) ?ByName {
459 if (mask & raw != 0) return null;
460 return @bitCast(ByName, raw);
461 }
462
463 pub fn getImportByOrdinal(raw: u32) ?ByOrdinal {
464 if (mask & raw == 0) return null;
465 return @bitCast(ByOrdinal, raw);
466 }
467};
468
469pub const ImportLookupEntry64 = struct {
470 pub const ByName = packed struct {
471 name_table_rva: u31,
472 unused: u32 = 0,
473 flag: u1 = 0,
474 };
475
476 pub const ByOrdinal = packed struct {
477 ordinal_number: u16,
478 unused: u47 = 0,
479 flag: u1 = 1,
480 };
481
482 const mask = 0x8000000000000000;
483
484 pub fn getImportByName(raw: u64) ?ByName {
485 if (mask & raw != 0) return null;
486 return @bitCast(ByName, raw);
487 }
488
489 pub fn getImportByOrdinal(raw: u64) ?ByOrdinal {
490 if (mask & raw == 0) return null;
491 return @bitCast(ByOrdinal, raw);
492 }
493};
494
495/// Every name ends with a NULL byte. IF the NULL byte does not fall on
496/// 2byte boundary, the entry structure is padded to ensure 2byte alignment.
497pub const ImportHintNameEntry = extern struct {
498 /// An index into the export name pointer table.
499 /// A match is attempted first with this value. If it fails, a binary search is performed on the DLL's export name pointer table.
500 hint: u16,
501
502 /// Pointer to NULL terminated ASCII name.
503 /// Variable length...
504 name: [1]u8,
505};
506
422pub const SectionHeader = extern struct {507pub const SectionHeader = extern struct {
423 name: [8]u8,508 name: [8]u8,
424 virtual_size: u32,509 virtual_size: u32,