📄 pkfuncs.h
字号:
DWORD dwL2ICacheSize; // total size in bytes, 0 means no L2 ICache
DWORD dwL2ICacheLineSize; // line size in bytes
DWORD dwL2ICacheNumWays; // number of ways, 1 for direct mapped
DWORD dwL2DCacheSize; // total size in bytes, 0 means no L2 DCache
DWORD dwL2DCacheLineSize; // line size in bytes
DWORD dwL2DCacheNumWays; // number of ways, 1 for direct mapped
} CacheInfo, *PCacheInfo;
// cache info flags (applied to both L1 and L2
#define CF_UNIFIED 0x01 // I and D caches unified, use ICache info fields
#define CF_WRITETHROUGH 0x02 // writeback if not set
#define CF_COHERENT 0x04 // no cache flush operations necessary
//
// CeGetCacheInfo: Get cache information
// Parameters:
// cbSize: must be sizeof(CacheInfo)
// pCacheInfo: pointer to CachInfo struct to receive the cache infomation
// Return Value:
// TRUE if success, FALSE if failed (if OEM didn't implement the function
//
_inline BOOL CeGetCacheInfo (DWORD cbSize, PCacheInfo pCacheInfo)
{
return KernelIoControl (IOCTL_HAL_GET_CACHE_INFO, 0, 0, pCacheInfo, cbSize, 0);
}
// CeLog status flags
#define CELOGSTATUS_DISABLED 0x0
#define CELOGSTATUS_ENABLED_GENERAL 0x1
#define CELOGSTATUS_ENABLED_PROFILE 0x2
// Is CeLog loaded and ready for use.
#define IsCeLogLoaded() ((UserKInfo[KINX_CELOGSTATUS] & (CELOGSTATUS_ENABLED_GENERAL | CELOGSTATUS_ENABLED_PROFILE)) != 0)
// Is CeLog enabled for general logging. This macro returns FALSE when CeLog
// is in profile-only mode.
#define IsCeLogEnabled() ((UserKInfo[KINX_CELOGSTATUS] & CELOGSTATUS_ENABLED_GENERAL) != 0)
// Is CeLog enabled for profiling logging. Currently profiling is always
// enabled if CeLog is loaded.
#define IsCeLogProfilingEnabled() IsCeLogLoaded()
// Is CeLog enabled for kernel logging. Identifies kernel cases that currently
// are always enabled whenever CeLog is loaded but may not be in the future.
#define IsCeLogKernelEnabled() IsCeLogLoaded()
// Function pointers provided by CeLog for the kernel to use. Registered with
// IOCTL_CELOG_REGISTER.
typedef struct _CeLogExportTable {
DWORD dwVersion; // Version of this structure, set to 2
PFNVOID pfnCeLogData;
PFNVOID pfnCeLogInterrupt;
PFNVOID pfnCeLogSetZones;
FARPROC pfnCeLogQueryZones; // Receives CeLogGetZones calls, minus last param
DWORD dwCeLogTimerFrequency; // Less than or equal to QueryPerformanceFrequency()
} CeLogExportTable;
// Used with IOCTL_KLIB_CHANGEMAPFLUSHING
typedef struct _MapFlushInfo {
LPCVOID lpBaseAddress;
DWORD dwFlags;
} MapFlushInfo;
#define FILEMAP_NORMAL 0 // Default
#define FILEMAP_NOBACKGROUNDFLUSH 1 // Turn off background flushing
//
// KernelLibIoControl definitions
//
// Predefined Kernel Module numbers
#define KMOD_INVALID 0
#define KMOD_CORE 1
#define KMOD_DBG 2 // Debugger specific extensions
#define KMOD_CELOG 3
#define KMOD_VERIFIER 4
#define KMOD_OAL 5 // Pass through to OEMIoControl
#define KMOD_MAX 5
// Kernel reserves the control code from 0-255
#define IOCTL_KLIB_ALLOCSHAREMEM 0
#define IOCTL_KLIB_FREESHAREMEM 1
#define IOCTL_KLIB_GETROMCHAIN 2
#define IOCTL_KLIB_GETCOMPRESSIONINFO 3
#define IOCTL_KLIB_CHANGEMAPFLUSHING 4 // Change flush settings for mapped view of a file
#define IOCTL_KLIB_GETALARMRESOLUTION 5 // Retrieves NKAlarmResolutionMSec from the kernel
#define IOCTL_KLIB_ISKDPRESENT 6 // Returns TRUE if KD is pressent FALSE otherwise
#define IOCTL_KLIB_SETROMDLLBASE 7 // called from filesys only, for loading externel MODULE to slot1
#define IOCTL_KLIB_GETPROCMEMINFO 8 // get per-process id and r/w memory usage
#define IOCTL_KLIB_GETCALLSTACK 9 // get callstack of of current thread with context information
#define IOCTL_KLIB_JITGETCALLSTACK 10 // get the last call stack of the thread that have an un-handled exception
#define IOCTL_KLIB_SETIGNORENOFAULT 11 // enable/disable no-fault so that one can choose to break into debugger on threads with nofault set
#define IOCTL_KLIB_SETMEMORYATTR 12 // CeSetMemoryAttributes
#define IOCTL_KLIB_USER 256 // where OEM defined IOCTL starts.
// Debugger IOCTLs are separate from the rest of the kernel
#define IOCTL_DBG_INIT 0
// CeLog IOCTLs are separate from the rest of the kernel
#define IOCTL_CELOG_IMPORT 0
#define IOCTL_CELOG_REGISTER 1
#define IOCTL_CELOG_GETDESKTOPZONE 2
// Verifier IOCTLs are separate from the rest of the kernel
#define IOCTL_VERIFIER_IMPORT 0
#define IOCTL_VERIFIER_REGISTER 1
BOOL KernelLibIoControl(HANDLE hLib, DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned);
// Interface from OAL (inside kernel)
LPVOID NKCreateStaticMapping(DWORD dwPhysBase, DWORD dwSize);
// Interface from user-mode applications (kernel trap)
LPVOID CreateStaticMapping(DWORD dwPhysBase, DWORD dwSize);
#ifdef ARM
PFNVOID NKSetDataAbortHandler(PFNVOID pfnDataAbortHandler);
#endif
LPVOID MapCallerPtr (LPVOID ptr, DWORD dwLen);
LPVOID MapPtrToProcWithSize (LPVOID ptr, DWORD dwLen, HANDLE hProc);
// allocating shared memory for ISR/IST memory sharing
_inline BOOL KLibAllocShareMem (DWORD nPages, BOOL fNoCache, LPVOID *pVa, LPVOID *pPa)
{
return KernelLibIoControl ((HANDLE) KMOD_CORE, IOCTL_KLIB_ALLOCSHAREMEM,
pVa, nPages, pPa, fNoCache, NULL);
}
_inline BOOL KLibFreeShareMem (DWORD nPages, LPVOID pVa, LPVOID pPa)
{
return KernelLibIoControl ((HANDLE) KMOD_CORE, IOCTL_KLIB_FREESHAREMEM,
pVa, nPages, pPa, 0, NULL);
}
_inline LPVOID KLibGetROMChain (void)
{
return (LPVOID) KernelLibIoControl ((HANDLE) KMOD_CORE, IOCTL_KLIB_GETROMCHAIN, 0, 0, 0, 0, 0);
}
_inline void KLibSetIgnoreNoFault (BOOL fIgnore)
{
KernelLibIoControl ((HANDLE) KMOD_CORE, IOCTL_KLIB_SETIGNORENOFAULT, 0, fIgnore, 0, 0, 0);
}
//
// Use KLibIoControl to implement CeSetMemoryAttributes
//
#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);
}
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
typedef struct _CallSnapshot {
DWORD dwReturnAddr;
} CallSnapshot;
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);
_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_MEMORY_INACCESSIBLE 0x00000050
//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 + -