#ifndef NTFILL_H #define NTFILL_H extern ULONG KphDynNtVersion; extern ULONG KphDynObDecodeShift; extern ULONG KphDynObAttributesShift; // EX typedef struct _EX_PUSH_LOCK_WAIT_BLOCK *PEX_PUSH_LOCK_WAIT_BLOCK; NTKERNELAPI VOID FASTCALL ExfUnblockPushLock( __inout PEX_PUSH_LOCK PushLock, __inout_opt PEX_PUSH_LOCK_WAIT_BLOCK WaitBlock ); typedef struct _HANDLE_TABLE_ENTRY { union { PVOID Object; ULONG ObAttributes; ULONG_PTR Value; }; union { ACCESS_MASK GrantedAccess; LONG NextFreeTableEntry; }; } HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY; typedef struct _HANDLE_TABLE HANDLE_TABLE, *PHANDLE_TABLE; typedef BOOLEAN (NTAPI *PEX_ENUM_HANDLE_CALLBACK_61)( __inout PHANDLE_TABLE_ENTRY HandleTableEntry, __in HANDLE Handle, __in PVOID Context ); // since WIN8 typedef BOOLEAN (NTAPI *PEX_ENUM_HANDLE_CALLBACK)( __in PHANDLE_TABLE HandleTable, __inout PHANDLE_TABLE_ENTRY HandleTableEntry, __in HANDLE Handle, __in PVOID Context ); NTKERNELAPI BOOLEAN NTAPI ExEnumHandleTable( __in PHANDLE_TABLE HandleTable, __in PEX_ENUM_HANDLE_CALLBACK EnumHandleProcedure, __inout PVOID Context, __out_opt PHANDLE Handle ); NTSYSCALLAPI NTSTATUS NTAPI ZwQuerySystemInformation( __in SYSTEM_INFORMATION_CLASS SystemInformationClass, __out_bcount_opt(SystemInformationLength) PVOID SystemInformation, __in ULONG SystemInformationLength, __out_opt PULONG ReturnLength ); // IO extern POBJECT_TYPE *IoDriverObjectType; // KE typedef enum _KAPC_ENVIRONMENT { OriginalApcEnvironment, AttachedApcEnvironment, CurrentApcEnvironment, InsertApcEnvironment } KAPC_ENVIRONMENT, *PKAPC_ENVIRONMENT; typedef VOID (NTAPI *PKNORMAL_ROUTINE)( __in PVOID NormalContext, __in PVOID SystemArgument1, __in PVOID SystemArgument2 ); typedef VOID KKERNEL_ROUTINE( __in PRKAPC Apc, __inout PKNORMAL_ROUTINE *NormalRoutine, __inout PVOID *NormalContext, __inout PVOID *SystemArgument1, __inout PVOID *SystemArgument2 ); typedef KKERNEL_ROUTINE (NTAPI *PKKERNEL_ROUTINE); typedef VOID (NTAPI *PKRUNDOWN_ROUTINE)( __in PRKAPC Apc ); NTKERNELAPI VOID NTAPI KeInitializeApc( __out PRKAPC Apc, __in PRKTHREAD Thread, __in KAPC_ENVIRONMENT Environment, __in PKKERNEL_ROUTINE KernelRoutine, __in_opt PKRUNDOWN_ROUTINE RundownRoutine, __in_opt PKNORMAL_ROUTINE NormalRoutine, __in_opt KPROCESSOR_MODE ProcessorMode, __in_opt PVOID NormalContext ); NTKERNELAPI BOOLEAN NTAPI KeInsertQueueApc( __inout PRKAPC Apc, __in_opt PVOID SystemArgument1, __in_opt PVOID SystemArgument2, __in KPRIORITY Increment ); // MM NTSYSCALLAPI NTSTATUS NTAPI ZwQueryVirtualMemory( __in HANDLE ProcessHandle, __in PVOID BaseAddress, __in MEMORY_INFORMATION_CLASS MemoryInformationClass, __out_bcount(MemoryInformationLength) PVOID MemoryInformation, __in SIZE_T MemoryInformationLength, __out_opt PSIZE_T ReturnLength ); // OB // These definitions are no longer correct, but they produce correct results. #define OBJ_PROTECT_CLOSE 0x00000001 #define OBJ_HANDLE_ATTRIBUTES (OBJ_PROTECT_CLOSE | OBJ_INHERIT | OBJ_AUDIT_OBJECT_CLOSE) // This attribute is now stored in the GrantedAccess field. #define ObpAccessProtectCloseBit 0x2000000 #define ObpDecodeGrantedAccess(Access) \ ((Access) & ~ObpAccessProtectCloseBit) FORCEINLINE PVOID ObpDecodeObject(PVOID Object) { #ifdef _M_X64 if (KphDynNtVersion >= PHNT_WIN8) { if (KphDynObDecodeShift != -1) return (PVOID)(((LONG_PTR)Object >> KphDynObDecodeShift) & ~(ULONG_PTR)0xf); else return NULL; } else { return (PVOID)((ULONG_PTR)Object & ~OBJ_HANDLE_ATTRIBUTES); } #else return (PVOID)((ULONG_PTR)Object & ~OBJ_HANDLE_ATTRIBUTES); #endif } FORCEINLINE ULONG ObpGetHandleAttributes(PHANDLE_TABLE_ENTRY HandleTableEntry) { #ifdef _M_X64 if (KphDynNtVersion >= PHNT_WIN8) { if (KphDynObAttributesShift != -1) return (ULONG)(HandleTableEntry->Value >> KphDynObAttributesShift) & 0x3; else return 0; } else { return (HandleTableEntry->ObAttributes & (OBJ_INHERIT | OBJ_AUDIT_OBJECT_CLOSE)) | ((HandleTableEntry->GrantedAccess & ObpAccessProtectCloseBit) ? OBJ_PROTECT_CLOSE : 0); } #else return (HandleTableEntry->ObAttributes & (OBJ_INHERIT | OBJ_AUDIT_OBJECT_CLOSE)) | ((HandleTableEntry->GrantedAccess & ObpAccessProtectCloseBit) ? OBJ_PROTECT_CLOSE : 0); #endif } typedef struct _OBJECT_CREATE_INFORMATION OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION; // This is incorrect as of Windows 8.1, but the size of the structure is still correct. typedef struct _OBJECT_HEADER { LONG PointerCount; union { LONG HandleCount; PVOID NextToFree; }; POBJECT_TYPE Type; UCHAR NameInfoOffset; UCHAR HandleInfoOffset; UCHAR QuotaInfoOffset; UCHAR Flags; union { POBJECT_CREATE_INFORMATION ObjectCreateInfo; PVOID QuotaBlockCharged; }; PVOID SecurityDescriptor; QUAD Body; } OBJECT_HEADER, *POBJECT_HEADER; #define OBJECT_TO_OBJECT_HEADER(Object) CONTAINING_RECORD((Object), OBJECT_HEADER, Body) NTKERNELAPI POBJECT_TYPE NTAPI ObGetObjectType( __in PVOID Object ); NTKERNELAPI NTSTATUS NTAPI ObOpenObjectByName( __in POBJECT_ATTRIBUTES ObjectAttributes, __in POBJECT_TYPE ObjectType, __in KPROCESSOR_MODE PreviousMode, __in_opt PACCESS_STATE AccessState, __in_opt ACCESS_MASK DesiredAccess, __in PVOID ParseContext, __out PHANDLE Handle ); NTKERNELAPI NTSTATUS NTAPI ObSetHandleAttributes( __in HANDLE Handle, __in POBJECT_HANDLE_FLAG_INFORMATION HandleFlags, __in KPROCESSOR_MODE PreviousMode ); NTKERNELAPI NTSTATUS ObCloseHandle( __in HANDLE Handle, __in KPROCESSOR_MODE PreviousMode ); // PS NTSYSCALLAPI NTSTATUS NTAPI ZwQueryInformationProcess( __in HANDLE ProcessHandle, __in PROCESSINFOCLASS ProcessInformationClass, __out_bcount(ProcessInformationLength) PVOID ProcessInformation, __in ULONG ProcessInformationLength, __out_opt PULONG ReturnLength ); NTSYSCALLAPI NTSTATUS NTAPI ZwSetInformationProcess( __in HANDLE ProcessHandle, __in PROCESSINFOCLASS ProcessInformationClass, __in_bcount(ProcessInformationLength) PVOID ProcessInformation, __in ULONG ProcessInformationLength ); NTSYSCALLAPI NTSTATUS NTAPI ZwQueryInformationThread( __in HANDLE ThreadHandle, __in THREADINFOCLASS ThreadInformationClass, __out_bcount(ThreadInformationLength) PVOID ThreadInformation, __in ULONG ThreadInformationLength, __out_opt PULONG ReturnLength ); NTKERNELAPI NTSTATUS NTAPI PsLookupProcessThreadByCid( __in PCLIENT_ID ClientId, __out_opt PEPROCESS *Process, __out PETHREAD *Thread ); NTKERNELAPI PVOID NTAPI PsGetThreadWin32Thread( __in PETHREAD Thread ); typedef struct _EJOB *PEJOB; extern POBJECT_TYPE *PsJobType; NTKERNELAPI PEJOB NTAPI PsGetProcessJob( __in PEPROCESS Process ); NTKERNELAPI NTSTATUS NTAPI PsAcquireProcessExitSynchronization( __in PEPROCESS Process ); NTKERNELAPI VOID NTAPI PsReleaseProcessExitSynchronization( __in PEPROCESS Process ); // RTL // Sensible limit that may or may not correspond to the actual Windows value. #define MAX_STACK_DEPTH 256 #define RTL_WALK_USER_MODE_STACK 0x00000001 #define RTL_WALK_VALID_FLAGS 0x00000001 NTSYSAPI ULONG NTAPI RtlWalkFrameChain( __out PVOID *Callers, __in ULONG Count, __in ULONG Flags ); #endif