// KERNEL32.H // // (C) Copyright Microsoft Corp., 1988-1994 // // Main Kernel32 include file // // Origin: Dos Extender // // Change history: // // Date Who Description // --------- --------- ------------------------------------------------- // Jan-91 - Mar-92 GeneA Original Languages Dos Extender work // 15-Feb-94 JonT Code cleanup and precompiled headers #ifndef __KERNEL32_H #define __KERNEL32_H // So that RTL functions don't have declspec import #ifdef _KERNEL32_ #define _NTSYSTEM_ #endif // If NT.H was included, we have to undefine some stuff to prevent // refinitions #undef MAJOR_VERSION #undef MINOR_VERSION #undef FILE_ATTRIBUTE_VALID_FLAGS #ifndef WOW32_EXTENSIONS // Include the Win32 windows.h to get all standard definitions #include #undef RtlMoveMemory #undef RtlCopyMemory // Following is defined in winnt.h only if nt.h is not included. #ifndef MAXDWORD #define MAXDWORD MAXULONG #endif // These APIs are doc'd to be exported from user32, but we implement them // in kernel32. Rename them so we don't get a prototype declaration type // conflict, due to the non-definition of _USER32_ making them be of type // import. #define wsprintfA k32wsprintfA int WINAPIV wsprintfA( LPSTR lpOut, LPCSTR lpFmt, ...); #define wvsprintfA k32wvsprintfA int WINAPI wvsprintfA( LPSTR, LPCSTR, va_list arglist); #define LoadStringA k32LoadStringA int WINAPI LoadStringA( HINSTANCE hInstance, UINT uID, LPSTR lpBuffer, int nBufferMax); #endif // ndef WOW32_EXTENSIONS //==================================================================== // General definitions #define LOCAL #define GLOBAL #ifndef KERNENTRY #define KERNENTRY __stdcall #endif #define cbPage 4096 #define fTrue 1L #define fFalse 0L typedef WORD SEL; #define IMTE short // Wait constants #define dwWaitForever 0xffffffff #define dwWaitNone 0 #define dwAbort 0xffffffff #define dwInvalid 0xffffffff #include #ifndef WOW32_EXTENSIONS /*XLATOFF*/ #ifdef WOW #include #endif // def WOW /*XLATON*/ typedef DEBUG_EVENT* PDE; #ifdef MEOW_LOGGING VOID WDEBLogDebugString(char *, ...); #endif // def MEOW_LOGGING //==================================================================== // Debug macros #define WOWDEBUG #ifdef WOWDEBUG VOID ApiEnterTrace(DWORD ApiNumber); #define api_entry(ApiNumber) ApiEnterTrace(ApiNumber); #else #define api_entry(ApiNumber) #endif #define api_exit(ApiNumber) #ifdef WOWDEBUG int __cdecl dprintf(const char *, ...); #define dprintf(s) dprintf##s #else #define dprintf(s) #endif GLOBAL VOID KERNENTRY PrintFailedAssertion(int, char *); GLOBAL VOID KERNENTRY vDebugOut(int level, const char *pfmt, ...); #ifdef WOWDEBUG #define Break() { _asm _emit 0xcc } #ifndef IS_VXD #define Trap() { _asm { _emit 0xcc } } #define TrapC(c) { if (c) { Trap() } } #endif #ifdef IS_VXD #define SetFile() \ static char __szSrcFile[] = __FILE__; \ static char __szAssert[] = "Assertion failed: Line %d File %s"; #define Assert(cond) \ if (!(cond)) {\ Debug_Printf(__szAssert,__LINE__,__szSrcFile);\ Trap(); \ } #else #define SetFile() \ static char __szSrcFile[] = __FILE__; #define Assert(cond) \ if (!(cond)) {\ PrintFailedAssertion(__LINE__,__szSrcFile);\ } #endif // Used to assert the return code of a function #define AssertReturn Assert #define DebugMsg(sz) dputs(sz) #define DebugOut(args) vDebugOut args #define LogMsg(sz) dprintf(((sz "\n"))) #define LogMsgI(sz,I) dprintf(((sz "%d\n",I))) #define LogMsgX(sz,i) dprintf(((sz "0x%lX\n",i))) #define LogMsgSz(sz,szData) dprintf(((sz "%s\n",szData))) #define LogMsgP(args) dprintf((args)) #define LogFailure() LogMsgI("On " __FILE__ " Failure Path line ", __LINE__) #define HeapCheck() if (!hpWalk(hheapKernel)) _asm int 3 #else #define Break() #ifndef IS_VXD #define Trap() #define TrapC(c) #endif #define Assert(cond) #define AssertReturn #define DebugMsg(sz) #define DebugOut(args) #define LogMsg(sz) #define LogMsgI(sz,i) #define LogMsgX(sz,i) #define LogMsgSz(sz,szData) #define LogMsgP(args) #define LogFailure() #define HeapCheck() #endif enum { DEB_FATAL, DEB_ERR, DEB_WARN, DEB_TRACE }; #endif // ndef WOW32_EXTENSIONS //==================================================================== // File and path definitions #define chExtSep '.' #define szExtSep "." #define chNetIni '\\' #define chDirSep '\\' #define szDirSep "\\" #define chDirSep2 '/' #define chDrvSep ':' #define chRelDir '.' #define chEnvSep ';' #define chWldChr '?' #define chWldSeq '*' #define chMinDrv 'A' #define chMaxDrv 'Z' #define chMinDrvLow 'a' #define chMaxDrvLow 'z' #define fbUpper 0xdf // Mask converts to uppercase #define cbNull 1 #define cbDirMax 260 /* \dir\subdir\..\file.ext */ #define cbDrvMax 3 /* c:\ */ #define cbNetMax 36 /* \\machine\share */ #define cbCompMax 255 /* should be same as namemax? */ #define cbPathMax 260 #define cbCmdMax (0x100 - 0x80) /* All the room in PSP for command line */ // 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. // #define MAGICWIN32NETINT21SIG 0x41524A44 // 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. typedef struct tagOFSTRUCTEX { WORD cBytes; BYTE fFixedDisk; WORD nErrCode; WORD Reserved1; WORD Reserved2; BYTE szPathName[cbPathMax]; } OFSTRUCTEX; typedef OFSTRUCTEX *LPOFSTRUCTEX; #define FA_VALID_FLAGS 0x67 //==================================================================== // Linked lists typedef struct _nod { struct _nod * pnodNext; /* pointer to the next node in the list */ struct _nod * pnodPrev; /* pointer to the previous node in the list */ DWORD dwData; /* data element associated with this node */ } NOD; typedef struct _lst { NOD * pnodHead; /* pointer to first node in list */ NOD * pnodEnd; /* pointer to last node in list */ NOD * pnodCur; /* pointer to current node in list */ } LST; // These are values that are passed to PnodGetLstElem to tell it // which element to return from the list. #define idLstGetFirst 0 /* get first element of list */ #define idLstGetNext 1 /* get next element of the list */ #define idLstGetPrev 2 /* get the previous element of the list */ #define idLstGetLast 4 /* get the last element of the list */ #define idLstGetCur 5 /* return the current 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. #define idLstAddFirst 0 /* add at the head of the list */ #define idLstAddCur 1 /* add at the current position in the list */ #define idLstAddLast 2 /* add at the end of the list */ // These are the values that are passed to PnodFindLstElem to tell it // how to search for the requested list element. #define idLstFindFirst 0 #define idLstFindNext 1 #define idLstFindPrev 2 #define idLstFindLast 3 #ifndef WOW32_EXTENSIONS LST* KERNENTRY PlstNew(LST *); VOID KERNENTRY FreePlst(LST *); VOID KERNENTRY DestroyPlst(LST *); NOD* KERNENTRY PnodNew(VOID); VOID KERNENTRY FreePnod(NOD *); BOOL KERNENTRY FIsLstEmpty(LST *); NOD* KERNENTRY PnodGetLstElem(LST *, int); VOID KERNENTRY SetLstCurElem (LST *, NOD *); NOD* KERNENTRY PnodFindLstElem(LST *, DWORD, int); NOD* KERNENTRY PnodCreateLstElem(LST *, DWORD, int); VOID KERNENTRY AddLstElem(LST *, NOD *, int); NOD* KERNENTRY PnodRemoveLstElem(LST *); VOID KERNENTRY RemoveLstPnod(LST *, NOD *); VOID KERNENTRY DestroyAllLstElem(LST *); VOID KERNENTRY DestroyLstElem(LST *); VOID KERNENTRY AddLst (LST *, LST *, DWORD); BOOL KERNENTRY FCopyLst (LST *, LST *); #endif // ndef WOW32_EXTENSIONS //==================================================================== // Object definitions // // We are out of tls with Picture Publisher which need 66. // This is a quick fix to bump up to 80. If more conditions // call for more tls slots, should cosider dynamic expansion . // #undef TLS_MINIMUM_AVAILABLE #define TLS_MINIMUM_AVAILABLE 80 #include #ifndef WOW32_EXTENSIONS // Ansi/Oem parameter defines for SetFileApisToOem #define AO_IN 0 #define AO_OUT 1 #define AO_INOUT 2 // the below flags passed to MarkOemToAnsiDone specify if // teh caller can handle ANSI only or ANSI/OEM #define AO_CONV_ANSI 0 #define AO_NO_CONV 1 // fOKToSetThreadOem is set by true OEM support APIs // the vwin32 int21 dispatcher sets the TCB_OEM bit if this is set #define IamOEM() ((GetCurrentTdb())->flFlags & fOKToSetThreadOem) // Macro version of UnMarkOemToAnsi for C code #define UnMarkOToA() \ { GetCurrentTdb()->flFlags &= ~(fWasOemNowAnsi | fOKToSetThreadOem); } // File handle cache strucs/definitions #include "fhcache.h" //==================================================================== // Kernel file handle cache routines (FHCACHE.C) WORD KERNENTRY GetCachedFileHandle(CFH_ID *,USHORT dfh, BOOL fRing0); USHORT KERNENTRY GetDosFileHandle(CFH_ID *,USHORT * pcfh); void KERNENTRY UnlockCachedFileHandle(CFH_ID *,USHORT cfh); LONG KERNENTRY CloseCachedFileHandle(CFH_ID *,USHORT cfh); void KERNENTRY RemoveFromFileHandleCache(CFH_ID *,USHORT cfh); //==================================================================== // Kernel initialization and heap wrappers (DXKRNL.C) VOID* KERNENTRY PvKernelAlloc(DWORD); VOID* KERNENTRY PvKernelAlloc0(DWORD); VOID* KERNENTRY PvKernelRealloc(VOID*, DWORD); BOOL KERNENTRY FKernelFree(VOID*); #define malloc(cb) PvKernelAlloc(cb) #define malloc0(cb) PvKernelAlloc0(cb) #define free(p) FKernelFree(p) typedef BOOL (KERNENTRY * PFNDEBCB)(PDE, PDB*); #define cmdIdle 0L #define cmdExec 1L #define cmdQuit 2L #define cmdTermPpdb 3L #define cmdTermPtdb 4L #define cmdExecApp 5L #define cmdCloseHandle 6L #define cmdInitComplete 7L #define cmdLoaderError 8L VOID KERNENTRY SetKrnlCmd(DWORD, PDB *, TDB *, DWORD); //==================================================================== // Kernel entrypoint and .ASM helper routines (KRNINIT.ASM) VOID KERNENTRY K16WaitEvent(WORD); VOID KERNENTRY K16PostEvent(WORD); VOID KERNENTRY K16Yield(VOID); WORD KERNENTRY K16CreateTask(struct _tdb* ptdb); WORD KERNENTRY K16FixTask(WORD ptdb, WORD hModule); WORD KERNENTRY K16DeleteTask(DWORD hTask); WORD KERNENTRY K16CreateMod(char* pModName, WORD wExpWinVer); VOID KERNENTRY K16DeleteMod(WORD hModule); //==================================================================== // Misc .ASM support routines (KRNLUTIL.ASM) VOID KERNENTRY FillBytes (VOID *, DWORD, BYTE); DWORD KERNENTRY CbSizeSz (const char *); char* KERNENTRY CopySz (char *, const char *); char* KERNENTRY AppendSz (char *, const char *); BOOL KERNENTRY BFileNameTooLong(const char *); LONG KERNENTRY LCompareSz (const char *, const char *); LONG KERNENTRY LCompareNSz(const char *, const char *, DWORD); LONG KERNENTRY LStrCmpI( LPCSTR lpsz1, LPCSTR lpsz2); VOID KERNENTRY RtlCopyMemory( PVOID Destination, CONST VOID *Source, DWORD Length); #undef CopyMemory #define CopyMemory( a, b, c) RtlCopyMemory( a, b, c) // BUGBUG // We used to have memcpy accidentally mapped to RtlMoveMemory, // which is wrong. However, memcpy is used in many places and it is // not obvious that all occurrences have non-overlapping // arguments. Therefore, we make explicit the old map. // On a case-by-case basis, we should replace occurrences of // memcpy by RtlCopyMemory where we are certain the arguments // do not overlap. In the other cases, we should explicitly use // RtlMoveMemory. #define memcpy(dest, src, len) RtlMoveMemory(dest, src, len) // BUGBUG #undef MoveMemory #define MoveMemory( a, b, c) RtlMoveMemory( a, b, c) #define memmov(dest, src, len) RtlMoveMemory(dest, src, len) #define strlen(s) CbSizeSz(s) #define strcpy(dest, src) CopySz(dest, src) #define strcat(dest, src) AppendSz(dest, src) #define strcmp(s1, s2) LCompareSz(s1, s2) // #define memset(dest, val, len) FillBytes(dest, len, val) // note different parameter order - also, compiler would inline memset() VOID KERNENTRY dputs (const char *); SEL KERNENTRY SelGetEnviron (SEL); VOID KERNENTRY SetPspEnviron (SEL, SEL); int KERNENTRY CbOfDosFileTable(WORD); VOID KERNENTRY GetDosFileTable(WORD, DWORD, BYTE *); void KERNENTRY KInt21(void); // Intel descriptor structure. typedef struct _dscr { USHORT dbLimLow; USHORT lmaBaseLow; BYTE lmaBaseMid; BYTE arbAccess; BYTE mbLimHi; BYTE lmaBaseHi; } DSCR; VOID KERNENTRY InitDscr (DSCR* pdscr, ULONG lmaBase, ULONG dwLimit, ULONG arbAccess, ULONG arbExtra); BOOL KERNENTRY FAllocDscr (ULONG cselAlloc, SEL* pselBase); BOOL KERNENTRY FFreeDscr (SEL selFree); BOOL KERNENTRY FSetDscr (SEL selSet, DSCR* pdscrSet); BOOL KERNENTRY FGetDscr (SEL selGet, DSCR* pdscrGet); //==================================================================== // Virtual memory management (MMAPI.C) // Undocumented flags for the flAllocationType field in VirtualAlloc #define MEM_SHARED 0x08000000 // make memory globally visible //==================================================================== // Heap management (HEAP.C) // Undocumented flags to HeapCreate #define HEAP_SHARED 0x04000000 // put heap in shared memory #define HEAP_LOCKED 0x00000080 // put heap in locked memory //==================================================================== // File I/O primitives (IOUTIL.ASM) #endif // ndef WOW32_EXTENSIONS typedef DWORD DFH; // Dos File Handle #define DFH_FILE_CREATE 0x0010 #define DFH_FILE_OPEN 0x0001 #define DFH_FILE_TRUNCATE 0x0002 #define DFH_ACTION_OPENED 0x0001 #define DFH_ACTION_CREATED_OPENED 0x0002 #define DFH_ACTION_REPLACED_OPENED 0x0003 #define DFH_MODE_READONLY 0x0000 #define DFH_MODE_WRITEONLY 0x0001 #define DFH_MODE_READWRITE 0x0002 #define DFH_MODE_SHARE_COMPATIBILITY 0x0000 #define DFH_MODE_SHARE_EXCLUSIVE 0x0010 #define DFH_MODE_SHARE_DENYWRITE 0x0020 #define DFH_MODE_SHARE_DENYREAD 0x0030 #define DFH_MODE_SHARE_DENYNONE 0x0040 #define DFH_MODE_NO_INHERIT 0x0080 #define DFH_MODE_EXTENDED_SIZE 0x1000 #define DFH_MODE_RAND_ACCESS_HINT 0x0008 #define DFH_MODE_SEQ_ACCESS_HINT 0x8000 #ifndef WOW32_EXTENSIONS DFH KERNENTRY DfhOpenFile (char *, DWORD); DFH KERNENTRY DfhCreateFile (char *, DWORD, DWORD, DWORD, LPDWORD); BOOL KERNENTRY FCloseFile (DFH); DWORD KERNENTRY CbReadFile (DFH, DWORD, VOID *); DWORD KERNENTRY CbWriteFile (DFH, DWORD, VOID *); DWORD KERNENTRY CbWriteOutFile (DFH, DWORD, VOID *); DWORD KERNENTRY LfoSetFilePos (DFH, DWORD, DWORD, DWORD *); DFH KERNENTRY DfhDupDfh (DFH); BOOL KERNENTRY FGetDevInfo(DFH, DWORD *); BOOL KERNENTRY FForceDupDfh (DFH, DFH); DWORD KERNENTRY GetDOSDateTime (DWORD); BOOL KERNENTRY FileTimeToDosDateTimeEx (CONST FILETIME *, LPWORD, LPWORD, LPWORD); BOOL KERNENTRY DosDateTimeToFileTimeEx (WORD, WORD, WORD, LPFILETIME); DWORD KERNENTRY SetPSP (DWORD); DWORD KERNENTRY GetPSP (VOID); VOID KERNENTRY GlobalHandleSwitchToK32PSP ( HANDLE, LPDWORD ); VOID KERNENTRY GlobalHandleRestorePSP ( DWORD ); //==================================================================== // Process creation/deletion (PROCESS.C) #define cbStartupInfo31 offsetof(STARTUPINFO, dwHotKey) #endif // ndef WOW32_EXTENSIONS // 16-bit CreateThread 32->16 thunk data typedef struct _thread_startup_thunk_data { DWORD Param16; DWORD StartAddress16; } THREAD_STARTUP_THUNK_DATA; #ifndef WOW32_EXTENSIONS BOOL KERNENTRY CreateProcessKernel(char *, char *, char *, WORD, WORD *, PVOID); VOID KERNENTRY TerminateProcessKernel(VOID); VOID KERNENTRY ExitCurrentProcess(DWORD); VOID KERNENTRY TerminateProcessOutOfContext(PDB*, DWORD); VOID KERNENTRY TerminateProcessFinal(PDB* ppdb); PDB* KERNENTRY NewPDB(PDB* ppdbParent); VOID KERNENTRY DisposePDB(PDB* ppdb); DWORD KERNENTRY CbSizeEnv(LPCSTR, DWORD); BOOL KERNENTRY FFindEnvVar(char **, char **, char *); void* KERNENTRY MemToHeap(HANDLE hheap, const void *buf, int len); char* KERNENTRY StrToHeap(HANDLE hheap, const char *str); //==================================================================== // Thread creation/deletion (THREAD.C) // PtdbNew flags values #define TDBN_NOEXCEPTIONHANDLER 0x00000001 #define TDBN_NPX_WIN32_EXPT 0x00000002 #define TDBN_NPX_EMULATE 0x00000004 #define TDBN_WIN32 0x00000008 #define TDBN_INITIAL_WIN32_THREAD 0x00000010 #define TDBN_KERNEL_THREAD 0x00000020 #define TDBN_SUSPENDED 0x00000040 #define TDBN_FIBER 0x00000080 HANDLE KERNENTRY ICreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId, DWORD flFlags); TDB * KERNENTRY PtdbCreate (PPDB ppdb, int cbStack, DWORD pfnEntry, DWORD dwParam, DWORD flFlags); TDB * KERNENTRY PtdbNew (PDB *, int, DWORD, DWORD, DWORD); VOID KERNENTRY ExitCurrentThread(DWORD); VOID KERNENTRY TerminateCurrentThread(DWORD); VOID KERNENTRY TerminatePtdb(TDB *, DWORD, BOOL); DWORD KERNENTRY IdWaitOnPtdb (TDB *, DWORD); BOOL KERNENTRY FSuspendPtdb (TDB *); BOOL KERNENTRY FResumePtdb (TDB *); VOID KERNENTRY DisposePtdb (TDB *); VOID KERNENTRY BlockAllThreads (VOID); BOOL KERNENTRY SuspendProcessThreads (PDB * ppdb); BOOL KERNENTRY ResumeProcessThreads (PDB * ppdb); PVOID KERNENTRY AllocateStack(PVOID *, PVOID *, DWORD, DWORD, DWORD); VOID KERNENTRY FreeStack(PVOID); VOID KERNENTRY SetError(DWORD); DWORD KERNENTRY SuspendPtdb(TDB *); DWORD KERNENTRY ResumePtdb(TDB *); DWORD KERNENTRY ErcGetError(VOID); #endif // ndef WOW32_EXTENSIONS // AllocateStack flags #define AS_NORMAL 0x0000 #define AS_TEMPORARY 0x0001 typedef VOID (KERNENTRY *PFN_THREADSTARTUP)( PTHREAD_START_ROUTINE pfnEntryPoint, LPVOID dwParam, DWORD flFlags ); #ifndef WOW32_EXTENSIONS #ifdef WOW PTDB KERNENTRY IGetCurrentTdb(VOID); #define GetCurrentTdb() IGetCurrentTdb() #define GetCurrentTdbx() (GetCurrentTdb()->ptdbx) #define GetCurrentPdb() (GetCurrentTdb()->ptib->ppdbProc) #else // WOW #define GetCurrentPdb() (*pppdbCur) #define GetCurrentTdb() (*pptdbCur) #define GetCurrentTdbx() (*ppTDBXCur) #endif // else WOW //==================================================================== // Control handlers (BREAK.C) // Control constants for CONTROL+C and CONTROL+BREAK #define ctrlC 0 #define ctrlBreak 1 #define ctrlNone 10 #define ctrlInactive 20 #define ctrlTerminate 30 #define cbCtrlInc 8 // Number of control handlers initially and for each new allocation VOID KERNENTRY ControlHandlerThread(VOID); BOOL KERNENTRY FInitControlHandlers(PDB *); VOID KERNENTRY DestroyControlHandlers(PDB *); BOOL KERNENTRY FUpdateControlList(PDB *, PFN_CONTROL, BOOL); BOOL KERNENTRY DoControlHandlers(DWORD); VOID KERNENTRY SwitchToControlThread(PDB *, WORD); VOID KERNENTRY FieldConsoleCtrlEvent(DWORD, PVOID); //==================================================================== // Exception management (EXCEPTI.ASM, EXCEPTC.C, EXCEPTA.ASM) #define LO16_TRAP_INTERCEPT #define HI16_TRAP_INTERCEPT #define TRAP_DIVIDE_BY_ZERO 0 #define TRAP_NONMASKABLE_INT 2 #define TRAP_OVERFLOW 4 #define TRAP_INVALID_OPCODE 6 #define TRAP_DEVICE_NOT_AVAILABLE 7 #define TRAP_3E 0x3e #define TRAP_75 0x75 #define EXC_STACK_OVERFLOW 0x10E // Definition for Npx status word error mask #define FSW_INVALID_OPERATION 1 #define FSW_DENORMAL 2 #define FSW_ZERO_DIVIDE 4 #define FSW_OVERFLOW 8 #define FSW_UNDERFLOW 16 #define FSW_PRECISION 32 #define FSW_STACK_FAULT 64 #define FSW_CONDITION_CODE_0 0x100 #define FSW_CONDITION_CODE_1 0x200 #define FSW_CONDITION_CODE_2 0x400 #define FSW_CONDITION_CODE_3 0x4000 #define FSW_EXCEPTION_MASK (FSW_INVALID_OPERATION + \ FSW_DENORMAL + \ FSW_ZERO_DIVIDE + \ FSW_OVERFLOW + \ FSW_UNDERFLOW + \ FSW_PRECISION) typedef struct ExceptStruct { DWORD SegGs; DWORD SegFs; DWORD SegEs; DWORD SegDs; DWORD rgEdi; DWORD rgEsi; DWORD rgEbp; DWORD rgEspTmp; DWORD rgEbx; DWORD rgEdx; DWORD rgEcx; DWORD rgEax; DWORD dwExceptNum; DWORD rgRetEip; DWORD SegRetCs; DWORD dwErrorCode; DWORD rgEip; DWORD SegCs; DWORD rgEflags; DWORD rgEsp; DWORD SegSs; } ExceptStruct; typedef struct _IEE { DWORD dwExceptNum; ExceptStruct esExcept; } IEE; typedef IEE * PIEE; typedef struct _regs { DWORD regSS; DWORD regGS; DWORD regFS; DWORD regES; DWORD regDS; DWORD regEDI; DWORD regESI; DWORD regEBP; DWORD regESP; DWORD regEBX; DWORD regEDX; DWORD regECX; DWORD regEAX; DWORD regEIP; DWORD regCS; DWORD regEFL; } REGS; typedef REGS * PREGS; BOOL KERNENTRY Except7(void); BOOL KERNENTRY Load80x87Trap1(void); BOOL KERNENTRY Load80x87Trap2(void); VOID KERNENTRY PageFaultHandler(void); VOID KERNENTRY StackFaultHandler(void); VOID KERNENTRY RtlRaiseException(PEXCEPTION_RECORD ExceptionRecord); BOOL KERNENTRY FInitExceptions(void); void KERNENTRY TerminateExceptions(void); BOOL _cdecl RetInstruction(VOID); //==================================================================== // Floating point support (FLOAT.ASM) BOOL KERNENTRY FVmcpdInit(long * pl, short * pver); BOOL KERNENTRY FCoprocRestore(VOID); BOOL KERNENTRY FInstallInt7Handler(VOID); BOOL KERNENTRY FUninstallInt7Handler(VOID); PVOID KERNENTRY GetEmulatorDataOffset(VOID); //==================================================================== // PE Loader (PELDR.C) BOOL KERNENTRY FLoadKernelModule (PDB *, char *); BOOL KERNENTRY FLoadProgram (PDB *, char *); char* KERNENTRY SzNameFromMR(MODREF *pRef); MODREF* KERNENTRY MRFromHLib(HANDLE hLib); //==================================================================== // Misc. process and kernel utilities (PROCUTIL.ASM) // 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. #define STACK_BARRIER_SIZE (64*1024) #define WIN16_TERMINATION_STACK_SIZE 0x2000 VOID KERNENTRY ThreadTerminationHandler(VOID); BOOL KERNENTRY FBuildEnvArgs (SEL, char **, char **, void **); DWORD KERNENTRY CbSearchPath(char *, char *, char *, DWORD, char *, char **); DWORD KERNENTRY CbGetCurDir(DWORD, char *); DWORD KERNENTRY CbGetDosCurDir(DWORD, char *); BOOL KERNENTRY FIsDir(LPCSTR); LONG KERNENTRY LStrCmpI(LPCSTR, LPCSTR); char* KERNENTRY SzGetNamePos(char *); DWORD KERNENTRY FGetFileInfo(char *, DWORD, LPWIN32_FIND_DATA); DWORD KERNENTRY CbStrUpr(char *); char* KERNENTRY PchGetNetDir(char *); BOOL KERNENTRY ValidateDrive(DWORD); BOOL KERNENTRY IsDriveFixed(DWORD); PPDB KERNENTRY PidToPDB(DWORD pid); DWORD KERNENTRY PDBToPid(PPDB ppdb); PTDB KERNENTRY TidToTDB(DWORD tid); DWORD KERNENTRY TDBToTid(PTDB ptdb); PPDB KERNENTRY ValidateProcessID(DWORD); ULONG KERNENTRY GetLongName(LPCSTR, LPSTR, ULONG); ULONG KERNENTRY GetShortName(LPCSTR, LPSTR, ULONG); //==================================================================== // Find Change utilities (FCNAPI.C) GLOBAL VOID KERNENTRY DisposePfcndb(FCNDB *pfcndb); //==================================================================== // Directory utilites (DIRUTIL.C) DWORD KERNENTRY CbGetCurDir(DWORD, char *); BOOL KERNENTRY FSetCurDir(char *); DWORD KERNENTRY FMakeFullName(char *, char *, char *); DWORD KERNENTRY DwMakeFullPath(char *, char *, DWORD *, char **); DWORD KERNENTRY FNextFromDirList(char **, char *, char *, char *); DWORD KERNENTRY CbAppendExt (char *, char *, DWORD); BOOL KERNENTRY FFixPathChars (char * szPath); VOID KERNENTRY BeepOff(BYTE bControl); DWORD KERNENTRY GetPathType(LPSTR szPath); // helpers for zombie psp management [ SBS inter-psp dup related] // mmfile.c VOID KERNENTRY IncRefZombiePSP(WORD psp); VOID KERNENTRY UnuseZombiePSP(WORD psp); // Ansi/Oem helper routines for conversion if reqd from Oem-Ansi for // implemeneting SetFileApisToOem LPSTR KERNENTRY EnterResolveOemToAnsi(LPSTR szName, int fInOut); VOID KERNENTRY LeaveResolveOemToAnsi(LPSTR szSrcDest, int fInOut); BOOL KERNENTRY MarkOemToAnsiDone(BOOL fNoConversion); VOID KERNENTRY UnMarkOemToAnsiDone(); //==================================================================== // USER Signal routines (SIGNAL.C) BOOL KERNENTRY SignalBroadcast(DWORD dwSignalID, DWORD dwID, WORD hTaskMod16); //==================================================================== // Sync APIs (SYNC.C) // delivery of APCs BOOL KERNENTRY bDeliverPendingAPCs( VOID ); DWORD KERNENTRY BlockThreadEx( DWORD Timeout, BOOL Alertable ); // thread block/unblock primitives VOID KERNENTRY Wait(void); // wait for/enter a critical section VOID KERNENTRY Signal(void); // leave a critical section DWORD KERNENTRY BlockThread(DWORD); VOID KERNENTRY WakeThread(TDB *, DWORD); // general wait multiple and wait single DWORD KERNENTRY dwWaitMultipleObjects(DWORD, OBJ *[], DWORD, DWORD,BOOL); DWORD KERNENTRY dwWaitSingleObject(OBJ *, DWORD, BOOL); // used for all synchronization objects VOID KERNENTRY DisposeSyncObj(SYNCO *); // semaphore specific functions SEM * KERNENTRY NewPsem (LONG, LONG); BOOL KERNENTRY bReleasePsem(SEM *, LONG, LPLONG); // event specific functions EVT * KERNENTRY NewPevt(BOOL, BOOL); BOOL KERNENTRY bSetPevt(EVT *); BOOL KERNENTRY bPulsePevt(EVT *); BOOL KERNENTRY bResetPevt(EVT *); // mutex specific functions MUTX * KERNENTRY NewPmutx(BOOL); BOOL KERNENTRY bReleasePmutx(MUTX *); VOID KERNENTRY CheckOwnedMutexes( TDB *ptdb ); // critical section specific functions VOID KERNENTRY InitCrst(CRST *); VOID KERNENTRY DestroyCrst(CRST *); CRST * KERNENTRY NewCrst(); VOID KERNENTRY DisposeCrst(CRST *); VOID KERNENTRY EnterCrst(CRST *); VOID KERNENTRY LeaveCrst(CRST *); VOID KERNENTRY CheckOwnedCrsts( TDB *ptdb ); VOID KERNENTRY DeallocOrphanedCrsts( PDB *ppdb ); // creation and deletion of non-synchronization, waitable objects NSOBJ * KERNENTRY NewNsObject( DWORD dwSize, BYTE typObj); VOID KERNENTRY DisposeNsObject( NSOBJ *pnsobj ); // must complete sections for threads BOOL KERNENTRY LockMustComplete( TDB * ); VOID KERNENTRY UnlockMustComplete( TDB * ); //==================================================================== // Named object primitives (NAMEDOBJ.C) OBJNAME* KERNENTRY NameObject(OBJ * pobj, LPCSTR ObjName); OBJ* KERNENTRY FindObjectName( LPCSTR Name ); BOOL KERNENTRY FreeObjHashName(OBJNAME *ObjName); HANDLE KERNENTRY NewHandleForName( LPCSTR lpName, DWORD typOfObj, DWORD fFlags ); //==================================================================== // System error box defines int WINAPI SysErrorBox(LPSTR, LPSTR, DWORD, DWORD, DWORD); #define SEB_OK 1 // Button with "OK". #define SEB_CANCEL 2 // Button with "Cancel" #define SEB_YES 3 // Button with "&Yes" #define SEB_NO 4 // Button with "&No" #define SEB_RETRY 5 // Button with "&Retry" #define SEB_ABORT 6 // Button with "&Abort" #define SEB_IGNORE 7 // Button with "&Ignore" #define SEB_CLOSE 8 // Button with "Close" #define SEB_DEFBUTTON 0x8000 // Mask to make this button default #define SEB_BTN1 1 // Button 1 was selected #define SEB_BTN2 2 // Button 1 was selected #define SEB_BTN3 3 // Button 1 was selected //==================================================================== // Low-level device objects (DEVICE.C) FDB* KERNENTRY PfdbNew (VOID); PIPDB* KERNENTRY PpipedbNew (DWORD pipszbyts, BOOL IsNmPipe); SDB* KERNENTRY PsdbNew (VOID); DIODB* KERNENTRY PdiodbNew (VOID); VOID KERNENTRY DisposePfdb (FDB *); VOID KERNENTRY DisposePfdbObjCleanUp (FDB *); VOID KERNENTRY DisposePfdbDOSClose (FDB *); VOID KERNENTRY DisposePsdb (SDB *); VOID KERNENTRY DisposePpipedb (PIPDB *); VOID KERNENTRY DisposePdiodb (DIODB *); HANDLE KERNENTRY hSerialNew (PDB *ppdb, DWORD handle, DWORD DevNode); OBJ* KERNENTRY PobjCheckDevPhnd (HANDLE *, DWORD, DWORD); DWORD KERNENTRY PfdbDupPfdb (FDB *); VOID KERNENTRY DisposePmsdb (MSDB *); MSDB* KERNENTRY PmsdbNew (VOID); VOID KERNENTRY DisposePtlhpdb (TLHPDB *); TLHPDB* KERNENTRY PtlhpdbNew (VOID); PMSGINDICATORDB KERNENTRY PMsgIndicatorDBNew(VOID); VOID KERNENTRY DisposeMsgIndicatorDB( PMSGINDICATORDB); //==================================================================== // Miscellaneous functions (MISCAPI.C) void KERNENTRY ReleaseSystem(PTDB ptdb); void KERNENTRY ReleaseDisplay(PTDB ptdb); //==================================================================== // ACCESS RIGHTS BIT DEFINITIONS // These fields are common to all descriptors #define AB_PRESENT 0x80 // segment present bit #define AB_DPL 0x60 // mask for DPL field #define AB_DPL0 0x00 // ring 0 DPL #define AB_DPL1 0x20 // ring 1 DPL #define AB_DPL2 0x40 // ring 2 DPL #define AB_DPL3 0x60 // ring 3 DPL #define AB_SEGMENT 0x10 // user (i.e. non-system) segment #define AB_SYSTEM 0x00 // system descriptor #define EB_GRAN 0x80 // granularity bit (segment limit is page granularity) #define EB_DEFAULT 0x40 // default operand size (USE32 code) #define EB_BIG 0x40 // big bit (for data segments) #define EB_LIMIT 0x0f // mask for upper bits of segment limit field // These fields are relevant to code and data segment descriptors // (non-system descriptors) #define AB_DATA 0x10 // data segment #define AB_STACK 0x14 // expand down data (i.e. stack segment) #define AB_WRITE 0x02 // writable data #define AB_CODE 0x18 // code segment #define AB_CONFORM 0x04 // conforming code #define AB_READ 0x02 // readable code #define AB_ACCESSED 0x01 // segment has been accessed // These are the descriptor types for system descriptors #define DT_INVAL1 0x00 // invalid descriptor #define DT_TSS286 0x01 // available 286 task state segment #define DT_LDT 0x02 // Local Descriptor Table descriptor #define DT_TSS286B 0x03 // busy 286 task state segment #define DT_CALL286 0x04 // 286 style call gate #define DT_TASK 0x05 // task gate #define DT_INTR286 0x06 // 286 style interrupt gate #define DT_TRAP286 0x07 // 286 style trap gate #define DT_INVAL2 0x08 // invalid descriptor #define DT_TSS386 0x09 // available 386 task state segment #define DT_RSVD1 0x0A // reserved type #define DT_TSS386B 0x0B // busy 386 task state segment #define DT_CALL386 0x0C // 386 style call gate #define DT_RSVD2 0x0D // reserved type #define DT_INTR386 0x0E // 386 style interrupt gate #define DT_TRAP386 0x0F // 386 style trap gate // These are some common combinations of the above fields making up // useful access rights bytes. #define ARB_CODE0 AB_PRESENT+AB_DPL0+AB_CODE+AB_READ // ring 0 code #define ARB_CODE3 AB_PRESENT+AB_DPL3+AB_CODE+AB_READ // ring 3 code #define ARB_DATA0NP AB_DPL0+AB_DATA+AB_WRITE // illegal segment #define ARB_DATA0 AB_PRESENT+AB_DPL0+AB_DATA+AB_WRITE // ring 0 r/w data #define ARB_DATA3 AB_PRESENT+AB_DPL3+AB_DATA+AB_WRITE // ring 3 r/w data #define LIM_NONE 0xffffffff #define SELECTOR_MASK 0xFFF8 /* selector index */ #define TABLE_MASK 0x04 /* table bit */ #define RPL_MASK 0x03 /* privilige bits */ // FROM IFS.H /** Values for fReturnFlags in Duphandle: */ #define WDUP_RMM_DRIVE 0x01 // file mapped on a RMM drive #define WDUP_NETWARE_HANDLE 0x02 // handle belongs to Netware //==================================================================== // System include files #endif // ndef WOW32_EXTENSIONS #include #include #define _WINNT_ #include #include #include // dual mode .INC/.H file #ifndef IS_VXD #define Not_VxD #endif #include #include #include #include #include #include #include #include #include #include #include #ifndef IS_VXD #include #endif #include #include #include #include #ifndef WOW32_EXTENSIONS //==================================================================== // Global variables #ifdef WOW extern DWORD dwMEOWFlags; #else // WOW #ifdef MEOW_LOGGING extern DWORD dwMEOWFlags; #endif // def MEOW_LOGGING #endif // def WOW extern SEL selLDT; extern DWORD* pLDT; extern WORD* pK16HeadTDB; #ifndef WOW extern PDB** pppdbCur; extern TDB** pptdbCur; #endif // def WOW extern TDB* ptdbSvc; extern DWORD lmaUserBase; extern char* szWinDir; extern char* szSysDir; extern WORD cbWinDir; extern WORD cbSysDir; extern LCRST* Win16Lock; extern LCRST* Krn32Lock; extern LCRST* pcrstDriveState; extern BOOL F80x87Present; extern DWORD CbEmulData; extern IMTE ImteEmulator; extern WORD selK32Psp; // Selector to PSP of kernel process extern PDB * ppdbKernel; // pointer to the PDB of the kernel process extern TDB * ptdbWin16; // pointer to kernel win16 thread extern LST * plstTdb; // pointer to active thread list extern LST * plstPdb; // pointer to process list extern HANDLE hheapKernel; // Kernel's shared heap extern WORD Dos386PSPSeg; extern WORD Dos386PSPSel; extern VOID * lpSysVMHighLinear; // high linear mapping of low mem extern char WhineLevel; // debug level indicator extern USHORT selFlatCode; extern USHORT selFlatData; extern LEH* plehKernel; // Kernel's PE header extern BYTE fIsWDebThere; // Flags if kernel debugger is around extern DWORD ercNoThread; // Err code until first thread extern PTDB ptdbFault; extern HINSTANCE hinstKernel32; #ifndef WOW extern TDBX** ppTDBXCur; #endif // ndef WOW extern BYTE bBeepControl; extern int K32PSP; extern MTE **pmteModTable; extern IFSMGR_CTP_STRUCT *lpFlatIfsMgrConvertTable; // Types typedef enum _FILE_TYPE { FT_ERROR, FT_WIN16, FT_DOS, FT_BAT, FT_COM, FT_PIF, FT_WIN32CONSOLE, FT_WIN32GUI, FT_WIN32DLL } FILE_TYPE; #ifdef WOW #define GetTIB(ptdb) (*((ptdb)->ptib)) #else // WOW #define GetTIB(ptdb) ((ptdb)->tib) #endif // else WOW #endif // ndef WOW32_EXTENSIONS #endif // #ifndef __KERNEL32_H