mirror of https://github.com/tongzx/nt5src
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.
1093 lines
34 KiB
1093 lines
34 KiB
// 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 <windows.h>
|
|
|
|
#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 <k16thk.h>
|
|
|
|
#ifndef WOW32_EXTENSIONS
|
|
|
|
/*XLATOFF*/
|
|
#ifdef WOW
|
|
#include <wh.h>
|
|
#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 <object.h>
|
|
|
|
#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 <ldrdefs.h>
|
|
#include <w32base.h>
|
|
#define _WINNT_
|
|
#include <vmm.h>
|
|
#include <deb.h>
|
|
#include <coresig.inc> // dual mode .INC/.H file
|
|
#ifndef IS_VXD
|
|
#define Not_VxD
|
|
#endif
|
|
#include <w32sys.h>
|
|
#include <vwin32.h>
|
|
#include <krnlcmn.h>
|
|
#include <vmda.h>
|
|
#include <console.h>
|
|
#include <syslevel.h>
|
|
#include <tdb16.h>
|
|
#include <k32rc.h>
|
|
#include <heap.h>
|
|
#include <dxkrnl.h>
|
|
#include <leldr.h>
|
|
#ifndef IS_VXD
|
|
#include <ring0.h>
|
|
#endif
|
|
#include <handle.h>
|
|
#include <cdis.h>
|
|
#include <dbgdot.h>
|
|
#include <apitrace.h>
|
|
|
|
#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
|