;* KERNEL32.INC ;* ;* (C) Copyright Microsoft Corp., 1988-1994 ;* ;* Main .ASM definitions ;* ;* Origin: Dos Extender ;* ;* Change history: ;* ;* Date Who Description ;* --------- --------- ------------------------------------------------- ;* 16-Feb-94 JonT Code cleanup ;* IFNDEF _KERNEL32_ _KERNEL32_ EQU 1 ; Calling Convention for internal KERNENTRY TEXTEQU include k16thk.inc ;===================================================================== ; Debug macros WOWDEBUG EQU 1 IFDEF WOWDEBUG DEB_FATAL equ 0 DEB_ERR equ 1 DEB_WARN equ 2 DEB_TRACE equ 3 ; VOID PrintFailedAssertion PROTO KERNENTRY, iln:SDWORD, szFile:PTR SBYTE ; VOID vDebugOut PROTO C, level:SDWORD, pfmt:VARARG Assert MACRO cond, disable:=<0> ;; Define file name if it's not already defined IFNDEF szSrcFile .DATA % szSrcFile BYTE "&@FileCur", 0 .CODE ENDIF IF disable EXITM ENDIF ;; Conditionally invoke function to print data .IF !(cond) INVOKE PrintFailedAssertion, @Line, ADDR szSrcFile .ENDIF ENDM Break TEXTEQU ELSE ;IFDEF DEBUG Assert MACRO cond ENDM Break TEXTEQU <> ENDIF MAJOR_VERSION EQU 1 MINOR_VERSION EQU 0 WIN_VERSION EQU 0 VERSION EQU WIN_VERSION OR \ (MAJOR_VERSION SHL 8) OR \ (MINOR_VERSION SHL 12) OR \ (OS SHL 15) ; Path name separators and other values that might be localized. wNetIni TEXTEQU chNetIni TEXTEQU chExtSep TEXTEQU chDirSep TEXTEQU chDirSep2 TEXTEQU chDrvSep TEXTEQU wRelDir TEXTEQU chRelDir TEXTEQU chMinDrv TEXTEQU chMaxDrv TEXTEQU chMinDrvLow TEXTEQU chMaxDrvLow TEXTEQU chEnvSep TEXTEQU chWldChr TEXTEQU chWldSeq TEXTEQU fbUpper EQU 11011111b ; Mask converts to uppercase Unused MACRO param unuseddummysymbol = SIZEOF param ENDM ;* Constants cbPage EQU 4096 fTrue EQU 1 fFalse EQU 0 ;* DOS maximum for paths and directories. Add one to each for null. cbNull EQU 1 cbDirMax EQU 260 ; \dir\subdir\..\file.ext cbDrvMax EQU 3 ; c:\ cbNetMax EQU 36 ; \\machine\share cbCompMax EQU 255 cbPathMax EQU 260 cbCmdMax EQU 100h - 80h ; All the room in PSP for command line cbCopyBufMin EQU 8000h ; 32K default ; The following is a "magic value" that we use on a number of the NET ; int 21h calls. The reason for this has to do with the way the INT 21 ; API mapper in DOSMGR.386 works. For INT 21s from protected mode that ; DOSMGR doesn't understand how to map, all of the segment registers in ; the client structure get set to 0 BY DESIGN. To keep the NET layers ; from getting confused, it needs to KNOW that the call is from WIN32 ; and the seg registers should just be ignored (all pointers are FLAT). ; We flag this case by putting this special signature in a 32-bit ; register, usually EBP. ; MAGICWIN32NETINT21SIG EQU 41524A44h ;* Wait constants dwWaitForever EQU 0FFFFFFFFh dwWaitNone EQU 0 PATH_INVALID EQU (-1) DRIVE_NO_ROOT EQU 1 DRIVE_INVALID EQU (-2) PATH_NETWORK EQU 2 PATH_ROOT_OR_REL_TO_CURDIR EQU 1 PATH_RELATIVE EQU 0 FILE_ATTRIBUTE_VALID_FLAGS EQU 67h ;* Type definitions SEL TYPEDEF WORD HM TYPEDEF DWORD ; Type for 16:16 and 16:32 far pointers. We only use these internally. FPVOID16 TYPEDEF FAR16 PTR FPVOID TYPEDEF FAR32 PTR ; Size of reserved memory region above and below stacks. Thunks always map ; a 64K stack selector, so we should have 64K reserved above the stack. STACK_BARRIER_SIZE EQU 10000h WIN16_TERMINATION_STACK_SIZE EQU 2000h ; Register State Context Structure. REGS STRUCT 4 regSS DWORD 0 regGS DWORD 0 regFS DWORD 0 regES DWORD 0 regDS DWORD 0 regEDI DWORD 0 regESI DWORD 0 regEBP DWORD 0 regESP DWORD 0 regEBX DWORD 0 regEDX DWORD 0 regECX DWORD 0 regEAX DWORD 0 regEIP DWORD 0 regCS DWORD 0 regEFL DWORD 0 REGS ENDS PREGS typedef PTR REGS ; Pointers to structures defined first so they can be used in structures LPNOD TYPEDEF PTR NOD LPLST TYPEDEF PTR LST NOD STRUCT 4 pnodNext LPNOD 0 ; pointer to the next node in the list pnodPrev LPNOD 0 ; pointer to the previous node in the list dwData DWORD 0 ; data element associated with this node NOD ENDS LST STRUCT 4 pnodHead LPNOD 0 ; pointer to first node in list pnodEnd LPNOD 0 ; pointer to last node in list pnodCur LPNOD 0 ; pointer to current node in list LST ENDS ; 16-bit CreateThread 32->16 thunk data THREAD_STARTUP_THUNK_DATA STRUCT 4 Param16 DWORD 0 StartAddress16 DWORD 0 THREAD_STARTUP_THUNK_DATA ENDS ;* ------------------------------------------------------------ * ;* If objects are not yet included, include them * ;* ------------------------------------------------------------ * IFNDEF typObjAny INCLUDE OBJECT.INC ENDIF cbKernelHeap EQU 262144 ; The following bits define the per page status information stored ; in the page info table. This table is an array of DWORDS, where ; each entry contains info bits for 6 pages (with the high two bits ; not used. mskPageInfo EQU 3Fh mskPageProtect EQU 0Fh mskPageType EQU 30h mskPageRsv EQU 10h mskPageCommit EQU 20h ; This structure is used to keep track of information about each ; memory allocation that the user makes. VMHD STRUCT 4 pvBase LPVOID 0 ; base address of the memory block cbSize DWORD 0 ; total size of the memory block hmDpmi DWORD 0 ; DPMI memory handle of the block pidOwner DWORD 0 ; process ID of memory block owner pbPageInfo LPSTR 0 ; pointer to page info table for object flStatus WORD 0 ; status flags for the memory block fGlobal WORD 0 ; flag for global or virtual APIs VMHD ENDS PVMHD TYPEDEF PTR VMHD LPVMHD TYPEDEF PTR VMHD ; *** Global variables *** ifdef WOW EXTERNDEF dwMEOWFlags:DWORD else ; WOW ifdef MEOW_LOGGING EXTERNDEF dwMEOWFlags:DWORD endif ; def MEOW_LOGGING endif ; def WOW EXTERNDEF selLDT:SEL EXTERNDEF pLDT:PTR DWORD EXTERNDEF dwDscAddrToRing3Sel:DWORD EXTERNDEF selK32Psp:SEL EXTERNDEF lmaUserBase:LPVOID EXTERNDEF szWinDir:LPSTR, szSysDir:LPSTR ifndef WOW EXTERNDEF pppdbCur:PTR LPPDB EXTERNDEF pptdbCur:PTR LPTDB EXTERNDEF ppTDBXCur:PTR PTR TDBX endif ; ndef WOW EXTERNDEF ppdbKernel:LPPDB EXTERNDEF ptdbWin16:LPTDB EXTERNDEF ptdbSvc:LPTDB EXTERNDEF bBeepControl:BYTE EXTERNDEF Win16Lock:PTR LCRST EXTERNDEF Krn32Lock:PTR LCRST EXTERNDEF selFlatCode:USHORT EXTERNDEF selFlatData:USHORT ;* Function Prototypes ;* THKINIT.ASM ; VOID ThkInit PROTO KERNENTRY ;* DXKRNL.C ; LPVOID PvKernelAlloc PROTO KERNENTRY, cbSize:DWORD ; VOID * PvKernelRealloc PROTO KERNENTRY, pvMem:LPVOID, cbSize:DWORD ; VOID FKernelFree PROTO KERNENTRY, pvMem:LPVOID ; LONG KernelInit PROTO KERNENTRY, pK32Data:DWORD ;VOID KernelUninit PROTO KERNENTRY ;* KRNLUTIL.ASM ; VOID FillBytes PROTO KERNENTRY, pbDst:LPSTR, cb:DWORD, bData:DWORD ; DWORD CbSizeSz PROTO KERNENTRY, szStr:LPSTR ; VOID CopySz PROTO KERNENTRY, szDst:LPSTR, szSrc:LPSTR ; VOID AppendSz PROTO KERNENTRY, szDst:LPSTR, szSrc:LPSTR ; VOID LCompareSz PROTO KERNENTRY, sz1:LPSTR, sz2:LPSTR ; VOID LCompareNSz PROTO KERNENTRY, sz1:LPSTR, sz2:LPSTR, n:DWORD ; VOID dputs PROTO KERNENTRY, sz:LPSTR ; VOID KInt21 PROTO KERNENTRY ; DWORD FGetSelBase PROTO KERNENTRY, selGet:WORD ;* HEAPMGR.C ; HANDLE HheapCreateHeap PROTO KERNENTRY, flOptions:DWORD, cbInitialSize:DWORD, cbMaxSize:DWORD ; VOID HeapInit PROTO KERNENTRY, pbHeap:LPVOID, flOptions:DWORD, cbInitialSize:DWORD, cbMaxSize:DWORD ; BOOL FHeapDestroy PROTO KERNENTRY, hheap:HANDLE ; LPVOID PvAllocHeapMem PROTO KERNENTRY, hheap:HANDLE, cbSize:DWORD ; LPVOID PvResizeHeapMem PROTO KERNENTRY, hheap:HANDLE, pvMem:LPVOID, cbNew:DWORD ; BOOL FFreeHeapMem PROTO KERNENTRY, hheap:HANDLE, pvMem:LPVOID ; DWORD CbSizeHeapMem PROTO KERNENTRY, hheap:HANDLE, pvMem:LPVOID ;* IOUTIL.ASM DFH_FILE_CREATE EQU 0010h DFH_FILE_OPEN EQU 0001h DFH_FILE_TRUNCATE EQU 0002h DFH_ACTION_OPENED EQU 0001h DFH_ACTION_CREATED_OPENED EQU 0002h DFH_ACTION_REPLACED_OPENED EQU 0003h DFH_MODE_READONLY EQU 0000h DFH_MODE_WRITEONLY EQU 0001h DFH_MODE_READWRITE EQU 0002h DFH_MODE_SHARE_COMPATIBILITY EQU 0000h DFH_MODE_SHARE_EXCLUSIVE EQU 0010h DFH_MODE_SHARE_DENYWRITE EQU 0020h DFH_MODE_SHARE_DENYREAD EQU 0030h DFH_MODE_SHARE_DENYNONE EQU 0040h DFH_MODE_NO_INHERIT EQU 0080h DFH_MODE_EXTENDED_SIZE EQU 1000h ; DfhOpenFile ; FCloseFile ; CbReadFile ; CbWriteFile ; CbWriteOutFile ; LfoSetFilePos ; DWORD GetDOSExtendedError PROTO KERNENTRY ;* PROCESS.C ;BOOL CreateProcessKernel PROTO KERNENTRY, :PTR, :PTR, :PTR, :WORD, :PTR, :PTR ;VOID TerminateProcessKernel PROTO KERNENTRY ;VOID ExitCurrentProcess PROTO KERNENTRY, :DWORD ;VOID TerminateProcessOutOfContext PROTO KERNENTRY, ppdb:PTR, dwStatus:DWORD ;VOID TerminateProcessFinal PROTO KERNENTRY, ppdb:PTR ;VOID DisposePDB PROTO KERNENTRY, ppdb:PTR ;PDB* NewPDB PROTO KERNENTRY, ppdbParent:PTR ;void* MemToHeap PROTO KERNENTRY, hheap:HANDLE, buf:PTR, len:DWORD ;char* StrToHeap PROTO KERNENTRY, hheap:HANDLE, pstr:PTR ;DWORD CbSizeEnv PROTO KERNENTRY, :PTR, :WORD ;BOOL FFindEnvVar PROTO KERNENTRY, :PTR, :PTR, :PTR ;DWORD SetPSP PROTO KERNENTRY, :DWORD ;DWORD GetPSP PROTO KERNENTRY ;VOID GlobalHandleSwitchToK32PSP PROTO KERNENTRY, :HANDLE, :LPDWORD ;VOID GlobalHandleRestorePSP PROTO KERNENTRY, :DWORD ;* thread.c ;void SetError PROTO KERNENTRY, dwError:DWORD ; BUGBUG [KevinR] 14-Apr-1993 ; This control-handler stuff is console-specific and should be ; separately included with wincon.inc. ;* Interface Definitions for control handlers (BREAK.C) ; Control constants for CONTROL+C and CONTROL+BREAK ctrlC EQU 0 ctrlBreak EQU 1 ctrlNone EQU 10 ctrlInactive EQU 20 ctrlTerminate EQU 30 ; Number of control handlers initially and for each new allocation cbCtrlInc EQU 8 ; typedef VOID (KERNENTRY *PFN_CONTROL)(DWORD CtrlType); PFN_CONTROL TYPEDEF PTR CONTROL_HANDLER TYPEDEF PROTO STDCALL :DWORD PCONTROL_HANDLER TYPEDEF PTR CONTROL_HANDLER ; Function Prototypes ; VOID ControlHandlerThread PROTO KERNENTRY ; BOOL FInitControlHandlers PROTO KERNENTRY :LPPDB ; VOID DestroyControlHandlers PROTO KERNENTRY :LPPDB ; BOOL FUpdateControlList PROTO KERNENTRY :LPPDB, :PCONTROL_HANDLER, :BOOL ; VOID DoControlHandlers PROTO KERNENTRY :DWORD ; VOID SwitchToControlThread PROTO KERNENTRY pedb:LPPDB, idControl:WORD ;* Interface Definitions for LE Loader (LELDR.C) */ ; BOOL FInitModuleMgr PROTO KERNENTRY ; BOOL FLoadKernelModule PROTO KERNENTRY, :LPPDB, :LPSTR ; BOOL FLoadProgram PROTO KERNENTRY, :LPPDB, :LPSTR, :LPWORD ; BOOL FLoadLibrary PROTO KERNENTRY, :LPPDB, :LPSTR, :LPWORD ; BOOL FFreeModule PROTO KERNENTRY, :LPPDB, :WORD ; BOOL RemoveProcessImte PROTO KERNENTRY, :LPPDB, :WORD ; char * SzFileFromImte PROTO KERNENTRY, :WORD ; char * SzFromImte PROTO KERNENTRY, :WORD ; VOID FreeUnusedModules PROTO KERNENTRY, :LPLST ; SHORT ImteFromSz PROTO KERNENTRY, :LPSTR ; SHORT ImteFromFileSz PROTO KERNENTRY, :LPSTR ; BOOL FGetProcAddr PROTO KERNENTRY, imte:SWORD, pvName:LPVOID, ppvProc:PTR LPVOID ;* DIRUTIL.C AO_IN equ 0 AO_OUT equ 1 AO_INOUT equ 2 AO_CONV_ANSI equ 0 AO_NO_CONV equ 1 ;LPSTR EnterResolveOemToAnsi PROTO KERNENTRY, szName:LPSTR, fInOut:DWORD ;VOID LeaveResolveOemToAnsi PROTO KERNENTRY, szSrcDest:LPSTR, fInOut:DWORD ;VOID LeaveResolveOemToAnsiEx PROTO KERNENTRY, szSrc:LPSTR, szDest:LPSTR, nSize:DWORD, fInOut:DWORD ;BOOL MarkOemToAnsiDone PROTO KERNENTRY, fNoConversion:DWORD ;VOID UnMarkOemToAnsiDone PROTO KERNENTRY ;* PROCUTIL.ASM ; VOID ThreadTerminationHandler PROTO KERNENTRY ; BOOL FBuildEnvArgs PROTO KERNENTRY, selPsp:SEL, pszProgName:PTR LPSTR, pszCmdLine:PTR LPSTR, ppchEnv:PTR LPSTR ; DWORD CbSearchPath PROTO KERNENTRY, lpPath:LPSTR, lpFileName:LPSTR, lpExtension:LPSTR, nBufferLength:DWORD, lpBuffer:LPSTR, lpFilePart:PTR LPSTR ; BOOL FIsDir PROTO KERNENTRY, lpDirPath:LPSTR ; LONG LValidateSecurity PROTO KERNENTRY, lpSecurity:LPSECURITY_ATTRIBUTES ; LONG LStrCmpI PROTO KERNENTRY, sz1:LPSTR, sz2:LPSTR ; LPSTR SzGetNamePos PROTO KERNENTRY, lpPath:LPSTR ; BOOL FGetFileInfo PROTO KERNENTRY, szName:LPSTR, fsAttrib:DWORD, lpFindFileData:LPWIN32_FIND_DATA ; DWORD CbAppendExt PROTO KERNENTRY, szName:LPSTR, szExt:LPSTR, cbBuf:DWORD ; BOOL FFixPathChars PROTO KERNENTRY, szPath:LPSTR ; DWORD CbStrUpr PROTO KERNENTRY, lpString:LPSTR ; VOID BeepOff PROTO KERNENTRY, bControl:BYTE ; DWORD GetPathType PROTO KERNENTRY, szPath:LPSTR ; ULONG GetLongName PROTO KERNENTRY lpFileName:LPCSTR, lpBuffer:LPSTR, cbBuffer:ULONG ; ULONG GetShortName PROTO KERNENTRY lpFileName:LPCSTR, lpBuffer:LPSTR, cbBuffer:ULONG ;* PROCUTIL.ASM - Internal register based functions ; EDI (LPSTR) FindEnvVar PROTO KERNENTRY ; EDI (LPSTR) ; EAX (LPSTR) and CARRY StrToBuffer PROTO KERNENTRY ; ESI (LPSTR) ; EDI (LPSTR) ; ECX (DWORD) ; DWORD CheckDrive PROTO KERNENTRY ; EAX (DWORD) ; BOOL ValidateDrive PROTO KERNENTRY, Drive:DWORD ; BOOL IsDriveFixed PROTO KERNENTRY, Drive:DWORD ; DWORD GetEnvDir PROTO KERNENTRY ; EDI (LPSTR) ; ESI (LPSTR) ; ECX (DWORD) ; Carry FcExistFile PROTO KERNENTRY ; ESI ; VOID SzStrCpy PROTO KERNENTRY ; ESI (LPSTR) ; EDI (LPSTR) ; VOID SzStrCat PROTO KERNENTRY ; ESI (LPSTR) ; EDI (LPSTR) ; LPSTR StrScan PROTO KERNENTRY ; EDI (LPSTR) ; AL (BYTE) ; LPSTR StrRScan PROTO KERNENTRY ; EDI (LPSTR) ; ESI (LPSTR) ; AL (BYTE) ;* DIRUTIL.C ; DWORD CbGetCurDir PROTO KERNENTRY, :DWORD, :LPSTR ; BOOL FSetCurDir PROTO KERNENTRY, :LPSTR ; DWORD FMakeFullName PROTO KERNENTRY, :LPSTR, :LPSTR, :LPSTR ; DWORD DwMakeFullPath PROTO KERNENTRY, :LPSTR, :LPSTR, :LPDWORD, :PTR LPSTR ; DWORD FNextFromDirList PROTO KERNENTRY, :PTR LPSTR, :LPSTR, :LPSTR, :LPSTR ; LPSTR PchGetNetDir PROTO KERNENTRY, pch:LPSTR ; KRNINIT.ASM ; BOOL FGetMediaData PROTO KERNENTRY, bDrive:BYTE, pvMedia:LPVOID ; VOID SetCritErrAction PROTO KERNENTRY, fFail:WORD ; BOOL FGetCritErr PROTO KERNENTRY ; DWORD IdGetClearCritErr PROTO KERNENTRY ; VOID SetCritErrId PROTO KERNENTRY, id:WORD ; DWORD IdGetControl PROTO KERNENTRY ; VOID SetControlId PROTO KERNENTRY, id:SWORD ; WORD IdWindows PROTO KERNENTRY ;* FILEHOPS.ASM ; BYTE ReadChar PROTO KERNENTRY, fEcho:BOOL ; DWORD ReadLine PROTO KERNENTRY, lpBuffer:LPSTR, cbBuffer:DWORD ;* CTIME.C ; BOOL FileTimeToDosDateTimeEx PROTO KERNENTRY, :PTR, :LPWORD, :LPWORD, :LPWORD ; BOOL DosDateTimeToFileTimeEx PROTO KERNENTRY, :WORD, :WORD, :WORD, :PTR ; ** Utility Macros ; Performance tricks for loading and comparing zero ; Load a register with zero movz MACRO reg sub reg, reg ENDM ; Load a register with -1 movn1 MACRO reg, kind IFIDNI , ; Small sub reg, reg ; 2 bytes, 2 clocks dec reg ; 1 byte, 2 clocks ELSE ; Fast mov reg, -1 ; 5 (eax), 4 (ax), 2 (al) bytes, 2 clocks ENDIF ENDM ; Load a register with 1 mov1 MACRO reg, kind IFIDNI , ; Small sub reg, reg ; 2 bytes, 2 clocks inc reg ; 1 byte, 2 clocks ELSE ; Fast mov reg, 1 ; 5 (eax), 4 (ax), 2 (al) bytes, 2 clocks ENDIF ENDM ; Compare a register to zero cmpz MACRO reg or reg, reg ENDM ; Drive letter macros DriveNumToLet MACRO regmem IF ((OPATTR regmem) AND 010y) OR ((OPATTR regmem) AND 010000y) add regmem, 'A' ELSE .ERR ENDIF ENDM DriveLetToNum MACRO regmem IF ((OPATTR regmem) AND 010y) OR ((OPATTR regmem) AND 010000y) sub regmem, 'A' ELSE .ERR ENDIF ENDM ; Localized versions of these may be different. Upper MACRO regmem IF ((OPATTR regmem) AND 010y) OR ((OPATTR regmem) AND 010000y) and regmem, 11011111y ; Convert letter to upper case ELSE .ERR ENDIF ENDM Lower MACRO regmem IF ((OPATTR regmem) AND 010y) OR ((OPATTR regmem) AND 010000y) or regmem, 00100000y ; Convert letter to lower case ELSE .ERR ENDIF ENDM ErrSet MACRO ecode IFIDNI , movzx eax, ax INVOKE SetError, eax ELSE INVOKE SetError, ecode ENDIF ENDM ; Macros to push and pop register lists pushes MACRO reglist:VARARG FOR reg, push reg ENDM ENDM pops MACRO reglist:VARARG LOCAL regs regs TEXTEQU <> FOR reg, regs CATSTR , regs regs CATSTR <,>, regs ENDM regs SUBSTR regs, 2 regs CATSTR , regs, > % FOR reg, regs pop reg ENDM ENDM ; Macros for start and end of each API call INCLUDE APITRACE.INC ifdef DEBUG ApiEnterTrace PROTO KERNENTRY, ApiNumber:DWORD api_entry MACRO ApiNumber:REQ invoke ApiEnterTrace, ApiNumber ENDM else api_entry MACRO ApiNumber:REQ ENDM endif api_exit MACRO ApiNumber:REQ ENDM ;* These are values that are passed to PnodGetLstElem to tell it ;* which element to return from the list. ;/ idLstGetFirst = 0 ;* get first element of list */ idLstGetNext = 1 ;* get next element of the list */ idLstGetPrev = 2 ;* get the previous element of the list */ idLstGetLast = 4 ;* get the last element of the list */ ;* These are values that are passed to AddListElem to tell it where ;* to put an element being added to the list. ;/ idLstAddFirst = 0 ;* add at the head of the list */ idLstAddCur = 1 ;* add at the current position in the list */ AddLstElem PROTO KERNENTRY , :PTR LST, :PTR NOD, :DWORD PnodGetLstElem PROTO KERNENTRY , :PTR LST, :DWORD PnodRemoveLstElem PROTO KERNENTRY , :PTR LST FIsLstEmpty PROTO KERNENTRY, :PTR LST ;** Macro to get current TDBX pointer GetCurrentTDBX MACRO reg ifdef WOW assume fs:nothing ifb mov eax, fs:[TIBSTRUCT.tib_pTDB] mov eax, [eax].TDB.ptdbx else mov reg, fs:[TIBSTRUCT.tib_pTDB] mov reg, [reg].TDB.ptdbx endif else ; WOW ifb mov eax, [ppTDBXCur] mov eax, [eax] else mov reg, [ppTDBXCur] mov reg, [reg] endif endif ; else WOW ENDM ;** Macros to get current TDB pointer and current PDB pointer GetCurrentTDB MACRO reg ifdef WOW assume fs:nothing ifb mov eax, fs:[TIBSTRUCT.tib_pTDB] else mov reg, fs:[TIBSTRUCT.tib_pTDB] endif else ; WOW ifb mov eax, [pptdbCur] mov eax, [eax] else mov reg, [pptdbCur] mov reg, [reg] endif endif ; else WOW ENDM GetCurrentPDB MACRO reg ifdef WOW assume fs:nothing ifb mov eax, fs:[TIBSTRUCT.tib_pTDB] mov eax, [eax].TDB.ptib mov eax, [eax].TIBSTRUCT.tib_ppdbProc else mov reg, fs:[TIBSTRUCT.tib_pTDB] mov reg, [reg].TDB.ptib mov reg, [reg].TIBSTRUCT.tib_ppdbProc endif else ; WOW ifb mov eax, [pppdbCur] mov eax, [eax] else mov reg, [pppdbCur] mov reg, [reg] endif endif ; else WOW ENDM ;===================================================================== ; Synchronization routines (SYNC.C) IFNDEF typObjAny INCLUDE OBJECT.INC ENDIF ; BOOL bDeliverPendingAPCs PROTO KERNENTRY ;:VOID ; DWORD BlockThreadEx PROTO KERNENTRY :DWORD, :BOOL ; DWORD dwWaitMultipleObjects PROTO KERNENTRY :DWORD, :LPOBJ, :DWORD, :DWORD, :BOOL ; DWORD dwWaitSingleObject PROTO KERNENTRY :LPOBJ, :DWORD, :BOOL ; VOID DisposeSyncObj PROTO KERNENTRY :LPSYNCO ; LPSEM NewPsem PROTO KERNENTRY :DWORD, :DWORD ; BOOL bReleasePsem PROTO KERNENTRY :LPSEM, :DWORD, :LPLONG ; LPEVT NewPevt PROTO KERNENTRY :DWORD, :DWORD ; BOOL bSetPevt PROTO KERNENTRY :LPEVT ; BOOL bPulsePevt PROTO KERNENTRY :LPEVT ; BOOL bResetPevt PROTO KERNENTRY :LPEVT ; LPMUTX NewPmutx PROTO KERNENTRY :DWORD ; BOOL bReleasePmutx PROTO KERNENTRY :LPMUTX ; VOID InitCrst PROTO KERNENTRY :LPCRST ; VOID DestroyCrst PROTO KERNENTRY :LPCRST ; LPNSOBJ NewNsObject PROTO KERNENTRY :DWORD, :BYTE ; VOID DisposeNsObject PROTO KERNENTRY :LPNSOBJ ; BOOL LockMustComplete PROTO KERNENTRY :LPTDB ; VOID UnlockMustComplete PROTO KERNENTRY :LPTDB ;===================================================================== ; Exception management (EXCEPTC.C, EXCEPTA.ASM) ExceptStruct struct 4 SegGs dd ? SegFs dd ? SegEs dd ? SegDs dd ? rgEdi dd ? rgEsi dd ? rgEbp dd ? rgEspTmp dd ? rgEbx dd ? rgEdx dd ? rgEcx dd ? rgEax dd ? dwExceptNum dd ? rgRetEip dd ? SegRetCs dd ? dwErrorCode dd ? rgEip dd ? SegCs dd ? rgEflags dd ? rgEsp dd ? SegSs dd ? ExceptStruct ends IEE struct 4 dwExceptionNum dd ? rgRegisters ExceptStruct <> IEE ends PIEE typedef PTR IEE PIeeNew PROTO C ExceptDispatch PROTO C NtRaiseException PROTO C, ExceptionRecord:LPEXCEPTION_RECORD, ContextRecord:LPCONTEXT, FirstChance:BOOL NtContinue PROTO C, ContextRecord:LPCONTEXT, TestAlert:BOOL ZwContinue PROTO C, ContextRecord:LPCONTEXT, TestAlert:BOOL ZwRaiseException PROTO C, ExceptionRecord:LPEXCEPTION_RECORD, ContextRecord:LPCONTEXT, FirstChance:BOOL FreePiee PROTO C, piee:DWORD ;===================================================================== ; Device object management (DEVICE.C) ; FDB * PfdbNew PROTO KERNENTRY ; PIPDB * PpipedbNew PROTO KERNENTRY, pipszbyts:DWORD, IsNmPipe:BOOL ; MSDB * PmsdbNew PROTO KERNENTRY ; SDB * PsdbNew PROTO KERNENTRY ; TLHPDB* PtlhpdbNew PROTO KERNENTRY ; VOID DisposePtlhpdb PROTO KERNENTRY, :PTR TLHPDB ; VOID DisposePfdb PROTO KERNENTRY, :PTR FDB ; VOID DisposePmsdb PROTO KERNENTRY, :PTR MSDB ; VOID DisposePsdb PROTO KERNENTRY, :PTR SDB ; VOID DisposePpipedb PROTO KERNENTRY, :PTR PIPDB ; HANDLE hSerialNew PROTO KERNENTRY, ppdb:PTR SDB, handle:DWORD, DevNode:DWORD ;; OFSTRUCTEX has a word cBytes instead of a BYTE in OFSTRUCT ;; OpenFileEx16And32 uses this structure for support of OpenFile with ;; LFN support. The Win32 OpenFile calls this and has a wrapper to ;; ensure that we still have a Win32 API that has OFS_MAXPATHNAME of 128. OFSTRUCTEX struct 1 cBytes dw ? fFixedDisk db ? nErrCode dw ? Reserved1 dw ? Reserved2 dw ? szPathName db MAX_PATH DUP (?) OFSTRUCTEX ends ENDIF ; _KERNEL32_