An LE module that uses procedures of other modules names them in two tables at the end of the fixup section. The fixup records that patch the calls refer to a module by its number in the first table, and to a procedure by its ordinal or by the offset of its name in the second. There is no separate import directory: the imports are the fixups.
Import module names
The import module name table is at the header’s offset 0x70, from the
start of the LE header, and holds as many names as the header’s count
(0x74). Each name is a length byte followed by that many characters, with
no zero at the end. Fixups number the modules from 1, in the order of this table.
Import procedure names
The import procedure name table is at the header’s offset 0x78 and runs
to the end of the fixup section: the fixup page table offset plus the fixup section
size. It is a run of length-prefixed names, like the module names. The high bit of each
length byte is a flag, which IBM’s description reserves for future parameter type
checking, so a length is the low seven bits. Fixups that import by name give the offset
of the name in this table; the first byte is usually an empty name, so that no real
name is at offset 0.
The explorer lists the imports it finds in the fixups, by module and procedure name or ordinal, with the number of places that use each, and labels those places in the code.
Example
Windows VxDs reach other drivers and the system through their own call mechanism,
not through imports, and REGVXD.VXD imports nothing. Its header puts both import tables
at +0x81E, with a count of 0 modules, and its fixup section ends there
too: 0x164 + 0x6BA = 0x81E. Both tables are empty.