📄 kernel.h
字号:
#define SET_STACKFAULT(T) ((T)->wInfo |= (1<<STACKFAULT_SHIFT))#define CLEAR_STACKFAULT(T) ((T)->wInfo &= ~(1<<STACKFAULT_SHIFT))#define SET_DEAD(T) ((T)->wInfo |= (1<<DEAD_SHIFT))#define SET_TIMEUSER(T) ((T)->wInfo &= ~(1<<TIMEMODE_SHIFT))#define SET_TIMEKERN(T) ((T)->wInfo |= (1<<TIMEMODE_SHIFT))#define SET_NEEDDBG(T) ((T)->wInfo |= (1<<NEEDDBG_SHIFT))#define CLEAR_NEEDDBG(T) ((T)->wInfo &= ~(1<<NEEDDBG_SHIFT))#define SET_PROFILE(T) ((T)->wInfo |= (1<<PROFILE_SHIFT))#define CLEAR_PROFILE(T) ((T)->wInfo &= ~(1<<PROFILE_SHIFT))#define SET_NOPRIOCALC(T) ((T)->wInfo |= (1<<NOPRIOCALC_SHIFT))#define CLEAR_NOPRIOCALC(T) ((T)->wInfo &= ~(1<<NOPRIOCALC_SHIFT))#define SET_DEBUGWAIT(T) ((T)->wInfo |= (1<<DEBUGWAIT_SHIFT))#define CLEAR_DEBUGWAIT(T) ((T)->wInfo &= ~(1<<DEBUGWAIT_SHIFT))#define SET_USERBLOCK(T) ((T)->wInfo |= (1<<USERBLOCK_SHIFT))#define CLEAR_USERBLOCK(T) ((T)->wInfo &= ~(1<<USERBLOCK_SHIFT))struct Thread { WORD wInfo; /* 00: various info about thread, see above */ BYTE bSuspendCnt;/* 02: thread suspend count */ BYTE bWaitState; /* 03: state of waiting loop */ LPPROXY pProxList; /* 04: list of proxies to threads blocked on this thread */ PTHREAD pNextInProc;/* 08: next thread in this process */ PPROCESS pProc; /* 0C: pointer to current process */ PPROCESS pOwnerProc; /* 10: pointer to owner process */ ACCESSKEY aky; /* 14: keys used by thread to access memory & handles */ PCALLSTACK pcstkTop; /* 18: current api call info */ DWORD dwStackBase;/* 1C: stack base */ DWORD dwStackBound;/* 20: lower bound of commited stack space */ LPDWORD tlsPtr; /* 24: tls pointer */ DWORD dwSleepCnt; /* 28: sleep count, also pending sleepcnt on waitmult */ DWORD dwKernTime; /* 2C: elapsed kernel time */ DWORD dwUserTime; /* 30: elapsed user time */ LPPROXY lpProxy; /* 34: first proxy this thread is blocked on */ DWORD dwLastError;/* 38: last error */ HANDLE hTh; /* 3C: Handle to this thread, needed by NextThread */ BYTE bBPrio; /* 40: base priority */ BYTE bCPrio; /* 41: curr priority */ WORD wCount; /* 42: nonce for blocking lists */ PTHREAD pPrevInProc;/* 44: previous thread in this process */ LPTHRDDBG pThrdDbg; /* 48: pointer to thread debug structure, if any */ LPBYTE pSwapStack; /* 4c */ FILETIME ftCreate; /* 50: time thread is created */ CLEANEVENT *lpce; /* 58: cleanevent for unqueueing blocking lists */ CPUCONTEXT ctx; /* 5c: thread's cpu context information */ PTHREAD pNextSleepRun; /* ??: next sleeping thread, if sleeping, else next on runq if runnable */ PTHREAD pPrevSleepRun; /* ??: back pointer if sleeping or runnable */ PTHREAD pUpRun; /* ??: up run pointer */ PTHREAD pDownRun; /* ??: down run pointer */ LPCRIT pOwnedList; /* ??: list of crits and mutexes for priority inversion */ LPCRIT pOwnedHash[PRIORITY_LEVELS_HASHSIZE]; DWORD dwQuantum; /* ??: thread quantum */ DWORD dwQuantLeft;/* ??: quantum left */ LPPROXY lpCritProxy;/* ??: proxy from last critical section block, in case stolen back */ LPPROXY lpPendProxy;/* ??: pending proxies for queueing */ DWORD dwPendTime; /* ??: pending timeout delay */ DWORD dwPendReturn;/* ??: return value from pended wait */ DWORD dwPendStart;/* ??: time at which pendoperation started */ PTHREAD pCrabPth; DWORD dwCrabRem; HANDLE hLastCrit; /* ??: Last crit taken, cleared by nextthread */ DWORD dwCrabTime; DWORD dwCrabCount; CALLSTACK IntrStk; DWORD dwStartAddr; /* thread PC at creation, used to get thread name */}; /* Thread */#define THREAD_CONTEXT_OFFSET 0x5cERRFALSE(THREAD_CONTEXT_OFFSET == offsetof(THREAD, ctx));#define KSetLastError(pth, err) (pth->dwLastError = err)#define KGetLastError(pth) (pth->dwLastError)// Any time this structure is redefined, we need to recalculate// the offset used in the SHx profiler ISR located at// %_WINCEROOT%\platform\ODO\kernel\profiler\shx\profisr.srcstruct Process { BYTE procnum; /* 00: ID of this process [ie: it's slot number] */ BYTE DbgActive; /* 01: ID of process currently DebugActiveProcess'ing this process */ BYTE bChainDebug;/* 02: Did the creator want to debug child processes? */ BYTE bTrustLevel;/* 03: level of trust of this exe */ LPPROXY pProxList; /* 04: list of proxies to threads blocked on this process */ HANDLE hProc; /* 08: handle for this process, needed only for SC_GetProcFromPtr */ DWORD dwVMBase; /* 0C: base of process's memory section, or 0 if not in use */ PTHREAD pTh; /* 10: first thread in this process */ ACCESSKEY aky; /* 14: default address space key for process's threads */ LPVOID BasePtr; /* 18: Base pointer of exe load */ HANDLE hDbgrThrd; /* 1C: handle of thread debugging this process, if any */ LPWSTR lpszProcName;/* 20: name of process */ DWORD tlsLowUsed; /* 24: TLS in use bitmask (first 32 slots) */ DWORD tlsHighUsed;/* 28: TLS in use bitmask (second 32 slots) */ PEXCEPTION_ROUTINE pfnEH;/*2C: process exception handler */ LPDBGPARAM ZonePtr; /* 30: Debug zone pointer */ PTHREAD pMainTh; /* 34 primary thread in this process*/ PMODULE pmodResource; /* 38: module that contains the resources */ LPName pStdNames[3]; /* 3C: Pointer to names for stdio */ LPCWSTR pcmdline; /* 48: Pointer to command line */ DWORD dwDyingThreads; /* 4C: number of pending dying threads */ openexe_t oe; /* 50: Pointer to executable file handle */ e32_lite e32; /* ??: structure containing exe header */ o32_lite *o32_ptr; /* ??: o32 array pointer for exe */ LPVOID pExtPdata;}; /* Process */#define ProcStarted(P) (((P)->dwVMBase >> VA_SECTION) == ((DWORD)((P)->lpszProcName)>>VA_SECTION))#define MIN_STACK_SIZE PAGE_SIZE#define CNP_STACK_SIZE (64*1024) // the size of the stack when bootstrapping a new process#define KRN_STACK_SIZE (64*1024) // the size of kernel thread stacks// MIN_STACK_RESERVE is the minimum amount of stack space for the debugger and/or SEH code to run.// When there is less than this amount of stack left and another stack page is committed,// a stack overflow exception will be raised.#if (PAGE_SIZE == 1024)#define MIN_STACK_RESERVE 4096#else#define MIN_STACK_RESERVE 8192#endif#define MAX_STACK_RESERVE (1024*1024)#define MapPtr(P) (!(P) || ((DWORD)(P)>>VA_SECTION) ? (LPVOID)(P) : \ (LPVOID)((DWORD)(P)|(DWORD)pCurProc->dwVMBase))#define MapPtrProc(Ptr, Proc) (!(Ptr) || ((DWORD)(Ptr)>>VA_SECTION) ? (LPVOID)(Ptr) : \ (LPVOID)((DWORD)(Ptr)|(DWORD)(Proc)->dwVMBase))extern PROCESS ProcArray[MAX_PROCESSES]; // in schedule.c// dwFlags for MODULES// #define DONT_RESOLVE_DLL_REFERENCES 0x00000001 // defined in winbase.h// #define LOAD_LIBRARY_AS_DATAFILE 0x00000002 // defined in winbase.h// #define LOAD_WITH_ALTERED_SEARCH_PATH 0x00000008 // defined in winbase.hERRFALSE(!(DONT_RESOLVE_DLL_REFERENCES & 0xffff0000));ERRFALSE(!(LOAD_LIBRARY_AS_DATAFILE & 0xffff0000));ERRFALSE(!(LOAD_WITH_ALTERED_SEARCH_PATH & 0xffff0000));typedef struct Module { LPVOID lpSelf; /* Self pointer for validation */ PMODULE pMod; /* Next module in chain */ LPWSTR lpszModName; /* Module name */ DWORD inuse; /* Bit vector of use */ DWORD calledfunc; /* Called entry but not exit */ WORD refcnt[MAX_PROCESSES];/* Reference count per process*/ LPVOID BasePtr; /* Base pointer of dll load (not 0 based) */ DWORD DbgFlags; /* Debug flags */ LPDBGPARAM ZonePtr; /* Debug zone pointer */ ulong startip; /* 0 based entrypoint */ openexe_t oe; /* Pointer to executable file handle */ e32_lite e32; /* E32 header */ o32_lite *o32_ptr; /* O32 chain ptr */ DWORD breadcrumb; DWORD dwNoNotify; /* 1 bit per process, set if notifications disabled */ WORD wFlags; BYTE bTrustLevel; BYTE bPadding; PMODULE pmodResource; /* module that contains the resources */} Module;// List of all modules#define pModList ((PMODULE)KInfoTable[KINX_MODULES])#define HasModRefProcPtr(pMod,pProc) ((pMod)->refcnt[(pProc)->procnum] != 0)#define HasModRefProcIndex(pMod,iProc) ((pMod)->refcnt[(iProc)] != 0)#define AllowThreadMessage(pMod,pProc) (!((pMod)->dwNoNotify & (1 << (pProc)->procnum)))typedef struct FSMAP *LPFSMAP;typedef struct FSMAP { HANDLE hNext; /* Next map in list */ HANDLE hFile; /* File, or INVALID_HANDLE_VALUE for just vm */ LPBYTE pBase; /* pointer to start of kernel mapped region */ LPBYTE pDirty; /* non-null if r/w real file, points to dirty bitmap */ DWORD length; /* length of mapped region */ DWORD filelen; /* length of file if hFile != INVALID_HANDLE_VALUE */ DWORD reslen; /* length of reservation */ Name *name; /* points to name of event */ CLEANEVENT *lpmlist;/* List of mappings */ DWORD dwDirty; /* Count of dirty pages */ BYTE bRestart; /* Has been flushed */ BYTE bNoAutoFlush; /* Disallow automatic flushing */ WORD wPad;} FSMAP;// Lowest DLL load address#define DllLoadBase KInfoTable[KINX_DLL_LOW]#define DBG_IS_DEBUGGER 0x00000001#define DBG_SYMBOLS_LOADED 0x80000000#define PAGEALIGN_UP(X) (((X)+(PAGE_SIZE-1))&~(PAGE_SIZE-1))#define PAGEALIGN_DOWN(X) ((X)&~(PAGE_SIZE-1))// LOG_MAGIC, mem_t, fslogentry_t, and fslog_t MUST be kept in sync with filesys.h version#define LOG_MAGIC 0x4d494b45typedef struct mem_t { DWORD startptr; DWORD length; DWORD extension;} mem_t;typedef struct fslogentry_t { DWORD type; DWORD d1, d2, d3;} fslogentry_t;typedef struct fshash_t { DWORD hashdata[4];} fshash_t;#define CURRENT_FSLOG_VERSION 1// MUST be kept in sync with data structure in coreos\filesys\filesys.h#pragma warning(disable:4200) // nonstandard extensions warningtypedef struct fslog_t { DWORD version; // version of this structure, must stay as first DWORD DWORD magic1; // LOG_MAGIC if memory tables valid DWORD magic2; // LOG_MAGIC if heap initialized union { struct { mem_t fsmemblk[2]; // Memory blocks to use for file system LPBYTE pFSList; LPBYTE pKList; }; struct { CEGUID guid; DWORD dwRestoreFlags; DWORD dwRestoreStart; DWORD dwRestoreSize; }; }; DWORD virtbase; // VirtBase when last booted DWORD entries; // number of entries in recovery log DWORD hDbaseRoot; // handle to first dbase, else 0 DWORD hReg; // Handle to registry header DWORD dwReplMask; // replication mask DWORD flags; // file system flags fshash_t pwhash; // hashed password fslogentry_t log[]; // log entries} fslog_t;#pragma warning(default:4200) // nonstandard extensions warningLPVOID AllocMem(ulong poolnum);VOID FreeMem(LPVOID pMem, ulong poolnum);LPName AllocName(DWORD dwLen);#define FreeName(lpn) FreeMem(lpn,lpn->wPool);PHYSICAL_ADDRESS GetHeldPage(void);PHYSICAL_ADDRESS GetReservedPage(void);BOOL HoldPages(int cpNeed, BOOL bForce);void DupPhysPage(PHYSICAL_ADDRESS paPFN);void FreePhysPage(PHYSICAL_ADDRESS paPFN);LPVOID InitNKSection(void);BOOL AutoCommit(ulong addr);BOOL DemandCommit(DWORD);void GuardCommit(ulong addr);BOOL ProcessPageFault(BOOL bWrite, ulong addr);void FreeSection(PSECTION pscn);PSECTION GetSection(void);LPVOID GetHelperStack(void);void FreeHelperStack(LPVOID);BOOL CreateMapperSection(DWORD dwBase);void DeleteMapperSection(DWORD dwBase);void CloseMappedFileHandles();void FreeIntrFromEvent(LPEVENT lpe);void EnterPhysCS(void);BOOL ScavengeStacks(int cNeed);void CreateNewProc(ulong nextfunc, ulong param);void KernelInit2(void);void AlarmThread(LPVOID param);void RunApps(ulong param);#if x86void InitNPXHPHandler(LPVOID);void InitializeEmx87(void);void InitializeFPU(void);extern DWORD dwFPType;#endif/** Return values from AutoCommit(...): */#define AUTO_COMMIT_RESCHED 0#define AUTO_COMMIT_HANDLED 1#define AUTO_COMMIT_FAULT 2void SetCPUASID(PTHREAD pth);#ifdef SHxvoid SetCPUGlobals(void);#endifLPVOID VerifyAccess(LPVOID pvAddr, DWORD dwFlags, ACCESSKEY aky);BOOL IsAccessOK(void *addr, ACCESSKEY aky);void KUnicodeToAscii(LPCHAR, LPCWSTR, int);void KAsciiToUnicode(LPWSTR wchptr, LPBYTE chptr, int maxlen);LPVOID GetOneProcAddress(HANDLE, LPCVOID, BOOL);HANDLE LoadOneLibraryW(LPCWSTR,BOOL,WORD);PMODULE LoadOneLibraryPart2(LPWSTR lpszFileName, BOOL bAllowPaging, WORD dwFlags);VOID FreeAllProcLibraries(PPROCESS);PVOID PDataFromPC(ULONG pc, PPROCESS pProc, PULONG pSize);LPVOID SC_GetProcAddressW(HANDLE hInst, LPWSTR lpszProc);LPVOID SC_GetProcAddressA(HANDLE hInst, LPCSTR lpszProc);BOOL SC_DisableThreadLibraryCalls(PMODULE hLibModule);LPWSTR SC_GetCommandLineW(VOID);PFNVOID DBG_CallCheck(PTHREAD pth, DWORD dwJumpAddress);#define DBG_ReturnCheck(pth) ((pth)->pcstkTop ? (pth)->pcstkTop->retAddr : 0)BOOL UserDbgTrap(EXCEPTION_RECORD *er, PCONTEXT pctx, BOOL bFirst);void SurrenderCritSecs(void);BOOL SetThreadBasePrio(HANDLE hth, DWORD nPriority);HANDLE EventModIntr(LPEVENT lpe, DWORD type);VOID MakeRunIfNeeded(HANDLE hth);extern void (*TBFf)(LPVOID, ulong);extern void (*MTBFf)(LPVOID, ulong, ulong, ulong, ulong);extern void (*CTBFf)(LPVOID, ulong, ulong, ulong, ulong);extern BOOL (*KSystemTimeToFileTime)(LPSYSTEMTIME, LPFILETIME);extern LONG (*KCompareFileTime)(LPFILETIME, LPFILETIME);extern BOOL (*KFileTimeToSystemTime)(const FILETIME *, LPSYSTEMTIME);extern BOOL (*KLocalFileTimeToFileTime)(const FILETIME *, LPFILETIME);extern void (*pPSLNotify)(DWORD, DWORD, DWORD);extern BOOL (*pGetHeapSnapshot)(THSNAP *pSnap, BOOL bMainOnly, LPVOID *pDataPtr);extern HANDLE (*pGetProcessHeap)(void);#ifdef IN_KERNELextern ROMHDR * const volatile pTOC;#endifvoid KernelRelocate(ROMHDR *const pTOC);void KernelFindMemory(void);extern ROMChain_t *ROMChain;DWORD CECompress(LPBYTE lpbSrc, DWORD cbSrc, LPBYTE lpbDest, DWORD cbDest, WORD wStep, DWORD dwPagesize);DWORD CEDecompress(LPBYTE lpbSrc, DWORD cbSrc, LPBYTE lpbDest, DWORD cbDest, DWORD dwSkip, WORD wStep, DWORD dwPagesize);typedef struct LSInfo_t { PTHREAD pHelper;// must be first HTHREAD hth; // hthread to start DWORD startip; // starting ip after switch DWORD flags; // creation flags LPVOID lpStack; // pointer to new stack LPVOID lpOldStack; // pointer to old stack DWORD cbStack; // bytes in stack DWORD cmdlen; // length of command line DWORD namelen; // length of process name HANDLE hEvent; // event to signal} LSInfo_t;extern HANDLE hAlarmThreadWakeup;DWORD ThreadSuspend(PTHREAD hTh);void BlockWithHelper(FARPROC pFunc, FARPROC pHelpFunc, LPVOID param);void BlockWithHelperAlloc(FARPROC pFunc, FARPROC pHelpFunc, LPVOID param);int ropen(WCHAR *name, int mode);int rread(int fd, char *buf, int cnt);int rreadseek(int fd, char *buf, int cnt, int off);int rlseek(int fd, int off, int mode);int rclose(int fd);int rwrite(int fd, char *buf, int cnt);void kstrcpyW(LPWSTR p1, LPCWSTR p2);unsigned int strlenW(LPCWSTR str);unsigned int strlen(const char *str);int kstrcmpi(LPWSTR str1, LPWSTR str2);int strcmpW(LPCWSTR lpu1, LPCWSTR lpu2);int strcmp(const char *lpc1, const char *lpc2);LPVOID memset(LPVOID dest, int c, unsigned int count);LPVOID memcpy(LPVOID dest, const void *src, unsigned int count);#ifdef x86void InvalidateRange(PVOID, ULONG);#elsevoid FlushTLB(void);#define InvalidateRange(x, y) FlushTLB()#endif#if defined(WIN32_CALL) && !defined(KEEP_SYSCALLS)#undef InputDebugCharWint WINAPI InputDebugCharW(void);#undef OutputDebugStringWVOID WINAPI OutputDebugStringW(LPCWSTR str);#undef NKvDbgPrintfWVOID NKvDbgPrintfW(LPCWSTR lpszFmt, CONST VOID * lpParms);#endif#if defined(SH3)void FlushCache(void);void FlushCacheNoDiscard(void);#elif defined(x86)void FlushCache(void);#elsevoid FlushICache(void);void FlushDCache(void);#endifvoid DumpStringToSerial(LPCWSTR);HANDLE DoCreateThread(LPVOID lpStack, DWORD cbStack, LPVOID lpStart, LPVOID param, DWORD flags, LPDWORD lpthid, ulong mode, WORD prio);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -