📄 pkfuncs.h
字号:
#define PHYSICAL_ADDRESS_UNKNOWN ((LPVOID) -1)
_inline BOOL CeSetMemoryAttributes (LPVOID pVirtualAddr, LPVOID pShiftedPhysAddr, DWORD cbSize, DWORD dwAttributes)
{
return KernelLibIoControl ((HANDLE) KMOD_CORE, IOCTL_KLIB_SETMEMORYATTR,
pVirtualAddr, cbSize, pShiftedPhysAddr, dwAttributes, NULL);
}
typedef struct _PROCVMINFO {
HANDLE hProc; // process id
DWORD cbRwMemUsed; // RW RAM used
} PROCVMINFO, *PPROCVMINFO;
_inline BOOL CeGetProcVMInfo (int idxProc, DWORD cbSize, PROCVMINFO *pInfo)
{
return KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_GETPROCMEMINFO, NULL, idxProc, pInfo, cbSize, NULL);
}
// Dr. Watson kernel support
extern DWORD dwNKDrWatsonSize; // Must set this in OEMInit() to enable Kernel Watson support
// must be multiple of PAGE_SIZE
_inline DWORD DrWatsonGetSize (void)
{
return KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_GETWATSONSIZE, NULL, 0, NULL, 0, NULL);
}
_inline BOOL DrWatsonFlush (void)
{
return KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_FLUSHWATSON, NULL, 0, NULL, 0, NULL);
}
_inline BOOL DrWatsonClear (void)
{
return KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_CLEARWATSON, NULL, 0, NULL, 0, NULL);
}
_inline DWORD DrWatsonWriteData (DWORD dwOffset, LPVOID pData, DWORD cbSize)
{
return KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_WRITEWATSON, pData, cbSize, NULL, dwOffset, NULL);
}
_inline DWORD DrWatsonReadData (DWORD dwOffset, LPVOID pData, DWORD cbSize)
{
return KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_READWATSON, NULL, dwOffset, pData, cbSize, NULL);
}
// changing JIT Debugger path
_inline BOOL SetJITDebuggerPath (LPCWSTR pszDbgrPath)
{
return KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_SETJITDBGRPATH, (LPVOID) pszDbgrPath, 0, NULL, 0, NULL);
}
//
// Watchdog timer support
//
typedef struct _WDAPIStruct {
LPCVOID watchdog; // name (in create/open) or handle (in other) of the watchdog
DWORD dwPeriod; // watchdog period
DWORD dwWait; // wait time before default action taken
DWORD dwDfltAction; // default action
DWORD dwParam; // param passed to IOCTL_HAL_REBOOT if reset is the default action
DWORD dwFlags; // flags
} WDAPIStruct, *PWDAPIStruct;
typedef const WDAPIStruct *PCWDAPIStruct;
//
// watchdog default actions
//
#define WDOG_NO_DFLT_ACTION 0
#define WDOG_KILL_PROCESS 1
#define WDOG_RESET_DEVICE 2
#define WD_TOTAL_DFLT_ACTION 3
//
// watchdog APIs
//
#define WDAPI_CREATE 0
#define WDAPI_OPEN 1
#define WDAPI_START 2
#define WDAPI_STOP 3
#define WDAPI_REFRESH 4
_inline HANDLE CreateWatchDogTimer (
LPCWSTR pszWatchDogName,
DWORD dwPeriod,
DWORD dwWait,
DWORD dwDfltAction,
DWORD dwParam,
DWORD dwFlags)
{
WDAPIStruct wdas = { pszWatchDogName, dwPeriod, dwWait, dwDfltAction, dwParam, dwFlags };
return (HANDLE) KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_WDOGAPI, &wdas, sizeof(wdas),
NULL, WDAPI_CREATE, NULL);
}
_inline HANDLE OpenWatchDogTimer (LPCWSTR pszWatchDogName, DWORD dwFlags)
{
WDAPIStruct wdas = { pszWatchDogName, 0, 0, 0, 0, dwFlags };
return (HANDLE) KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_WDOGAPI, &wdas, sizeof(wdas),
NULL, WDAPI_OPEN, NULL);
}
_inline BOOL StartWatchDogTimer (HANDLE hWatchDog, DWORD dwFlags)
{
WDAPIStruct wdas = { hWatchDog, 0, 0, 0, 0, dwFlags };
return KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_WDOGAPI, &wdas, sizeof(wdas),
NULL, WDAPI_START, NULL);
}
_inline BOOL StopWatchDogTimer (HANDLE hWatchDog, DWORD dwFlags)
{
WDAPIStruct wdas = { hWatchDog, 0, 0, 0, 0, dwFlags };
return KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_WDOGAPI, &wdas, sizeof(wdas),
NULL, WDAPI_STOP, NULL);
}
_inline BOOL RefreshWatchDogTimer (HANDLE hWatchDog, DWORD dwFlags)
{
WDAPIStruct wdas = { hWatchDog, 0, 0, 0, 0, dwFlags };
return KernelLibIoControl((HANDLE) KMOD_CORE, IOCTL_KLIB_WDOGAPI, &wdas, sizeof(wdas),
NULL, WDAPI_REFRESH, NULL);
}
void NotifyForceCleanboot(void);
void DumpKCallProfile(DWORD bReset);
int QueryAPISetID(char *pName);
FARPROC GetAPIAddress(int setId, int iMethod);
// @CESYSGEN IF !REMOVE_DRAGON
BOOL SetStdioPathW(DWORD id, LPCWSTR pwszPath);
BOOL GetStdioPathW(DWORD id, PWSTR pwszBuf, LPDWORD lpdwLen);
// @CESYSGEN ENDIF
DWORD ReadRegistryFromOEM(DWORD dwFlags, LPBYTE pBuf, DWORD len);
BOOL WriteRegistryToOEM(DWORD dwFlags, LPBYTE pBuf, DWORD len);
BOOL FlushViewOfFileMaybe(LPCVOID lpBaseAddress, DWORD dwNumberOfBytesToFlush);
BOOL IsProcessDying(void);
void PSLNotify(DWORD flags, DWORD proc, DWORD thread);
HANDLE CreateKernelThread(LPTHREAD_START_ROUTINE lpStartAddr,
LPVOID lpvThreadParm, WORD prio, DWORD dwFlags);
// OEM entry point
#define NKCreateKernelThread CreateKernelThread
// To force a clean boot (OEM entry point)
void NKForceCleanBoot (void);
//------------------------------------------------------------------------------
// Limited registry access from OAL during IOCTL_HAL_INITREGISTRY
//------------------------------------------------------------------------------
// These definitions are equivalent to the Win32 APIs
#ifndef REGSAM
typedef DWORD REGSAM;
#endif
LONG NKRegCreateKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD Reserved,
LPWSTR lpClass, DWORD dwOptions, REGSAM samDesired,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult, LPDWORD lpdwDisposition);
LONG NKRegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions,
REGSAM samDesired, PHKEY phkResult);
LONG NKRegCloseKey(HKEY hKey);
LONG NKRegQueryValueExW(HKEY hKey, LPCWSTR lpValueName, LPDWORD lpReserved,
LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);
LONG NKRegSetValueExW(HKEY hKey, LPCWSTR lpValueName, DWORD dwReserved,
DWORD dwType, LPBYTE lpData, DWORD cbData);
// Unicode only
#define NKRegCreateKeyEx NKRegCreateKeyExW
#define NKRegOpenKeyEx NKRegOpenKeyExW
#define NKRegQueryValueEx NKRegQueryValueExW
#define NKRegSetValueEx NKRegSetValueExW
//------------------------------------------------------------------------------
#pragma warning(disable:4200) // nonstandard extensions warning
// Definitions used with GetCallstackSnapshot
#define STACKSNAP_FAIL_IF_INCOMPLETE 1
#define STACKSNAP_EXTENDED_INFO 2
#define STACKSNAP_INPROC_ONLY 4 // Capture only the base part of the stack within
// the thread's owner proc, no PSL transitions
#define STACKSNAP_RETURN_FRAMES_ON_ERROR 8 // Return number of frames found, even if error occurs. SetLastError will be set.
typedef struct _CallSnapshot {
DWORD dwReturnAddr;
} CallSnapshot;
typedef struct _CallSnapshotEx {
DWORD dwReturnAddr;
DWORD dwFramePtr;
DWORD dwCurProc;
DWORD dwParams[4];
} CallSnapshotEx;
typedef struct _StackSnapshot {
WORD wVersion; // Version of this structure: Set to 1
WORD wNumCalls; // Number of calls in this stack snapshot
CallSnapshot rgCalls[0]; // Followed by an array of function calls
} StackSnapshot;
#pragma warning(default:4200) // nonstandard extensions warning
ULONG GetCallStackSnapshot (ULONG dwMaxFrames, CallSnapshot lpFrames[], DWORD dwFlags, DWORD dwSkip);
ULONG GetThreadCallStack (HANDLE hThrd, ULONG dwMaxFrames, LPVOID lpFrames, DWORD dwFlags, DWORD dwSkip);
_inline DWORD KLibGetLastExcpCallStack (DWORD dwMaxFrame, CallSnapshot lpFrames [])
{
return KernelLibIoControl ((HANDLE) KMOD_CORE, IOCTL_KLIB_JITGETCALLSTACK, 0, 0, lpFrames, dwMaxFrame, 0);
}
// The following are used to support KDHAL
//++++++++++++++++++++++++++++++++++
BOOL OEMKDIoControl( DWORD dwIoControlCode, LPVOID lpBuf, DWORD nBufSize);
typedef BOOL (*PFN_OEMKDIoControl)( DWORD dwIoControlCode, LPVOID lpBuf, DWORD nBufSize);
extern PFN_OEMKDIoControl pKDIoControl;
#define KD_IOCTL_INIT 0x00000000
#define KD_IOCTL_SET_CBP 0x00000001
#define KD_IOCTL_CLEAR_CBP 0x00000002
#define KD_IOCTL_QUERY_CBP 0x00000003
#define KD_IOCTL_ENUM_CBP 0x00000004
#define KD_IOCTL_SET_DBP 0x00000010
#define KD_IOCTL_CLEAR_DBP 0x00000011
#define KD_IOCTL_QUERY_DBP 0x00000012
#define KD_IOCTL_ENUM_DBP 0x00000013
#define KD_IOCTL_MAP_EXCEPTION 0x00000020
#define KD_IOCTL_RESET 0x00000030
#define KD_IOCTL_JIT_NOTIF 0x00000040
#define KD_IOCTL_DMPGEN_START 0x00000050 // Start of Error Report dump generation, lpBuf = NULL, nBufSize=Size of reserved memory
#define KD_IOCTL_DMPGEN_END 0x00000051 // End of Error Report dump generation, lpBuf = NULL, nBufSize=HRESULT of dump gen (S_OK for success)
#define KD_IOCTL_MEMORY_INACCESSIBLE 0x00000060 // Indicate memory inaccessible, lpBuf=Address, return TRUE if debugger should not read or write address
//max size for save/restore CoProc registers
#define MAX_COPROCREGSIZE 512
typedef struct _KD_BPINFO{
int nVersion;
ULONG ulFlags;
ULONG ulAddress;
ULONG ulHandle;
ULONG ulCount;
} KD_BPINFO, *PKD_BPINFO;
typedef struct _KD_EXCEPTION_INFO {
int nVersion;
ULONG ulFlags;
ULONG ulAddress;
ULONG ulExceptionCode;
} KD_EXCEPTION_INFO, *PKD_EXCEPTION_INFO;
//++++++++++++++++++++++++++++++++++
#ifdef ARM
#define PAGE_ARM_MINICACHE 0x800
#endif
#ifdef x86
#define PAGE_x86_WRITETHRU 0x40000000
#endif
#ifdef x86
// Processor feature flags returned by x86 CPUID instruction
#define CPUID_PBE (1 << 31)
#define CPUID_IA64 (1 << 30)
#define CPUID_TM (1 << 29)
#define CPUID_HTT (1 << 28)
#define CPUID_SS (1 << 27)
#define CPUID_SSE2 (1 << 26)
#define CPUID_SSE (1 << 25)
#define CPUID_FXSR (1 << 24)
#define CPUID_MMX (1 << 23)
#define CPUID_ACPI (1 << 22)
#define CPUID_DTES (1 << 21)
#define CPUID_BIT20RESERVED (1 << 20)
#define CPUID_CLFL (1 << 19)
#define CPUID_PSN (1 << 18)
#define CPUID_PSE36 (1 << 17)
#define CPUID_PAT (1 << 16)
#define CPUID_CMOV (1 << 15)
#define CPUID_MCA (1 << 14)
#define CPUID_PGE (1 << 13)
#define CPUID_MTRR (1 << 12)
#define CPUID_SEP (1 << 11)
#define CPUID_BIT10RESERVED (1 << 10)
#define CPUID_APIC (1 << 9)
#define CPUID_CX8 (1 << 8)
#define CPUID_MCE (1 << 7)
#define CPUID_PAE (1 << 6)
#define CPUID_MSR (1 << 5)
#define CPUID_TSC (1 << 4)
#define CPUID_PSE (1 << 3)
#define CPUID_DE (1 << 2)
#define CPUID_VME (1 << 1)
#define CPUID_FPU (1 << 0)
#endif // x86
#ifdef __cplusplus
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -