windows-nt/Source/XPSP1/NT/base/mvdm/wow16/kernel31/winkern.inc
2020-09-26 16:20:57 +08:00

490 lines
16 KiB
PHP

MASTER_OBJECT_SIZE equ 512
LOCALHEAP_SIG EQU 'HL'
GLOBALHEAP_SIG EQU 'HG'
; Debug fill constants
DBGFILL_ALLOC equ 0fdh
DBGFILL_FREE equ 0fbh
DBGFILL_BUFFER equ 0f9h
DBGFILL_STACK equ 0f7h
ife PMODE32
; Data structure that describes an allocation arena. Both the local
; and global allocators use this structure at the beginning of their
; information structures.
;
HeapInfo STRUC
hi_check DW ? ; arena check word (non-zero enables heap checking)
hi_freeze DW ? ; arena frozen word (non-zero prevents compaction)
hi_count DW ? ; #entries in arena
hi_first DW ? ; first arena entry (sentinel, always busy)
hi_last DW ? ; last arena entry (sentinel, always busy)
hi_ncompact DB ? ; #compactions done so far (max of 3)
hi_dislevel DB ? ; current discard level
hi_distotal DW ? ; total amount discarded so far
hi_htable DW ? ; head of handle table list
hi_hfree DW ? ; head of free handle table list
hi_hdelta DW ? ; #handles to allocate each time
hi_hexpand DW ? ; address of near procedure to expand handles for
; this arena
hi_pstats DW ? ; address of statistics table or zero
HeapInfo ENDS
else ; PMODE32
; Data structure that describes an allocation arena. Both the local
; and global allocators use this structure at the beginning of their
; information structures.
;
HeapInfo STRUC
hi_check DW ? ; arena check word (non-zero enables heap checking)
hi_freeze DW ? ; arena frozen word (non-zero prevents compaction)
hi_count DW ? ; #entries in arena
hi_first DW ? ; first arena entry (sentinel, always busy)
DW ?
hi_last DW ? ; last arena entry (sentinel, always busy)
DW ?
hi_ncompact DB ? ; #compactions done so far (max of 3)
hi_dislevel DB ? ; current discard level
hi_distotal DD ? ; total amount discarded so far
hi_htable DW ? ; head of handle table list
hi_hfree DW ? ; head of free handle table list
hi_hdelta DW ? ; #handles to allocate each time
hi_hexpand DW ? ; address of near procedure to expand handles for
; this arena
hi_pstats DW ? ; address of statistics table or zero
HeapInfo ENDS
phi_first equ dword ptr hi_first
phi_last equ dword ptr hi_last
endif ; PMODE32
; Handle table entry.
HandleEntry STRUC
he_address DW ? ; actual address of object
he_flags DB ? ; flags and priority level
he_seg_no DB ? ; 0-based segment number for discardable code
HandleEntry ENDS
he_EMSPID_no equ byte ptr he_seg_no
FreeHandleEntry STRUC
he_link DW ?
he_free DW ?
FreeHandleEntry ENDS
LocalHandleEntry STRUC
lhe_address DW ? ; actual address of object
lhe_flags DB ? ; flags and priority level
lhe_count DB ? ; lock count
LocalHandleEntry ENDS
LocalFreeHandleEntry STRUC
lhe_link DW ?
lhe_free DW ?
LocalFreeHandleEntry ENDS
he_owner EQU he_address ; Discarded objects contain owner field
; here so we know when to free handle
; table entries of discarded objects.
HE_DISCARDABLE EQU 00Fh ; Discard level of this object
HE_DISCARDED EQU 040h ; Marks objects that have been discarded.
HE_FREEHANDLE EQU 0FFFFh ; Use -1 to mark free handle table entries
LHE_DISCARDABLE EQU 00Fh ; Discard level of this object
LHE_DISCARDED EQU 040h ; Marks objects that have been discarded.
LHE_USERFLAGS EQU 01Fh ; Mask for user setable flags
LHE_FREEHANDLE EQU 0FFFFh ; Use -1 to mark free handle table entries
HE_ALIGN = 4-1
HE_MASK = NOT HE_ALIGN
; Handles are allocated in blocks of N, where N is the hi_hdelta field
; in the local heap information structure. The last word of each block
; of handles is used to thread the blocks together, allowing all handles
; to be enumerated. The first word of every block is the number of
; handle table entries in the block. Not only does it save us code
; in henum, but it also has the convenient property of placing all
; handle entries on 2 byte boundaries (i.e. 2, 6, 10, 14), since the
; LA_MOVEABLE bit is 02h. Thus the address of the he_address field of
; a handle table entry is also the address of the handle table entry
; itself.
HandleTable STRUC
ht_count DW ? ; # handletable entries in this block
ht_entry DB SIZE HandleEntry DUP (?)
HandleTable ENDS
LocalHandleTable STRUC
lht_count DW ? ; # handletable entries in this block
lht_entry DB SIZE LocalHandleEntry DUP (?)
LocalHandleTable ENDS
; Local arena objects are kept in a doubly linked list.
LocalArena STRUC
la_prev DW ? ; previous arena entry (first entry points to self)
la_next DW ? ; next arena entry (last entry points to self)
la_handle DW ? ; back link to handle table entry
LocalArena ENDS
la_fixedsize = la_handle ; Fixed arena headers stop here
LA_MINBLOCKSIZE = la_fixedsize*4 ;*** This must be larger than LocalArenaFree
; free blocks have these extra items.
la_size = la_handle ; size of block (includes header data)
LocalArenaFree STRUC
DB SIZE LocalArena DUP (?)
la_free_prev DW ? ; previous free entry
la_free_next DW ? ; next free entry
LocalArenaFree ENDS
la_freefixedsize = SIZE LocalArenaFree ; Free block header stops here
; Local arena objects are aligned on 4 byte boundaries, leaving the
; low order two bits always zero.
LA_ALIGN = 4-1
LA_MASK = NOT LA_ALIGN
LA_FREE = 00h
LA_BUSY = 01h ; Saved in la_prev field of header
errnz <LA_ALIGN - LA_MOVEABLE - LA_BUSY>
; Flags passed to LocalAlloc (zero is the default case)
LA_MOVEABLE EQU 02h ; Saved in la_prev field of header
LA_NOCOMPACT EQU 10h
LA_ZEROINIT EQU 40h
LA_MODIFY EQU 80h
; Data structure that describes the local arena. Allocated as the first
; object in each local heap. _pLocalHeap is a reserved location each
; automatic data segment that contains the pointer to this structure.
LocalInfo STRUC
DB SIZE HeapInfo DUP (?)
li_notify DD ? ; Far proc to call whenever a local block is moved
li_lock DW ? ; arena lock word
li_extra DW ? ; minimum amount to grow DS by
li_minsize DW ? ; minimum size of heap
li_sig DW ? ; signature for local heap
LocalInfo ENDS
; Notify procedure message codes
LN_OUTOFMEM = 0 ; Out of memory - arg1 = #bytes needed
LN_MOVE = 1 ; Object moved - arg1 = handle arg2 = old location
LN_DISCARD = 2 ; Object discard? - arg1 = handle, arg2 = discard flags
; Returns new discard flags in AX
LocalStats STRUC
ls_ljoin DW ? ; #calls to ljoin
ls_falloc DW ? ; #calls to lalloc with forward search
ls_fexamine DW ? ; #arena entries examined by ls_falloc calls
ls_fcompact DW ? ; #calls to lcompact by ls_falloc calls
ls_ffound DW ? ; #ls_falloc calls that found a block
ls_ffoundne DW ? ; #ls_falloc calls that failed to find a block
ls_malloc DW ? ; #calls to lalloc with backward search
ls_mexamine DW ? ; #arena entries examined by ls_malloc calls
ls_mcompact DW ? ; #calls to lcompact by ls_malloc calls
ls_mfound DW ? ; #ls_malloc calls that found a block
ls_mfoundne DW ? ; #ls_malloc calls that failed to find a block
ls_fail DW ? ; #times lalloc failed because unable to grow DS
ls_lcompact DW ? ; #calls to lcompact
ls_cloop DW ? ; #repeated compacts after discarding
ls_cexamine DW ? ; #entries examined in compaction loop
ls_cfree DW ? ; #free entries examined in compaction loop
ls_cmove DW ? ; #moveable entries moved by compaction
LocalStats ENDS
IncLocalStat MACRO n
if KDEBUG
inc ds:&n[di+SIZE LocalInfo]
endif
ENDM
; Global arena objects are kept in a doubly linked list.
;
ifdef WOWJUNK
GlobalArena STRUC
ga_count DB ? ; lock count for movable segments
ga_flags DB ? ; 1 byte available for flags
ga_owner DW ? ; DOS 2.x 3.x owner field (current task)
ga_size DW ? ; DOS 2.x 3.x size, in paragraphs, not incl. header
ga_prev DW ? ; previous arena entry (first points to self)
ga_next DW ? ; next arena entry (last points to self)
ga_handle DW ? ; back link to handle table entry
ga_lruprev DW ? ; Previous handle in lru chain
ga_lrunext DW ? ; Next handle in lru chain
GlobalArena ENDS
else
GlobalArena STRUC
ga_count DB ? ; lock count for movable segments
ga_owner DW ? ; DOS 2.x 3.x owner field (current task)
ga_size DW ? ; DOS 2.x 3.x size, in paragraphs, not incl. header
ga_flags DB ? ; 1 byte available for flags
ga_prev DW ? ; previous arena entry (first points to self)
ga_next DW ? ; next arena entry (last points to self)
ga_handle DW ? ; back link to handle table entry
ga_lruprev DW ? ; Previous handle in lru chain
ga_lrunext DW ? ; Next handle in lru chain
GlobalArena ENDS
endif; WOW
ga_sig = byte ptr ga_count ; DOS =< 3.x signature byte for fixed segs
ga_freeprev = word ptr ga_lruprev ; links for free segs
ga_freenext = word ptr ga_lrunext ; links for free segs
if PMODE32
DEFAULT_ARENA_SIZE equ 8000h ; Initial length of arena array
;
; 32 bit Protect Mode Arena
;
GlobalArena32 STRUC
pga_next DD ? ; next arena entry (last points to self)
pga_prev DD ? ; previous arena entry (first points to self)
pga_address DD ? ; 32 bit linear address of memory
pga_size DD ? ; 32 bit size in bytes
pga_handle DW ? ; back link to handle table entry
pga_owner DW ? ; Owner field (current task)
pga_count DB ? ; lock count for movable segments
pga_pglock DB ? ; # times page locked
pga_flags DB ? ; 1 word available for flags
pga_selcount DB ? ; Number of selectors allocated
pga_lruprev DD ? ; Previous entry in lru chain
pga_lrunext DD ? ; Next entry in lru chain
GlobalArena32 ENDS
.ERRNZ 32-size GlobalArena32
pga_sig = word ptr pga_count
pga_freeprev = dword ptr pga_lruprev ; links for free segs
pga_freenext = dword ptr pga_lrunext ; links for free segs
endif ; PMODE32
GA_SIGNATURE = 04Dh
GA_ENDSIG = 05Ah
; there are many special kinds of blocks, marked in the owner word
GA_SENTINAL = -1 ; a sentinal block
GA_BOGUS_BLOCK = -7 ; a block temporary marked allocated
GA_BURGERMASTER = -3 ; the master object
GA_NOT_THERE = -4 ; used with EEMS to link out unallocatable
; memory such as the EGA etc.
GA_PHANTOM = -5 ; A block that has no EMS banks banked in.
GA_WRAITH = -6 ; A block used to hold up partition headers.
; Global arena objects are aligned on 2 para. boundaries, leaving the
; low order bit always zero.
GA_ALIGN = 2-1
GA_MASK = NOT GA_ALIGN
GA_FIXED = 1
; It is specific to WOW only. This handle was generated by WIN32, ChandanC.
GA_WOWHANDLE = 3
errnz <GA_FIXED-GA_ALIGN>
; Low byte of flags passed to GlobalAlloc (zero is the default case)
GA_ALLOCHIGH EQU 01h ; Flag to indicate allocate high
GA_MOVEABLE EQU 02h
GA_SEGTYPE EQU 0Ch ; These 2 bits stored in he_flags field
GA_DGROUP EQU 04h
GA_DISCCODE EQU 08h
GA_NOCOMPACT EQU 10h
GA_NODISCARD EQU 20h
GA_ZEROINIT EQU 40h
GA_MODIFY EQU 80h
GA_NEWEXPANDED EQU 80h ; Use new EMS allocation scheme
; These flags for use by KERNEL only (caller's CS must match)
GA_INTFLAGS = GA_ALLOCHIGH+GA_SEGTYPE or (GA_CODE_DATA+GA_ALLOC_DOS) shl 8
; High byte of flags remembered in handle table (he_flags field)
GA_DISCARDABLE EQU 01h ; Boolean flag for global object, not a level.
GA_CODE_DATA EQU 02h ; CODE or DATA seg that belongs to a task.
;GA_DGROUP EQU 04h
;GA_DISCCODE EQU 08h
GA_ALLOC_LOW EQU 10h ; Alloc in Lower land, overrides GA_ALLOC_EMS
GA_SHAREABLE EQU 20h ; Shareable object
GA_DDESHARE EQU 20h ; A shared memory object used for DDE.
;HE_DISCARDED EQU 40h ; Marks objects that have been discarded.
;GAH_NOTIFY EQU 40h
GA_ALLOC_DOS EQU 80h ; Alloc in DOS land if protected mode
GA_USERFLAGS = GA_SHAREABLE + GA_DISCARDABLE
; Flags stored in the global arena header
GAH_PHANTOM EQU 01h ; This block is either a phantom or a wraith
GAH_DONT_GROW EQU 02h ; Don't grow this data segment.
GAH_DGROUP EQU GA_DGROUP
GAH_DISCCODE EQU GA_DISCCODE
GAH_NOTIFY EQU 40h
GAH_FIXED EQU 80h
GAH_CURSORICON EQU 10h ; WOW uses this flag
;
; GAH_PHANTOM is unused in Win 3.0 and Win 3.1
; ChandanC
;
GAH_WOWDDEFREEHANDLE EQU GAH_PHANTOM ; This is used to mark the DDE handle
;
; Global Memory Stats definitions
; Offsets in array
;
cGLOBALALLOC EQU 0
cGLOBALREALLOC EQU 4
cGLOBALFREE EQU 8
cGLOBALFREEALL EQU 12
cGLOBALLOCK EQU 16
cGLOBALUNLOCK EQU 20
cGLOBALSIZE EQU 24
cGLOBALCOMPACT EQU 28
cLOCKSEGMENT EQU 32
cUNLOCKSEGMENT EQU 36
cGLOBALFIX EQU 40
cGLOBALUNFIX EQU 44
cGLOBALHANDLE EQU 48
cGLOBALFLAGS EQU 52
NGLOBALSTATS EQU (56/4)
; Data structure that describes the global arena. Allocated at the end
; of the local heap information structure. DO NOT CHANGE THE ORDER OF
; THE ENTRIES! The alt sequence and normal sequence must match!
GlobalInfo STRUC
DB SIZE HeapInfo DUP (?)
gi_lrulock DW ? ; Lock out access to LRU chain from interrupt level
ife PMODE32
gi_lruchain DW ? ; First handle in lru chain (most recently used)
else
gi_lruchain DD ? ; First handle in lru chain (most recently used)
endif
gi_lrucount DW ? ; #entries in LRU chain
ife PMODE32
gi_reserve DW ? ; #paras to reserve for disc code, 0 => not enabled
gi_disfence DW ? ; Fence for discardable code.
else
gi_reserve DD ? ; #paras to reserve for disc code, 0 => not enabled
gi_disfence DD ? ; Fence for discardable code.
endif
gi_free_count DW ? ; Count of all the free partitions.
gi_alt_first DW ? ; first entry in alternate arena
gi_alt_last DW ? ; last entry in alternate arena
gi_alt_count DW ? ; count of entries in alternate arena
gi_alt_lruchain DW ? ; First handle in lru chain (most recently used)
gi_alt_lrucount DW ? ; #entries in LRU chain
gi_alt_reserve DW ? ; alternate reserve
gi_alt_disfence DW ? ; Fence for discardable code.
gi_alt_free_count DW ? ; Count of all the free partitions.
gi_alt_pPhantom DW ? ; Pointer to the first pPhantom block.
gi_disfence_hi DW ? ; High word of fence
gi_flags DW ? ; some flags! !!! should merge with freeze and check
gi_stats DD NGLOBALSTATS dup(?)
GlobalInfo ENDS
gi_cmpflags = byte ptr hi_dislevel ; Flags to control gcompact
gi_disfence_lo = word ptr gi_disfence
GIF_INT2 EQU 01h
BOOT_COMPACT EQU 80h
COMPACT_ALLOC EQU 40h ; Fast abort in gcompact for allocations
CMP_FLAGS EQU GA_NODISCARD or GA_NOCOMPACT or GA_DISCCODE or COMPACT_ALLOC
; Notify procedure message codes
GN_MOVE = 1 ; Object moved - arg1 = handle arg2 = old location
GN_DISCARD = 2 ; Object discard? - arg1 = handle, arg2 = discard flags
; Returns new discard flags in AX
SASTRUC STRUC
sa_size dw 0 ; size, in bytes, of the alias list
sa_allocated dw 0 ; number of allocated entries
SASTRUC ENDS
SAENTRY STRUC
sae_sel dw 0 ; selector of the object
sae_alias dw 0 ; alias of the object
SAENTRY ENDS
MAXFHCACHELEN = 12 ; Max number of file handles cached
MINFHCACHELEN = 2 ; Min number of file handles cached
fhCacheStruc struc
Cachefh dw ? ; File handle
CacheExe dw ? ; Exe handle
fhCacheStruc ends
; NAMETBL is a structure defining a private resource called a name table.
; It is a resource that maps string resource types and names into unique
; ordinal ids - this way all resources identified by name or type with
; a string can actually be loaded by id. This is for OS/2 compatibility
; with named resources.
;
; typedef struct nametbl { /* ntbl */
; int cbEntry; /* size of structure */
; int idType; /* type id or string replc if (idType & RSORDID) */
; int idName; /* name id or string replc if (idName & RSORDID) */
; char achTypeName[1]; /* 0 term type followed by 0 term name */
; } NAMETBL;
ntbl struc
ntbl_cbEntry dw ?
ntbl_idType dw ?
ntbl_idName dw ?
ntbl_achTypeName db ?
ntbl ends
RT_NAMETABLE equ 15
ifdef WOW
if PMODE32
PAGE_READWRITE EQU 0004h
MEM_COMMIT EQU 1000h
MEM_RESERVE EQU 2000h
MEM_RELEASE EQU 8000h
MEM_COMMIT_RESERVE EQU 3000h
endif
endif
ifdef WOW
ife PMODE32
DpmiBlock struc
DBSize dw 0
DBSel dw 0
DBHandleLow dw 0
DBHandleHigh dw 0
DpmiBlock ends
NUM_DPMI_BLOCKS equ 20
endif
endif
ifdef WOW_x86
FLAT_SEL equ 23H
endif