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

573 lines
21 KiB
NASM

TITLE KDATA - Kernel data area
win3debdata=1
include gpfix.inc ; include first to define segment order
include kernel.inc
include gpcont.inc ; do we alloc Sherlock data items?
extrn __ahshift:ABS ; Pull in LDBOOT.ASM next from KERNOBJ.LIB
sBegin CODE
externFP Int21Handler
sEnd CODE
public __acrtused
__acrtused = 9697
;------------------------------------------------------------------------
; Segment definations to define labels at the segment start. Don't put
; any code or data here.
;------------------------------------------------------------------------
sBegin INITCODE
labelB <PUBLIC,initcode>
labelB <PUBLIC,beg_initcode>
sEnd INITCODE
DataBegin INIT
labelB <PUBLIC,initdata>
labelB <PUBLIC,beg_initdata>
DataEnd INIT
;------------------------------------------------------------------------
; D A T A S E G M E N T V A R I A B L E S
;------------------------------------------------------------------------
DataBegin
; The following items must remain in the same location and order. These
; items also appear in the initial paragraph of each application's DS.
ORG 0
DW 0
globalW oOldSP,0
globalW hOldSS,5
globalW pLocalHeap,0
globalW pAtomTable,0
globalW pStackTop,<dataOffset gmove_stack_top>
globalW pStackMin,<dataOffset gmove_stack>
globalW pStackBot,<dataOffset gmove_stack>
;------------------------------------------------------------------------
if KDEBUG
; If this word gets trashed, then we overflowed our stack
globalW gmove_stack_sig,STACK_SIGNATURE,16
endif
labelB <PUBLIC,lpszFileName> ; Used in FileCDR_notify
gmove_stack_top label byte
EVEN
DW 256 DUP (0) ; gmove requires at least 64 words
globalW gmove_stack,0
globalW prev_gmove_SP,0
globalW prev_gmove_SS,0
globalW ss_sel,0
;------------------------------------------------------------------
; The debugger requires that the following items remain in the same
; relative order.
labelW <PUBLIC,THHOOK> ; So ToolHelp can find this stuff, too.
globalW hGlobalHeap,0 ; Handle to master object
globalW pGlobalHeap,0 ; Current physical address of master object
globalW hExeHead,0 ; Head of module list maintained by Load/Free Module
globalW hExeSweep,0 ; ... 1st module for LRU sweep to examine
globalW topPDB,0 ; DOS PDB on entry
globalW headPDB,0 ; link list of PDBs
globalW topsizePDB,0 ; DOS PDB size upon entry
globalW headTDB,0 ; head of task queue
globalW curTDB,0 ; handle for currently running task
globalW loadTDB,0 ; handle for currently loading task
globalW LockTDB,0 ; handle of super task
globalW SelTableLen,0 ; DONT MOVE THIS
globalD SelTableStart,0 ; DONT MOVE THIS
if PMODE32
globalD hBmDPMI,0 ; DPMI handle to BurgerMaster
endif
;------------------------------------------------------------------------
globalW winVer,400h ; Windows version number for KERNEL.EXE header
globalW fWinx,0 ; Flag from ldboot.asm
globalW f8087,0 ; non zero if 8087 installed
globalW PHTcount,0 ; Count of tasks with a PHT
globalW hGDI,0 ; module handle of GDI
globalW hUser,0 ; module handle of User
globalW hShell,0 ; module handle of Shell
globalW fLMdepth,0 ; # of recursive LoadModules
globalW wDefRIP,0 ; Value to return from RIP in Debug
globalB num_Tasks,0 ; number of tasks (i.e. TDB's) in system
globalB InScheduler,0 ; True if inside scheduler
globalB graphics,1 ; True if user/keyboard/gdi/display loaded
DB 0
globalB fastfp,1 ; True if suppress FWAIT before FOp
;globalW PID_for_fake,0 ; the PID allocated for the fake task
;globalW EMS_calc_swap_line,0 ; The calculated swap line
;globalW EMSCurPID,0 ; The current PID.
globalW MaxCodeSwapArea,0 ; The max paragraphs SetSwapAreaSize can set.
globalW selLowHeap,0 ; selector to Windows Low ( < 640k) heap block
globalW cpLowHeap,0 ; count of paragraphs of Low heap block
globalW selHighHeap,0 ; selector to Windows High ( >640k) heap block
globalW selWoaPdb,0 ; selector to fixed low PDB for WinOldApp
globalW sel_alias_array,0 ; the selector alias array (286 only)
globalW temp_sel,0 ; Single pre-allocated selector
globalD dressed_for_success,0 ; callback into OS/2 mapping layer at app start
ife PMODE32
globalW hXMMHeap,0 ; XMS handle to secondary extended heap block
endif
globalD InDOS,0 ; -> in dos flags and stuff
globalD pSftLink,0 ; -> end of Sft chain when we started
globalD lpWinSftLink,0 ; -> first node in chain that windows adds
ifdef WOW
globalD pDosWowData,0 ; -> rmode pointer to DosWowData in DOSDATA
globalD pPMDosCDSCNT,0 ; -> DOS CDS Count variable
globalD pPMDosCURDRV,0 ; -> DOS CurDrv variable
globalD pPMDosPDB,0 ; -> pointer to PDB in DOSDATA
globalD pPMDosExterr,0 ; -> pointer to DOS Exterr var (word)
globalD pPMDosExterrLocus, 0 ; -> pointer to DOS ExterrLocus var (byte)
globalD pPMDosExterrActionClass,0 ; -> pointer to DOS ExterrActionClass (word, byte each)
endif
globalD pFileTable,0 ; -> beginning of Sft chain
globalW FileEntrySize,0 ; size of one sft entry
globalD curDTA,0 ; what DOS thinks is the current DTA
globalW cur_dos_PDB,0 ; what DOS thinks is the current PDB
globalW Win_PDB,0 ; what we want the PDB to be
globalW cur_drive_owner,0 ; last TDB to change the disk or directory
globalB fBreak,0 ; state of dos break flag between e&d dos
globalB LastDriveSwapped,0 ; drive letter of last drive where disk swap
globalB DOS_version,0 ; DOS major version number
globalB DOS_revision,0 ; DOS minor version number
globalB fInt21,0 ; Flag indicating INT 21 hooks are installed
globalB fNovell,0 ; Have Novell network
globalB fPadCode,0 ; Pad code segments for 286 chip bug
globalB CurDOSDrive,0FFh ; Current drive according to DOS
globalB DOSDrives,26 ; number of logical drives from DOS
;----------------------------------------------------------------------
; PhantArray is a byte array indexed by zero based drive number.
; A non-zero value indicates the drive is phantom.
globalB PhantArray,0,26
; Keyboard inquire structure
globalB fFarEast,0 ; non zero means far eastern keyboard
ifdef FE_SB
labelB <PUBLIC,DBCSVectorTable> ;LanguageId, SizeOfDBCSVector, [BeginRange, EndRange] []
dw 411h ;JAPAN
db 4, 81h, 9Fh, 0E0h, 0FCh
dw 412h ;KOREA
db 2, 81h, 0FEh
dw 404h ;TAIWAN
db 2, 81h, 0FEh
dw 804h ;PRC
db 2, 81h, 0FEh
dw 0C04h ;HONGKONG
db 2, 81h, 0FEh
db 0 ;End of table
globalB fDBCSLeadTable,0,256 ; DBCS lead byte index table
endif ;FE_SB
globalB KeyInfo,0,%(SIZE KBINFO)
; Procedure addresses initialized by InitFwdRef
ALIGN 4
globalD pSysProc,0 ; -> SYSTEM.InquireSystem
globalD pTimerProc,0 ; -> SYSTEM.CreateTimer
globalD pSystemTermProc,0 ; -> SYSTEM.Disable
globalD pKeyProc,0 ; -> KEYBOARD.AnsiToOem
globalD pKeyProc1,0 ; -> KEYBOARD.OemToAnsi
globalD pKeyboardTermProc,0 ; -> KEYBOARD.Disable
globalD pKeyboardSysReq,0 ; -> KEYBOARD.EnableKBSysReq
globalD pDisplayCritSec,0 ; -> DISPLAY.500
globalD pMouseTermProc,0 ; -> MOUSE.Disable
globalD pMBoxProc,0 ; -> USER.MessageBox
globalD pSErrProc,0 ; -> USER.SysErrorBox
globalD pExitProc,0 ; -> USER.ExitWindows
globalD pDisableProc,0 ; -> USER.DisableOEMLayer
globalD pUserInitDone,0 ; -> USER.routine to call when init is done
globalD pPostMessage,0 ; -> USER.PostMessage function
globalD pSignalProc,0 ; -> USER.SignalProc function
globalD pIsUserIdle,0 ; -> USER.IsUserIdle function
globalD pUserGetFocus,0 ; -> USER.GetFocus function
globalD pUserGetWinTask,0 ; -> USER.GetWindowTask function
globalD pUserIsWindow,0 ; -> USER.IsWindow function
globalD pGetFreeSystemResources,0 ; -> USER.GetFreeSystemResources function
globalD plstrcmp,0 ; -> USER.lstrcmp function
if ROM
globalD pYieldProc,0 ; -> USER.UserYield
globalD pStringFunc,0 ; -> USER.StringFunc function
globalD prevInt21proc,0 ; -> previous INT 21h handler
globalD prevInt24proc,0 ; -> previous Int 24h handler
globalD prevInt2Fproc,0 ; -> previous Int 24h handler
globalD prevInt3Fproc,0 ; -> previous Int 3Fh handler
globalD prevInt67proc,0 ; -> previous Int 67h handler
globalD prevInt00proc,0 ; -> previous INT 00h handler !! don't move
; !! don't move
globalD prevInt02proc,0 ; -> previous INT 02h handler !! don't move
globalD prevInt04proc,0 ; -> previous INT 04h handler !! don't move
globalD prevInt06proc,0 ; -> previous INT 06h handler !! don't move
globalD prevInt07proc,0 ; -> previous INT 07h handler !! don't move
globalD prevInt3Eproc,0 ; -> previous INT 3Eh handler !! don't move
globalD prevInt75proc,0 ; -> previous INT 75h handler !! don't move
globalD prevIntx6proc,0 ; -> previous invalid op-code Fault handler
globalD prevInt0Cproc,0 ; -> previous stack fault handler
globalD prevInt0Dproc,0 ; -> previous GP Fault handler
globalD prevInt0Eproc,0 ; -> previous Page Fault handler
endif
globalD lpInt21,0 ; support for NOVELL stealing int 21h
globalD myInt2F,0 ; support for NOVELL swapping with DOS apps
globalD FatalExitProc,0 ; Intercept for FatalExit()
globalD ptrace_dll_entry,0 ; -> ptrace engine DLL entry
globalD ptrace_app_entry,0 ; -> real entry point for app
globalD lpfnToolHelpProc,0 ; TOOLHELP.DLL PTrace function
globalW wExitingTDB,0 ; Flag for DebugWrite--no debug strings at exit
globalD shell_file_proc,0 ; -> shell for file create/del notify
globalW shell_file_TDB,0 ; shell TDB
if SWAPPRO
globalD prevIntF0proc,0 ; -> previous Int F0h handler
globalW hSwapPro,-1 ; file handle for swap profiler
globalB fSwappro,0 ; 0 = no swap info, 1 = swaps, 2 = all
DB 0
endif
globalD gcompact_start,0 ; start to measure swapping
globalD gcompact_timer,0 ; time spent in gcompact to measure swapping
ifdef FE_SB
ifndef KOREA
globalD pJpnSysProc,0 ; -> SYSTEM.JapanInquireSystem
endif
endif
globalW WinFlags,0 ; see kernel.inc for defs of these
globalB Kernel_Flags,0,4 ; see kernel.inc for defs of these
;
; WARNING!! Do not disturb the order of the next two variables....
; See GetLPErrormode in INT24.ASM ARR 7/23/87
;
globalB Kernel_InDOS,0 ; set when we call the REAL DOS
globalB Kernel_InINT24,0 ; set when Int 24h calls DOS funcs < 13
; fBooting bits:
; bit 1 (2h) is reset after kernel is loaded (for fixed blks alloc strategy)
; fBooting is zeroed as a whole after full booting by bootdone
globalB fBooting,3 ; Set to zero by bootdone
globalB fChkSum,0 ; Flag set if segment checksumming enabled
globalB fCheckFree,1 ; Set to zero by slowboot
globalB cdevat,0 ; Int 24 state
globalB errcap,0 ; Int 24 error capabilities mask
ifndef WOW
; profile APIs are thunked
globalB fProfileDirty,0 ; Profiles need writing
globalB fProfileMaybeStale,0 ; Profiles MAY need to be reread
globalB fWriteOutProfilesReenter,0 ; Are we currently in WriteOutProfiles?
endif
globalB fPokeAtSegments,1 ; Idle time load of segments
globalB fTaskSwitchCalled, 0 ; Local Reboot only works when task switching
globalD WinAppHooks,0 ; winapps can hook this for std winoldap.
public WOAName
WOAName DB 'WINOLDAP.MOD',0
globalB grab_name,0,128
ALIGN 4
globalD lpWindowsDir,0 ; -> to WFP of where win.ini lives
globalD lpSystemDir,0 ; -> to WFP of where kernel lives
globalW cBytesWinDir,0 ; length of WFP for windows dir
globalW cBytesSysDir,0 ; length of WFP for system dir
ifdef WOW
globalD lpSystemRootDir,0 ; -> value of SystemRoot environment var
globalD lpSystem16Dir,0 ; -> to WFP of \windows\system
globalD lpSystemWx86Dir,0 ; \windows\system32\Wx86
globalW cBytesSystemRootDir,0 ; length of SystemrootEnvironment var
globalW cBytesSys16Dir,0 ; in WOW lpSystemDir points to \windows\system32
globalW cBytesSysWx86Dir,0 ; in WOW Windows\system32\Wx86
public Sys16Suffix
Sys16Suffix DB '\system' ; append to WinDir to get lpSystem16Dir
public cBytesSys16Suffix
cBytesSys16Suffix DW ($ - dataoffset Sys16Suffix)
public SysWx86Suffix
SysWx86Suffix DB '\Sys32x86' ; append to WinDir to get lpSystemWx86Dir
public cBytesSysWx86Suffix
cBytesSysWx86Suffix DW ($ - dataoffset SysWx86Suffix)
endif
globalD lpGPChain,0 ; GP fault hack for WEPs - chain to this addr
if SHERLOCK
globalW gpTrying,0 ; Trying to continue after a GP fault
globalW gpEnable, 1 ; Enable GP continuation
globalW gpInsLen, 0 ; Length of faulting instruction
globalW gpSafe, 0 ; OK to skip current instruction
globalW gpRegs, 0 ; Regs modified by faulting insn
globalW gpStack, 0 ; movement of stack by faulting insn
endif
ifndef WOW
; The profile APIs are thunked for WOW
globalB WinIniInfo,0,%(size PROINFO)
globalB PrivateProInfo,0,%(size PROINFO)
endif ; ndef WOW
public szUserPro
szUserPro DB 'WIN.INI',0
ifndef WOW
DB 72 dup (0) ; Room for a long path
;;;globalB fUserPro,0 ; Current Profile is WIN.INI
;;;globalD lpszUserPro,0
endif
; ndef WOW
ifdef WOW
globalW hWinnetDriver, 0
endif ;WOW
globalW BufPos,0 ; buffer pointer with OutBuf
globalB OutBuf,0,70 ; 70 character out buffer
EVEN
globalW MyCSAlias,0 ; Kernel's CS/DS Alias
globalW MyCSSeg,0 ; Kernel's CS as a segment
globalW MyDSSeg,0 ; Kernel's DS as a segment
globalW hLoadBlock,0 ; Handle that points to in memory file image
globalW segLoadBlock,0 ; Segment address of file image
globalW wMyOpenFileReent, 0 ; Reentrant flag for MyOpenFile
ife ROM
globalW cpShrink,0
globalW cpShrunk,0 ; Delta from beginning of file to hLoadBlock
endif
if ROM
externD <lmaExtMemROM,cbExtMemROM>
globalD lmaHiROM,lmaExtMemROM
globalD cbHiROM,cbExtMemROM
globalW selROMTOC,0
globalW selROMLDT,0
globalW sel1stAvail,0
globalD linHiROM, 0
endif
if PMODE32
globalW PagingFlags,0
globalW ArenaSel,0
globalW FirstFreeSel,0
globalW CountFreeSel,0
globalD FreeArenaList,0
globalD FreeArenaCount,0
globalD HighestArena,0
globalD temp_arena,0
globalD NextCandidate,-1
globalW Win386_Blocks,0
globalW InitialPages,0
globalD lpReboot,0 ; Reboot VxD address
endif
globalW BaseDsc,0
globalW kr1dsc,0
globalW kr2dsc,0
globalW blotdsc,0
globalW DemandLoadSel,0
globalW fhcStealNext,<(MAXFHCACHELEN-1)*size fhCacheStruc+dataOffset fhCache> ; Next fhCache entry to use
globalW fhCacheEnd,<MAXFHCACHELEN*size fhCacheStruc+dataOffset fhCache> ; End of the cache
globalW fhCacheLen,MINFHCACHELEN
globalB fhCache,0,%(MAXFHCACHELEN*size fhCacheStruc)
if KDEBUG
globalB fLoadTrace, 0
globalB fPreloadSeg, 0
globalB fKTraceOut, 0 ; Used by DebugWrite to ignore traces
; to be sent to PTrace
endif
globalB fDW_Int21h, 0FFh ; FF if okay for DebugWrite to use Int 21h
if ROM and PMODE32
globalW gdtdsc,0
endif
ALIGN 2
if 0; EarleH
globalW LastCriticalError,-1
endif
globalW LastExtendedError,-1,3 ; Don't move this
globalW Reserved,0,8 ; Don't move this
ifdef WOW
;------------------------------------------------------------------------
; W O W G L O B A L D A T A
;------------------------------------------------------------------------
public achTermsrvWindowsDir ; per user windows directory (for .ini files)
achTermsrvWindowsDir DB MaxFileLen dup (0)
globalW wCurTaskSS,0 ; Currently Running Task SS
globalW wCurTaskBP,0 ; Currently Running Task BP
globalD Dem16to32handle,0 ; -> DOS Emulation 16 to 32 bit handle convertion
globalD FastBop,0 ; eip value for fast bop entry point
globalW FastBopCS,0 ; CS value for fast bop entry point
globalD FastWOW,0 ; eip for fast WOW32 entry point when doing thunk call
globalW FastWOWCS,0 ; CS value for fast wow entry point
globalD FastWOWCbRet,0 ; eip for fast WOW32 entrypoint to return from callback
globalW FastWOWCbRetCS,0; cs for above
globalW WOWFastBopping,0; non-zero if fast call to WOW32 enabled
; Jmp indirect through here for faster bops
globalB fExitOnLastApp,0 ; Close WOW when the last app exits (not WOWEXEC)
globalB fShutdownTimerStarted,0 ; 1 if the shutdown timer is running (shared WOW)
;; do not rearrange these or stick anything in the middle!
;;
;;
wowtablemodstart label byte
globalW MOD_KERNEL ,0 ; kernel must be first!
globalW MOD_DKERNEL ,0
globalW MOD_USER ,0
globalW MOD_DUSER ,0
globalW MOD_GDI ,0
globalW MOD_DGDI ,0
globalW MOD_KEYBOARD ,0
globalW MOD_SOUND ,0
globalW MOD_SHELL ,0
globalW MOD_WINSOCK ,0
globalW MOD_TOOLHELP ,0
globalW MOD_MMEDIA ,0
globalW MOD_COMMDLG ,0
ifdef FE_SB
globalW MOD_WINNLS ,0
globalW MOD_WIFEMAN ,0
endif ; FE_SB
globalW ModCount ,<($ - dataoffset wowtablemodstart) / 2>
;;
;;
;; do not rearrange these or stick anything in the middle!
globalW DebugWOW,1 ; bit 0 = 1 WOW is being debugged, 0 = WOW is not
globalW TraceOff,0 ; bit 0 = 1 turn off trace interrupts during apis
globalW WOWLastError,0 ; Last error returned by int 21
globalB WOWErrClass, 0
globalB WOWErrAction, 0
globalB WOWErrLocation, 0
endif
DataEnd
;------------------------------------------------------------------------
; C O D E S E G M E N T V A R I A B L E S
;------------------------------------------------------------------------
sBegin CODE
assumes cs,CODE
EVEN
dw 18h dup(0F4CCh) ; Catch them jmps, calls & rets to 0
; and offset segment for putting in HMA
if ROM
globalW MyCSDS,<seg _DATA> ; Kernel's DS
ife PMODE32
externW selLDTAlias
globalW gdtdsc,selLDTAlias ; Data alias to LDT
endif
else
globalW MyCSDS,0 ; Kernel's DS
globalW gdtdsc,0
endif
ALIGN 4
ife ROM
globalD pYieldProc,0 ; -> USER.UserYield
globalD pStringFunc,0 ; -> USER.StringFunc function
globalD prevInt21proc,0 ; -> previous INT 21h handler
globalD prevInt24proc,0 ; -> previous Int 24h handler
globalD prevInt2Fproc,0 ; -> previous Int 24h handler
globalD prevInt3Fproc,0 ; -> previous Int 3Fh handler
globalD prevInt67proc,0 ; -> previous Int 67h handler
globalD prevInt00proc,0 ; -> previous INT 00h handler !! don't move
; !! don't move
globalD prevInt02proc,0 ; -> previous INT 02h handler !! don't move
globalD prevInt04proc,0 ; -> previous INT 04h handler !! don't move
globalD prevInt06proc,0 ; -> previous INT 06h handler !! don't move
globalD prevInt07proc,0 ; -> previous INT 07h handler !! don't move
globalD prevInt3Eproc,0 ; -> previous INT 3Eh handler !! don't move
globalD prevInt75proc,0 ; -> previous INT 75h handler !! don't move
globalD prevIntx6proc,0 ; -> previous invalid op-code Fault handler
globalD prevInt0Cproc,0 ; -> previous stack fault handler
globalD prevInt0Dproc,0 ; -> previous GP Fault handler
globalD prevInt0Eproc,0 ; -> previous Page Fault handler
ifdef WOW
globalD prevInt31proc,0 ; used to speed dpmi calls
globalD oldInt00proc,0 ; for debugging traps
globalD prevInt01proc,0 ; for debugging traps
globalD prevInt03proc,0 ; for debugging traps
globalD prevInt10proc,0 ; -> previous INT 10 handler
endif
endif ;!ROM
if 0
PUBLIC DummyKeyboardOEMToAnsi
DummyKeyboardOEMToAnsi proc far
ret ; used for non-graphics version
DummyKeyboardOEMToAnsi endp
endif
sEnd CODE
;------------------------------------------------------------------------
; I N I T D A T A S E G M E N T V A R I A B L E S
;------------------------------------------------------------------------
DataBegin INIT
globalW oNRSeg,0
globalW oMSeg,0
globalD lpBootApp,0 ; Long pointer to app to run after booting
ifndef WOW
; WOW doesn't muck with WOAName buffer, we leave it as WINOLDAP.MOD
labelB <PUBLIC,woa_286>
db 'WINOLDAP.MOD'
labelB <PUBLIC,woa_386>
db 'WINOA386.MOD'
endif
labelB <PUBLIC,bootExecBlock>
EXECBLOCK <0,0,0,0>
globalW win_show,2
dw 1 ; show open window
DataEnd INIT
end