Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

332 lines
9.7 KiB

savedCS = 4
savedIP = 2
savedBP = 0
savedDS = -2
EMAGIC = 05A4Dh
ERESWDS = 0010h
ENEWHDR = 003Eh
ENEWEXE = 0040h
EXE_HDR STRUC
e_magic DW ? ; magic in same location
e_cblp DW ?
e_cp DW ?
e_crlc DW ?
e_cparhdr DW ?
e_minalloc DW ?
e_maxalloc DW ?
e_ss DW ?
e_sp DW ?
e_csum DW ?
e_cs DW ?
e_ip DW ?
e_lfarlc DW ?
e_ovno DW ?
e_res DW ERESWDS DUP (?)
e_lfanew DD ?
EXE_HDR ENDS
NEMAGIC = 454Eh
NERESBYTES = 0
NEW_EXE STRUC
ne_magic DW ? ; Magic value 'NE'
ne_ver DB ? ; version number
ne_rev DB ? ; revision number
ne_enttab DW ? ; offset to entry table
ne_cbenttab DW ? ; number of bytes in entry table
ne_crc DD ? ; CRC of file
ne_flags DW ? ; flag word
ne_autodata DW ? ; segment number of auto data segment
ne_heap DW ? ; initial size of local heap
ne_stack DW ? ; initial size of stack
ne_csip DD ? ; CS:IP start address
ne_sssp DD ? ; SS:SP initial stack pointer. 0 if
; stack size word non-zero
ne_cseg DW ? ; number of segment in segment table
ne_cmod DW ? ; number of entries in module reference table
ne_cbnrestab DW ? ; number of bytes in non-resident name table
ne_segtab DW ? ; NE relative offset to segment table
ne_rsrctab DW ? ; NE relative offset to resource table
ne_restab DW ? ; NE relative offset to resident name table
ne_modtab DW ? ; NE relative offset to module reference table
ne_imptab DW ? ; NE relative offset to imported name table
ne_nrestab DD ? ; file offset to non-resident name table
ne_cmovent DW ? ; Count of movable entries
ne_align DW ? ; Alignment shift count for segment data
ne_cres DW ? ; Count of resource segments
ne_exetyp DB ? ; Target operating system
ne_flagsothers DB ? ; Other .EXE flags
ne_pretthunks DW ? ; offset to return thunks
ne_psegrefbytes DW ? ; offset to segment ref. bytes
ne_swaparea DW ? ; Minimum code swap area size
ne_expver DW ? ; Expected Windows version number
NEW_EXE ENDS
; Chksum not supported unless ne_psegcsum defined in NEW_EXE structure
ne_psegcsum = word ptr ne_exetyp
ne_onextexe = word ptr ne_crc
; New 3.0 Gang Load area description
ne_gang_start = ne_pretthunks
ne_gang_length = ne_psegrefbytes
NEW_EXE1 STRUC
DW ?
ne_usage DW ?
DW ?
ne_pnextexe DW ?
ne_pautodata DW ?
ne_pfileinfo DW ?
NEW_EXE1 ENDS
NENOTP = 8000h ; Not a process (i.e. a library module)
NEPRIVLIB = 4000h ; A library which lives above the line
NEIERR = 2000h ; Errors in image
NEAPPTYP = 0700h ; Application type mask
NENOTWINCOMPAT = 0100h ; Not compatible with P.M. Windowing
NEWINCOMPAT = 0200h ; Compatible with P.M. Windowing
NEWINAPI = 0300h ; Uses P.M. Windowing API
NEFLTP = 0080h ; Floating-point instructions
NEI386 = 0040h ; 386 instructions
NEI286 = 0020h ; 286 instructions
NEI086 = 0010h ; 8086 instructions
NEPROT = 0008h ; Runs in protected mode only
NEPPLI = 0004h ; Per-Process Library Initialization
NEINST = 0002h ; Instance data
NESOLO = 0001h ; Solo data
; Below are the private bits used by the Windows 2.0 loader. All are
; in the file, with the exception of NENONRES and NEWINPROT which are
; runtime only flags.
;
NEWINPROT = NEIERR
NENONRES = NEFLTP ; Contains non-resident code segments
NEALLOCHIGH = NEI386 ; Private allocs above the line okay
NEEMSSEPINST = NEI286 ; Want each instance in separate
NELIM32 = NEI086 ; Uses LIM 3.2 API (Intel Above board)
; Following private bit is a runtime only flag used only ROM Windows.
NEMODINROM = NEEMSSEPINST ; Module loaded from ROM
;
; Format of NE_FLAGSOTHERS(x):
;
; 7 6 5 4 3 2 1 0 - bit no
; | | | |
; | | | +---------------- Support for long file names
; | | +------------------ 2.x app runs in protect mode
; | +-------------------- 2.x app gets prop. font
; +---------------------- Contains gangload area
;
NELONGNAMES = 1h
NEINFONT = 2h ; WIN30 - 2.x app runs in 3.x prot mode
NEINPROT = 4h ; WIN30 - 2.x app gets proportional font
NEGANGLOAD = 8h ; WIN30 - Contains gangload area
NEASSUMENODEP = 10h ; WIN40 - DllEntryPoint known not to exit
NEINTLAPP = 40h ; WIN31 - intl versions use this.
NEHASPATCH = 80h ; WIN40 - Some segs of this module get patched
; Target operating systems
NE_UNKNOWN = 0 ; Unknown (any "new-format" OS)
NE_OS2 = 1 ; Microsoft/IBM OS/2 (default)
NE_WINDOWS = 2 ; Microsoft Windows
NE_DOS4 = 3 ; Microsoft MS-DOS 4.x
NE_DEV386 = 4 ; Microsoft Windows 386
ifndef NO_APPLOADER
NEAPPLOADER = 0800h ; set if application has its own loader
endif ;!NO_APPLOADER
NEW_SEG STRUC
ns_sector DW ? ; logical sector number in file of start of segment
ns_cbseg DW ? ; number bytes in file
ns_flags DW ? ; segment flags
ns_minalloc DW ? ; minimum number bytes to allocate for segment
NEW_SEG ENDS
NEW_SEG1 STRUC
DB SIZE NEW_SEG DUP (?)
ns_handle DW ? ; Handle to segment (0 if not loaded)
NEW_SEG1 ENDS
NSTYPE = 0007h ; Segment type mask
NSCODE = 0000h ; Code segment
NSDATA = 0001h ; Data segment
NSITER = 0008h ; Iterated segment data
NSMOVE = 0010h ; Moveable segment
NSSHARE = 0020h ; Shareable segment
NSPRELOAD = 0040h ; Preload this segment
NSERONLY = 0080h ; EXECUTE ONLY code/READ ONLY data segment
NSRELOC = 0100h ; Relocation information following segment data
NSDPL = 0C00h ; 286 DPL bits
NSDISCARD = 1000h ; Discard priority bits
NS286DOS = 0EE06h ; These bits only used by 286DOS
NSALIGN = 9 ; Default alignment shift count for seg. data
NSALLOCED = 0002h ; set if ns_handle points to uninitialized mem.
NSLOADED = 0004h ; set if ns_handle points to initialized mem.
NSUSESDATA = 0400h ; set if an entry point in this segment uses
; the automatic data segment of a SOLO library
NSGETHIGH = 0200h
NSINDIRECT = 2000h
NSWINCODE = 4000h ; flag for code
NSKCACHED = 0800h ; cached by kernel
NSPRIVLIB = NSITER
NSNOTP = 8000h
NSINROM = NSINDIRECT ; segment is loaded in ROM
NSCOMPR = NSGETHIGH ; segment is compressed in ROM
ifndef NO_APPLOADER
NSCACHED = 8000h ;* in AppLoader Cache
endif ;!NO_APPLOADER
NEW_RSRC STRUC
rs_align DW ?
NEW_RSRC ENDS
RSORDID = 08000h ; If high bit of rt_id or rn_id set then integer id
RSRC_TYPEINFO STRUC
rt_id DW ?
rt_nres DW ?
rt_proc DD ?
RSRC_TYPEINFO ENDS
RSRC_NAMEINFO STRUC
rn_offset DW ?
rn_length DW ?
rn_flags DW ?
rn_id DW ?
rn_handle DW ?
rn_usage DW ?
RSRC_NAMEINFO ENDS
RNMOVE = 00010h ; Moveable resource
RNPURE = 00020h ; Pure resource (read only)
RNPRELOAD = 00040h ; Preload this resource
RNDISCARD = 01000h ; Discard bit
RNLOADED = 00004h ; True if handler proc return handle
RNCOMPR = 00200h ; Resource is compressed in ROM
RNINROM = 02000h ; Resource is loaded in ROM (run time flag)
RNUNUSED = 0CD8Bh ; Unused resource flags
ENTFIXED STRUC
entflags DB ?
entoffset DW ?
ENTFIXED ENDS
if SWAPPRO
ENTMOVEABLE STRUC
DB ? ; Entry flags
entsar DB 5 DUP (?) ; sar cs:[xxxx] instruction
DW ? ; INT 0F0H for swap profiler
entjmpfarop DB ?
entjmpfaroff DW ?
entjmpfarseg DW ?
ENTMOVEABLE ENDS
ENTSWAPPED STRUC
DB ? ; Entry flags
DB 5 DUP (?) ; sar cs:[xxxx] instruction
DW ? ; INT 0F0H for swap profiler
entintop DB ?
entintvec DB ?
entintsegno DB ?
entintoff DW ?
ENTSWAPPED ENDS
else ; no swap profiler
ENTMOVEABLE STRUC
DB ? ; Entry flags
entsar DB 5 DUP (?) ; sar cs:[xxxx] instruction
entjmpfarop DB ?
entjmpfaroff DW ?
entjmpfarseg DW ?
ENTMOVEABLE ENDS
ENTSWAPPED STRUC
DB ? ; Entry flags
DB 5 DUP (?) ; sar cs:[xxxx] instruction
entintop DB ?
entintvec DB ?
entintsegno DB ?
entintoff DW ?
ENTSWAPPED ENDS
endif ; if swap profiler
errnz <SIZE ENTMOVEABLE - SIZE ENTSWAPPED>
PENT STRUC
penttype DB ?
pentflags DB ?
pentsegno DB ?
pentoffset DW ?
PENT ENDS
PM_EntStruc STRUC
PM_EntStart dw ?
PM_EntEnd dw ?
PM_EntNext dw ?
PM_EntStruc ENDS
ENT_UNUSED = 000h
ENT_ABSSEG = 0FEh
ENT_MOVEABLE = 0FFh
ENT_PUBLIC = 001h
ENT_DATA = 002h
INTOPCODE = 0CDh
if SWAPPRO
SWAPVECTOR = 0F0h
endif
NEW_RLCINFO STRUC
nr_nreloc DW ?
NEW_RLCINFO ENDS
NEW_RLC STRUC
nr_stype DB ?
nr_flags DB ?
nr_soff DW ?
nr_mod DW ?
nr_proc DW ?
NEW_RLC ENDS
nr_segno EQU nr_flags+3
nr_entry EQU nr_proc
NRSTYP = 07h
NRSBYTE = 00h
NRSSEG = 02h
NRSPTR = 03h
NRSOFF = 05h
NRADD = 04h
NRRTYP = 03h
NRRINT = 00h
NRRORD = 01h
NRRNAM = 02h
OSFIXUP = 03h