📄 kwin32.c
字号:
/** TITLE("Kernel Win32 Handle") *++ * * Copyright (c) 1995-2000 Microsoft Corporation. All rights reserved. * * Module Name: * * KWin32.c * * Abstract: * * This file contains the definition of the Win32 system API handle. * *-- */#include "kernel.h"#include "halether.h"#include "ethdbg.h"const PFNVOID Win32Methods[] = { (PFNVOID)SC_Nop, (PFNVOID)SC_NotSupported, (PFNVOID)SC_CreateAPISet, // 2 (PFNVOID)SC_VirtualAlloc, // 3 (PFNVOID)SC_VirtualFree, // 4 (PFNVOID)SC_VirtualProtect, // 5 (PFNVOID)SC_VirtualQuery, // 6 (PFNVOID)SC_VirtualCopy, // 7 (PFNVOID)SC_LoadLibraryW, // 8 (PFNVOID)SC_FreeLibrary, // 9 (PFNVOID)SC_GetProcAddressW, // 10 (PFNVOID)SC_ThreadAttachAllDLLs, // 11 (PFNVOID)SC_ThreadDetachAllDLLs, // 12 (PFNVOID)SC_GetTickCount, // 13 (PFNVOID)OutputDebugStringW, // 14 (PFNVOID)SC_TlsCall, // 15 (PFNVOID)SC_GetSystemInfo, // 16 (PFNVOID)ropen, // 17 (PFNVOID)rread, // 18 (PFNVOID)rwrite, // 19 (PFNVOID)rlseek, // 20 (PFNVOID)rclose, // 21 (PFNVOID)SC_RegisterDbgZones, // 22 (PFNVOID)NKvDbgPrintfW, // 23 (PFNVOID)SC_ProfileSyscall, // 24 (PFNVOID)SC_FindResource, // 25 (PFNVOID)SC_LoadResource, // 26 (PFNVOID)SC_SizeofResource, // 27 (PFNVOID)OEMGetRealTime, // 28 (PFNVOID)OEMSetRealTime, // 29 (PFNVOID)SC_ProcessDetachAllDLLs, // 30 (PFNVOID)SC_ExtractResource, // 31 (PFNVOID)SC_GetRomFileInfo, // 32 (PFNVOID)SC_GetRomFileBytes, // 33 (PFNVOID)SC_CacheSync, // 34 (PFNVOID)SC_AddTrackedItem, // 35 (PFNVOID)SC_DeleteTrackedItem, // 36 (PFNVOID)SC_PrintTrackedItem, // 37 (PFNVOID)SC_GetKPhys, // 38 (PFNVOID)SC_GiveKPhys, // 39 (PFNVOID)SC_SetExceptionHandler, // 40 (PFNVOID)SC_RegisterTrackedItem, // 41 (PFNVOID)SC_FilterTrackedItem, // 42 (PFNVOID)SC_SetKernelAlarm, // 43 (PFNVOID)SC_RefreshKernelAlarm, // 44 (PFNVOID)SC_CeGetRandomSeed, // 45 (PFNVOID)SC_CloseProcOE, // 46 (PFNVOID)SC_SetGwesOOMEvent, // 47 (PFNVOID)SC_FSStringCompress, // 48 (PFNVOID)SC_FSStringDecompress, // 49 (PFNVOID)SC_FSBinaryCompress, // 50 (PFNVOID)SC_FSBinaryDecompress, // 51 (PFNVOID)SC_CreateEvent, // 52 (PFNVOID)SC_CreateProc, // 53 (PFNVOID)SC_CreateThread, // 54 (PFNVOID)InputDebugCharW, // 55 (PFNVOID)UB_TakeCritSec, // 56 (PFNVOID)SC_LeaveCritSec, // 57 (PFNVOID)UB_WaitForMultiple, // 58 (PFNVOID)SC_MapPtrToProcess, // 59 (PFNVOID)SC_MapPtrUnsecure, // 60 (PFNVOID)SC_GetProcFromPtr, // 61 (PFNVOID)SC_IsBadPtr, // 62 (PFNVOID)SC_GetProcAddrBits, // 63 (PFNVOID)SC_GetFSHeapInfo, // 64 (PFNVOID)SC_OtherThreadsRunning, // 65 (PFNVOID)SC_KillAllOtherThreads, // 66 (PFNVOID)SC_GetOwnerProcess, // 67 (PFNVOID)SC_GetCallerProcess, // 68 (PFNVOID)SC_GetIdleTime, // 69 (PFNVOID)SC_SetLowestScheduledPriority, // 70 (PFNVOID)SC_IsPrimaryThread, // 71 (PFNVOID)SC_SetProcPermissions, // 72 (PFNVOID)SC_GetCurrentPermissions, // 73 (PFNVOID)0, // 74 (PFNVOID)SC_SetDaylightTime, // 75 (PFNVOID)SC_SetTimeZoneBias, // 76 (PFNVOID)SC_SetCleanRebootFlag, // 77 (PFNVOID)SC_CreateCrit, // 78 (PFNVOID)SC_PowerOffSystem, // 79 (PFNVOID)SC_CreateMutex, // 80 (PFNVOID)SC_SetDbgZone, // 81 (PFNVOID)UB_Sleep, // 82 (PFNVOID)SC_TurnOnProfiling, // 83 (PFNVOID)SC_TurnOffProfiling, // 84 (PFNVOID)SC_CeGetCurrentTrust, // 85 (PFNVOID)SC_CeGetCallerTrust, // 86 (PFNVOID)SC_NKTerminateThread, // 87 (PFNVOID)SC_SetLastError, // 88 (PFNVOID)SC_GetLastError, // 89 (PFNVOID)SC_GetProcName, // 90 (PFNVOID)SC_TerminateSelf, // 91 (PFNVOID)SC_CloseAllHandles, // 92 (PFNVOID)SC_SetHandleOwner, // 93 (PFNVOID)SC_LoadDriver, // 94 (PFNVOID)SC_CreateFileMapping, // 95 (PFNVOID)SC_UnmapViewOfFile, // 96 (PFNVOID)SC_FlushViewOfFile, // 97 (PFNVOID)SC_CreateFileForMapping, // 98 (PFNVOID)OEMIoControl, // 99 (PFNVOID)SC_MapUncompressedFileW, // 100 (PFNVOID)SC_PPSHRestart, // 101 (PFNVOID)SC_SignalStarted, // 102 (PFNVOID)SC_UpdateNLSInfo, // 103 (PFNVOID)SC_ConnectDebugger, // 104 (PFNVOID)SC_InterruptInitialize, // 105 (PFNVOID)SC_InterruptDone, // 106 (PFNVOID)SC_InterruptDisable, // 107 (PFNVOID)SC_SetKMode, // 108 (PFNVOID)SC_SetPowerOffHandler, // 109 (PFNVOID)SC_SetGwesPowerHandler, // 110 (PFNVOID)SC_SetHardwareWatch, // 111 (PFNVOID)SC_QueryAPISetID, // 112 (PFNVOID)-1, // 113 (PerformCallBack) (PFNVOID)CaptureContext, // 114 (RaiseException) (PFNVOID)SC_GetCallerIndex, // 115 (PFNVOID)SC_WaitForDebugEvent, // 116 (PFNVOID)SC_ContinueDebugEvent, // 117 (PFNVOID)SC_DebugNotify, // 118 (PFNVOID)SC_OpenProcess, // 119 (PFNVOID)SC_THCreateSnapshot, // 120 (PFNVOID)SC_THGrow, // 121 (PFNVOID)SC_NotifyForceCleanboot, // 122 (PFNVOID)SC_DumpKCallProfile, // 123 (PFNVOID)SC_GetProcessVersion, // 124 (PFNVOID)SC_GetModuleFileNameW, // 125 (PFNVOID)SC_QueryPerformanceCounter, // 126 (PFNVOID)SC_QueryPerformanceFrequency, // 127 (PFNVOID)SC_KernExtractIcons, // 128 (PFNVOID)SC_ForcePageout, // 129 (PFNVOID)SC_GetThreadTimes, // 130 (PFNVOID)SC_GetModuleHandleW, // 131 (PFNVOID)SC_SetWDevicePowerHandler, // 132 (PFNVOID)SC_SetStdioPathW, // 133 (PFNVOID)SC_GetStdioPathW, // 134 (PFNVOID)SC_ReadRegistryFromOEM, // 135 (PFNVOID)SC_WriteRegistryToOEM, // 136 (PFNVOID)SC_WriteDebugLED, // 137 (PFNVOID)SC_LockPages, // 138 (PFNVOID)SC_UnlockPages, // 139#ifdef SH4 (PFNVOID)SC_VirtualSetPageFlags, // 140 (PFNVOID)SC_SetRAMMode, // 141 (PFNVOID)SC_SetStoreQueueBase, // 142#else (PFNVOID)0, // 140 (PFNVOID)0, // 141 (PFNVOID)0, // 142#endif (PFNVOID)SC_FlushViewOfFileMaybe, // 143 (PFNVOID)SC_GetProcAddressA, // 144 (PFNVOID)SC_GetCommandLineW, // 145 (PFNVOID)SC_DisableThreadLibraryCalls, // 146 (PFNVOID)SC_CreateSemaphore, // 147 (PFNVOID)SC_LoadLibraryExW, // 148 (PFNVOID)-2, // 149 (PerformCallForward) (PFNVOID)SC_CeMapArgumentArray, // 150 (PFNVOID)SC_KillThreadIfNeeded, // 151 (PFNVOID)SC_ProcGetIndex, // 152 (PFNVOID)SC_RegisterGwesHandler, // 153 (PFNVOID)SC_GetProfileBaseAddress, // 154 (PFNVOID)SC_SetProfilePortAddress, // 155#ifdef CELOG (PFNVOID)CeLogData, // 156 (PFNVOID)CeLogSetZones, // 157#else (PFNVOID)0, // 156 (PFNVOID)0, // 157#endif (PFNVOID)ModuleJit, // 158 (PFNVOID)SC_CeSetExtendedPdata, // 159 (PFNVOID)SC_VerQueryValueW, // 160 (PFNVOID)SC_GetFileVersionInfoSizeW, // 161 (PFNVOID)SC_GetFileVersionInfoW, // 162 (PFNVOID)SC_CreateLocaleView, // 163#ifdef CELOG (PFNVOID)CeLogReSync, // 164#else (PFNVOID)0, // 164#endif};const CINFO cinfWin32 = { "Wn32", DISPATCH_I_KPSL, 0, sizeof(Win32Methods)/sizeof(Win32Methods[0]), Win32Methods,};extern const CINFO cinfThread;extern const CINFO cinfProc;extern const CINFO cinfMutex;extern const CINFO cinfSem;extern const CINFO cinfEvent;extern const CINFO cinfAPISet;extern const CINFO cinfMap;const CINFO CinfFile = { "FILE", DISPATCH_KERNEL, HT_FILE, 0, 0 };const CINFO CinfFind = { "FIND", DISPATCH_KERNEL, HT_FIND, 0, 0 };const CINFO CinfDBFile = { "DFIL", DISPATCH_KERNEL, HT_DBFILE, 0, 0 };const CINFO CinfDBFind = { "DFND", DISPATCH_KERNEL, HT_DBFIND, 0, 0 };const CINFO CinfSocket = { "SKT", DISPATCH_KERNEL, HT_SOCKET, 0, 0 };const CINFO CinfWnetEnum = { "ENUM", DISPATCH_KERNEL, HT_WNETENUM, 0, 0 };extern void InitMemoryPool(void);extern void ProfInit(void);extern void HeapInit(void);extern void SchedInit(void);extern void ProcInit(void);extern CRITICAL_SECTION VAcs, RFBcs, ppfscs, PhysCS, LLcs, ModListcs, ODScs, CompCS, MapCS, NameCS, DbgApiCS, PagerCS, WriterCS, MapNameCS, ppfcs, PageOutCS;BOOL ReadyForStrings;PPROCESS PowerProc;FARPROC PowerFunc;ACCESSKEY PowerKey;PPROCESS GwesPowerProc;FARPROC GwesPowerFunc;ACCESSKEY GwesPowerKey;PPROCESS WDevicePowerProc;FARPROC WDevicePowerFunc;ACCESSKEY WDevicePowerKey;/* Kernel Debugger interface pointers */// rameshk// added more argumentsextern BOOLEAN (*PKDInit)(LPVOID * p1, LPVOID * p2, LPVOID *p3,LPVOID,LPVOID *,LPVOID *);ULONG FakeKDTrap(PEXCEPTION_RECORD ExceptionRecord, CONTEXT *ContextRecord, BOOLEAN SecondChance);ULONG (*KDTrap)(PEXCEPTION_RECORD ExceptionRecord, CONTEXT *ContextRecord, BOOLEAN SecondChance) = FakeKDTrap;//rameshk// Added FakePrintString().// When windbg sends TerminateApi, KDPrintString should also made to point to// a fake routine like the other 2 pointers KDTrap and KDUpdateSymbols.BOOLEAN FakePrintString(IN LPCWSTR);BOOLEAN (*KDPrintString)(IN LPCWSTR Output)=FakePrintString;//end//rameshkBOOLEAN FakeSetLoadSymbolsFlag();BOOLEAN FakeResetLoadSymbolsFlag();BOOLEAN (*KDSetLoadSymbolsFlag)()=FakeSetLoadSymbolsFlag;BOOLEAN (*KDResetLoadSymbolsFlag)()=FakeResetLoadSymbolsFlag;//endvoid FakeUpdateSymbols(DWORD dwAddr, BOOL bUnload);void (*KDUpdateSymbols)(DWORD dwAddr, BOOL bUnload) = FakeUpdateSymbols;// rameshkBOOLEAN KDCleanup(void);// endextern void MemTrackInit(void);// For mapping which communications devices to use for kernel debug servicesUCHAR CommDev[3] = {KERNEL_COMM_SERIAL,KERNEL_COMM_PARALLEL,KERNEL_COMM_SERIAL};void (* lpWriteDebugStringFunc)(unsigned short *str) = OEMWriteDebugString;int (* lpReadDebugByteFunc)(void) = OEMReadDebugByte;void (* lpWriteDebugByteFunc)(BYTE ch) = OEMWriteDebugByte;void (* lpParallelPortSendByteFunc)(BYTE ch) = OEMParallelPortSendByte;int (* lpParallelPortGetByteFunc)(void) = OEMParallelPortGetByte;// Ethernet debug functions, pointers set only if platform supports ether debug.PFN_EdbgRegisterDfltClient pEdbgRegisterDfltClient;PFN_EdbgInitializeInterrupt pEdbgInitializeInterrupt;PFN_EdbgSend pEdbgSend;PFN_EdbgRecv pEdbgRecv;// For PPFS over etherextern void PpfsWriteDebugString(unsigned short *name);extern void ppfs_send_byte_ether(BYTE ch);extern int ppfs_get_byte_ether(void);BOOL BufferedPPFS;UCHAR *PpfsEthBuf;/* dummy Kernel Debugger routines */ULONG FakeKDTrap(PEXCEPTION_RECORD ExceptionRecord, CONTEXT *ContextRecord, BOOLEAN SecondChance) { return FALSE;}void FakeUpdateSymbols(DWORD dwAddr, BOOL bUnload) { return;}void DoLoadAllSymbols(void) { PMODULE pMod; HANDLE hRealProc; int loop; KDSetLoadSymbolsFlag(); KDUpdateSymbols((DWORD)ProcArray[0].BasePtr+1, FALSE); if ((CommDev[KERNEL_SVC_DBGMSG] == KERNEL_COMM_SERIAL) && (CommDev[KERNEL_SVC_KDBG] == KERNEL_COMM_SERIAL)) lpWriteDebugStringFunc = KDPrintString; ReadyForStrings = TRUE; for (pMod = pModList; pMod; pMod = pMod->pMod) KDUpdateSymbols(((DWORD)pMod->BasePtr)+1, FALSE); hRealProc = hCurProc; for (loop = 1; loop < MAX_PROCESSES; loop++) if (ProcArray[loop].dwVMBase) { hCurProc = ProcArray[loop].hProc; KDUpdateSymbols(((DWORD)ProcArray[loop].BasePtr)+1, FALSE); } hCurProc = hRealProc; KDResetLoadSymbolsFlag();}BOOL SC_ConnectDebugger(LPVOID pInit) { LPVOID p1,p2,p3,p4,p5; BOOLEAN (*DbgInit)(kerndata_t *kdp, LPVOID kpTOC, LPVOID kpProcArray, LPVOID *p1, LPVOID *p2, LPVOID *p3,LPVOID,LPVOID *p4,LPVOID *p5) = (BOOLEAN (*)(kerndata_t *, LPVOID, LPVOID, LPVOID, LPVOID, LPVOID,LPVOID,LPVOID,LPVOID))pInit;#ifdef SHx extern void FlushCache(void);#if defined(SH4) extern void FPUFlushContext(void); kerndata_t kdp = {OEMClearDebugCommError, OEMWriteDebugByte, OEMReadDebugByte, DbgVerify, DBG_CallCheck, NULL, &KData, FlushCache, FPUFlushContext};#else kerndata_t kdp = {OEMClearDebugCommError, OEMWriteDebugByte, OEMReadDebugByte, DbgVerify, DBG_CallCheck, NULL, &KData, FlushCache};#endif#elif MIPS extern void FlushDCache(void); extern void FlushICache(void);#if defined(MIPS_HAS_FPU) extern void FPUFlushContext(void); kerndata_t kdp = {OEMClearDebugCommError, OEMWriteDebugByte, OEMReadDebugByte, DbgVerify, DBG_CallCheck, NULL, &KData, FlushDCache, FlushICache, FPUFlushContext};#else kerndata_t kdp = {OEMClearDebugCommError, OEMWriteDebugByte, OEMReadDebugByte, DbgVerify, DBG_CallCheck, NULL, &KData, FlushDCache, FlushICache};#endif#elif PPC extern void FlushDCache(void); extern void FlushICache(void); kerndata_t kdp = {OEMClearDebugCommError, OEMWriteDebugByte, OEMReadDebugByte, DbgVerify, DBG_CallCheck, NULL, &KData, FlushDCache, FlushICache};#elif ARM extern void __declspec(iw32) FlushDCache(void); extern void __declspec(iw32) FlushICache(void); kerndata_t kdp = {OEMClearDebugCommError, OEMWriteDebugByte, OEMReadDebugByte, DbgVerify, DBG_CallCheck, NULL, &KData, FlushDCache, FlushICache};#elif x86 kerndata_t kdp = {OEMClearDebugCommError, OEMWriteDebugByte, OEMReadDebugByte, DbgVerify, DBG_CallCheck, NULL, &KData, NULL};#else kerndata_t kdp; #pragma message("ERROR: ConnectDebugger not supported on this CPU!") lpWriteDebugStringFunc(TEXT("ConnectDebugger Failed - not supported on this CPU!\r\n")); return FALSE;#endif#ifdef DEBUG lpWriteDebugStringFunc(TEXT("Entering ConnectDebugger\r\n"));#endif if (pCurProc->bTrustLevel != KERN_TRUST_FULL) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -