📄 pkfuncs.h
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Module Name:
pkfuncs.h
Abstract:
Private version of kfuncs.h
Notes:
--*/
#ifndef _PRIV_KFUNCS_H__
#define _PRIV_KFUNCS_H__
#include <excpt.h>
#include "toolhelp.h"
#include <winioctl.h>
#ifdef __cplusplus
extern "C" {
#endif
// @doc EXTERNAL KERNEL
// @topic Kernel Entrypoints | Kernel Entrypoints
/* function signature generation macros */
#define ARG_DW 0
#define ARG_PTR 1
#define ARG_I64 2
#define ARG_TYPE_MASK 0x03
#define ARG_TYPE_BITS 2
#define _ARG(arg, inx) (ARG_ ## arg << ARG_TYPE_BITS*inx)
#define FNSIG0() 0
#define FNSIG1(a0) _ARG(a0,0)
#define FNSIG2(a0, a1) (_ARG(a0,0)|_ARG(a1,1))
#define FNSIG3(a0, a1, a2) (_ARG(a0,0)|_ARG(a1,1)|_ARG(a2,2))
#define FNSIG4(a0, a1, a2, a3) (_ARG(a0,0)|_ARG(a1,1)|_ARG(a2,2)|_ARG(a3,3))
#define FNSIG5(a0, a1, a2, a3, a4) \
(_ARG(a0,0)|_ARG(a1,1)|_ARG(a2,2)|_ARG(a3,3)|_ARG(a4,4))
#define FNSIG6(a0, a1, a2, a3, a4, a5) \
(_ARG(a0,0)|_ARG(a1,1)|_ARG(a2,2)|_ARG(a3,3)|_ARG(a4,4)|_ARG(a5,5))
#define FNSIG7(a0, a1, a2, a3, a4, a5, a6) \
(_ARG(a0,0)|_ARG(a1,1)|_ARG(a2,2)|_ARG(a3,3)|_ARG(a4,4)|_ARG(a5,5)|_ARG(a6,6))
#define FNSIG8(a0, a1, a2, a3, a4, a5, a6, a7) \
(_ARG(a0,0)|_ARG(a1,1)|_ARG(a2,2)|_ARG(a3,3)|_ARG(a4,4)|_ARG(a5,5)|_ARG(a6,6) \
|_ARG(a7,7))
#define FNSIG9(a0, a1, a2, a3, a4, a5, a6, a7, a8) \
(_ARG(a0,0)|_ARG(a1,1)|_ARG(a2,2)|_ARG(a3,3)|_ARG(a4,4)|_ARG(a5,5)|_ARG(a6,6) \
|_ARG(a7,7)|_ARG(a8,8))
#define FNSIG10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) \
(_ARG(a0,0)|_ARG(a1,1)|_ARG(a2,2)|_ARG(a3,3)|_ARG(a4,4)|_ARG(a5,5)|_ARG(a6,6) \
|_ARG(a7,7)|_ARG(a8,8)|_ARG(a9,9))
#define FNSIG11(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
(_ARG(a0,0)|_ARG(a1,1)|_ARG(a2,2)|_ARG(a3,3)|_ARG(a4,4)|_ARG(a5,5)|_ARG(a6,6) \
|_ARG(a7,7)|_ARG(a8,8)|_ARG(a9,9)|_ARG(a10,10))
#define FNSIG12(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
(_ARG(a0,0)|_ARG(a1,1)|_ARG(a2,2)|_ARG(a3,3)|_ARG(a4,4)|_ARG(a5,5)|_ARG(a6,6) \
|_ARG(a7,7)|_ARG(a8,8)|_ARG(a9,9)|_ARG(a10,10)|_ARG(a11,11))
#define FNSIG13(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \
(_ARG(a0,0)|_ARG(a1,1)|_ARG(a2,2)|_ARG(a3,3)|_ARG(a4,4)|_ARG(a5,5)|_ARG(a6,6) \
|_ARG(a7,7)|_ARG(a8,8)|_ARG(a9,9)|_ARG(a10,10)|_ARG(a11,11)|_ARG(a12,12))
// KPage definitions
#define TH_KMODE 1
#define TH_UMODE 0
typedef struct ProcStartInfo {
LPWSTR lpszImageName;
LPWSTR lpszCmdLine;
LPPROCESS_INFORMATION lppi;
HANDLE he;
BOOL fdwCreate;
} ProcStartInfo, *LPProcStartInfo;
#define CURTLSPTR_OFFSET 0x000
#define KINFO_OFFSET 0x300
#define UCurThread() (((HANDLE *)(PUserKData+SYSHANDLE_OFFSET))[SH_CURTHREAD])
#define UTlsPtr() (*(LPDWORD *)(PUserKData+CURTLSPTR_OFFSET))
#define TLSSLOT_MSGQUEUE 0
#define TLSSLOT_RUNTIME 1
#define TLSSLOT_KERNEL 2
#define TLSSLOT_ICECAP 3
#define TLSKERN_TRYINGTODIE 0x00000001
#define TLSKERN_NOFAULT 0x00000002 // Don't break into the debugger if set
#define TLSKERN_CECAP_PROFILING 0x00000004 // CECAP is currently profiling
#define TLSKERN_IN_LOADER 0x00000008 // Holding loader critical section
#define TLSKERN_NOFAULTMSG 0x00000010 // used with TLSKERN_NOFAULT, skip the display of exception message
#define TLSSLOT_NUMRES 4 // number of reserved slots (must be in order from 0)
#define TLSSLOT_RESERVE 0x0F // bitfield - reserve low 3 slots
// We move the stack base/bound as well as Current running Fiber directly
// preceeding the TLS data so that coredll can access them and implement
// fast Fiber switching
#define PRETLS_STACKBASE -1 // stack base now moved to PRE-TLS block
#define PRETLS_STACKBOUND -2 // stack bound now moved to PRE-TLS block
#define PRETLS_CURFIBER -3 // current running fiber in PRE-TLS block
// NOTE: we only allow threads with default stack size to be converted to fiber,
// and all fibers have the stack size of the default process stack size
#define PRETLS_PROCSTKSIZE -4 // process default stack size
#define PRETLS_THRDINFO -5 // current thread's information (bit fields, only bit 0 used for now)
#define UTLS_INKMODE 0x00000001 // bit 1 set if in kmode
#define UTLS_NKCALLOUT 0x00000002 // bit 2 set if NK callout to FILESYS
// the follow 2 are only valid during PSL call
#define PRETLS_CALLERTRUST -6 // caller's trust, only valid if it's in PSL call
#define PRETLS_CALLERVMBASE -7 // caller's VM base, only valid if it's in PSL call
// how many field preceeding TLS is reserved
#define PRETLS_RESERVED 8
// macros for accessing PRETLS data
#define UStkBase() (UTlsPtr()[PRETLS_STACKBASE])
#define UStkBound() (UTlsPtr()[PRETLS_STACKBOUND])
#define UCurFiber() (UTlsPtr()[PRETLS_CURFIBER])
#define UProcStkSize() (UTlsPtr()[PRETLS_PROCSTKSIZE])
#define PSLGetCallerTrust() ((UTlsPtr()[PRETLS_THRDINFO] & UTLS_NKCALLOUT)? OEM_CERTIFY_TRUST : UTlsPtr()[PRETLS_CALLERTRUST])
#define PSLGetCallerVMBase() (UTlsPtr()[PRETLS_CALLERVMBASE])
#define IsThrdInKMode() (UTlsPtr()[PRETLS_THRDINFO] & UTLS_INKMODE)
#define TLS_PWRHDLR ((LPDWORD) 0xff) // an invalid number that is guarantee to fault
#define IsInPwrHdlr() (UTlsPtr () == TLS_PWRHDLR)
#define SECTION_MASK 0x03F
#define VA_SECTION 25
#define UnMapPtr(P) ((((DWORD)(P) & 0x80000000) && !IsSecureVa(P))? ((DWORD)(P)) : ((DWORD)(P)) & ~(SECTION_MASK<<VA_SECTION))
/* indices for for UserKInfo array in kernel data page */
#define UserKInfo ((long *)(PUserKData+KINFO_OFFSET))
#define KINX_PROCARRAY 0 /* address of process array */
#define KINX_PAGESIZE 1 /* system page size */
#define KINX_PFN_SHIFT 2 /* shift for page # in PTE */
#define KINX_PFN_MASK 3 /* mask for page # in PTE */
#define KINX_PAGEFREE 4 /* # of free physical pages */
#define KINX_SYSPAGES 5 /* # of pages used by kernel */
#define KINX_KHEAP 6 /* ptr to kernel heap array */
#define KINX_SECTIONS 7 /* ptr to SectionTable array */
#define KINX_MEMINFO 8 /* ptr to system MemoryInfo struct */
#define KINX_MODULES 9 /* ptr to module list */
#define KINX_DLL_LOW 10 /* lower bound of DLL shared space */
#define KINX_NUMPAGES 11 /* total # of RAM pages */
#define KINX_PTOC 12 /* ptr to ROM table of contents */
#define KINX_KDATA_ADDR 13 /* kernel mode version of KData */
#define KINX_GWESHEAPINFO 14 /* Current amount of gwes heap in use */
#define KINX_TIMEZONEBIAS 15 /* Fast timezone bias info */
#define KINX_PENDEVENTS 16 /* bit mask for pending interrupt events */
#define KINX_KERNRESERVE 17 /* number of kernel reserved pages */
#define KINX_API_MASK 18 /* bit mask for registered api sets */
#define KINX_NLS_CP 19 /* hiword OEM code page, loword ANSI code page */
#define KINX_NLS_SYSLOC 20 /* Default System locale */
#define KINX_NLS_USERLOC 21 /* Default User locale */
#define KINX_HEAP_WASTE 22 /* Kernel heap wasted space */
#define KINX_DEBUGGER 23 /* For use by debugger for protocol communication */
#define KINX_APISETS 24 /* APIset pointers */
#define KINX_MINPAGEFREE 25 /* water mark of the minimum number of free pages */
#define KINX_CELOGSTATUS 26 /* CeLog status flags */
#define KINX_NKSECTION 27 /* Address of NKSection */
#define KINX_PWR_EVTS 28 /* Events to be set after power on */
#define KINX_NKSIG 31 /* last entry of KINFO -- signature when NK is ready */
#define NKSIG 0x4E4B5347 /* signature "NKSG" */
/* For RegisterApiSet */
#define REGISTER_APISET_TYPE 0x80000000
typedef struct _CALLBACKINFO {
HANDLE hProc; /* destination process */
FARPROC pfn; /* function to call in dest. process */
PVOID pvArg0; /* arg0 data */
} CALLBACKINFO;
typedef CALLBACKINFO *PCALLBACKINFO;
/* Fast path for file system mapping of multiple pointers quickly */
#define SECTION_SHIFT 25 // Must be in sync with VA_SECTION in kapi.h, mem_*.h
// secure section related defs
#define SECURE_SECTION 0x61 // VM at 0xC2XXXXXX
#define SECURE_VMBASE (SECURE_SECTION << SECTION_SHIFT)
#define IsSecureVa(va) (SECURE_SECTION == ((DWORD) (va) >> SECTION_SHIFT))
#define MAX_PROCESSES 32
#define RESERVED_SECTIONS 1 // reserve section 0 for current process
#define FIRST_MAPPER_ADDRESS ((MAX_PROCESSES+RESERVED_SECTIONS) << SECTION_SHIFT)
#define LAST_MAPPER_ADDRESS 0x7E000000
#define ZeroPtrABS(P) ((((DWORD)(P) & 0x80000000) && !IsSecureVa(P)) ? \
(DWORD)(P) : ((DWORD)(P) & ((1<<SECTION_SHIFT)-1)))
#define ZeroPtr(P) ((((DWORD)(P) < (2<<SECTION_SHIFT)) || ((int) (P) >= FIRST_MAPPER_ADDRESS)) ? \
(DWORD) (P) : ZeroPtrABS(P))
#define MapPtrWithBits(Ptr, Bits) (!(Ptr) || ((DWORD)(Ptr)>>SECTION_SHIFT) ? \
(LPVOID)(Ptr) : (LPVOID)((DWORD)(Ptr)|(Bits)))
#define CECOMPRESS_ALLZEROS 0
#define CECOMPRESS_FAILED 0xffffffffUL
#define CEDECOMPRESS_FAILED 0xffffffffUL
/* Flags for SetHardwareWatch */
#define HARDWARE_WATCH_WRITE 0x1
#define HARDWARE_WATCH_READ 0x2
/* Flags for CacheSync/CacheRangeFlush */
#define CACHE_SYNC_DISCARD 0x001 /* write back & discard all cached data */
#define CACHE_SYNC_INSTRUCTIONS 0x002 /* discard all cached instructions */
#define CACHE_SYNC_WRITEBACK 0x004 /* write back but don't discard data cache*/
#define CACHE_SYNC_FLUSH_I_TLB 0x008 /* flush I-TLB */
#define CACHE_SYNC_FLUSH_D_TLB 0x010 /* flush D-TLB */
#define CACHE_SYNC_FLUSH_TLB (CACHE_SYNC_FLUSH_I_TLB|CACHE_SYNC_FLUSH_D_TLB) /* flush all TLB */
#define CACHE_SYNC_L2_WRITEBACK 0x020 /* write-back L2 Cache */
#define CACHE_SYNC_L2_DISCARD 0x040 /* discard L2 Cache */
#define CACHE_SYNC_ALL 0x07F /* sync and discard everything in Cache/TLB */
// Print flags for resource tracking
#define PRINT_ALL (DWORD)0x00000100
#define PRINT_RECENT (DWORD)0x00000200
#define PRINT_DETAILS (DWORD)0x00000400
#define PRINT_TRACE (DWORD)0x00000800
#define PRINT_FILTERTYPE (DWORD)0x00001000
#define PRINT_FILTERPROCID (DWORD)0x00002000
#define PRINT_FILTERHANDLE (DWORD)0x00004000
#define PRINT_SETCHECKPOINT (DWORD)0x00008000
// Filter flags for resource tracking
#define FILTER_TYPEDEFAULTON 0x00000001
#define FILTER_TYPEDEFAULTOFF 0x00000002
#define FILTER_TYPEON 0x00000004
#define FILTER_TYPEOFF 0x00000008
#define FILTER_PROCDEFAULTOFF 0x00000020 // not yet supported
#define FILTER_PROCIDON 0x00000040
#define FILTER_PROCIDOFF 0x00000080 // not yet supported
// special flag for CreateFileMapping
#define PAGE_INTERNALDBMAPPING 0x20000000
// Flags for physical memory types. Used by IOCTL_QUERY_PHYSICALMEM
#define PHYSICAL_ROM (DWORD)0x00000001
#define PHYSICAL_RAM (DWORD)0x00000002
#define PHYSICAL_IO (DWORD)0x00000004
#define PHYSICAL_UNKNOWN (DWORD)0x00000008
// Flags for processor info used by IOCTL_PROCESSOR_INFORMATION
#define PROCESSOR_FLOATINGPOINT (DWORD)0x00000001
#define PROCESSOR_DSP (DWORD)0x00000002
#define PROCESSOR_16BITINSTRUCTION (DWORD)0x00000004
// Kernel IOCTLs based on FILE_DEVICE_HAL -- last ID used is 67
// Note that function codes 0-2047 are reserved for Microsoft Corporation, and
// 2048-4095 are reserved for customers..
// Internal product teams are currently using values in the range of 1000-1100
#define IOCTL_HAL_GET_DEVICE_INFO CTL_CODE(FILE_DEVICE_HAL, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_GET_IP_ADDR CTL_CODE(FILE_DEVICE_HAL, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_RADIO_CNTRL CTL_CODE(FILE_DEVICE_HAL, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_DDK_CALL CTL_CODE(FILE_DEVICE_HAL, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_EDBG_REGISTER_CLIENT CTL_CODE(FILE_DEVICE_HAL, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_EDBG_DEREGISTER_CLIENT CTL_CODE(FILE_DEVICE_HAL, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_EDBG_REGISTER_DFLT_CLIENT CTL_CODE(FILE_DEVICE_HAL, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_EDBG_SEND CTL_CODE(FILE_DEVICE_HAL, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_EDBG_RECV CTL_CODE(FILE_DEVICE_HAL, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_EDBG_SET_DEBUG CTL_CODE(FILE_DEVICE_HAL,11, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SET_KERNEL_COMM_DEV CTL_CODE(FILE_DEVICE_HAL, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_GET_UUID CTL_CODE(FILE_DEVICE_HAL, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_INIT_RTC CTL_CODE(FILE_DEVICE_HAL, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SET_KERNEL_DEV_PORT CTL_CODE(FILE_DEVICE_HAL, 17, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_TRANSLATE_IRQ CTL_CODE(FILE_DEVICE_HAL, 18, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_GET_RIO_INFO CTL_CODE(FILE_DEVICE_HAL, 19, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_ILTIMING CTL_CODE(FILE_DEVICE_HAL, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_GET_DEVICEID CTL_CODE(FILE_DEVICE_HAL, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_PROFILE CTL_CODE(FILE_DEVICE_HAL, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_SET_DEVICE_INFO CTL_CODE(FILE_DEVICE_HAL, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_QUERY_PHYSICALMEM CTL_CODE(FILE_DEVICE_HAL, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_PROCESSOR_INFORMATION CTL_CODE(FILE_DEVICE_HAL, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_GETREGSECUREKEYS CTL_CODE(FILE_DEVICE_HAL, 35, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_REQUEST_IRQ CTL_CODE(FILE_DEVICE_HAL, 36, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_REQUEST_SYSINTR CTL_CODE(FILE_DEVICE_HAL, 38, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_RELEASE_SYSINTR CTL_CODE(FILE_DEVICE_HAL, 54, METHOD_BUFFERED, FILE_ANY_ACCESS)
// IOCTL to get KITL transport info
#define IOCTL_KITL_GET_INFO CTL_CODE(FILE_DEVICE_HAL, 37, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_ENABLE_WAKE CTL_CODE(FILE_DEVICE_HAL, 40, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_DISABLE_WAKE CTL_CODE(FILE_DEVICE_HAL, 41, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_GET_WAKE_SOURCE CTL_CODE(FILE_DEVICE_HAL, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_AUTOWAKEUP CTL_CODE(FILE_DEVICE_HAL, 43, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_PRESUSPEND CTL_CODE(FILE_DEVICE_HAL, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
// IOCTL to tell OEM to initialize registry on boot
#define IOCTL_HAL_INITREGISTRY CTL_CODE(FILE_DEVICE_HAL, 44, METHOD_BUFFERED, FILE_ANY_ACCESS)
// IOCTL to give OEM a more full-featured init when the kernel is ready to go
// and before any apps are started
#define IOCTL_HAL_POSTINIT CTL_CODE(FILE_DEVICE_HAL, 45, METHOD_BUFFERED, FILE_ANY_ACCESS)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -