352 lines
7.6 KiB
C
352 lines
7.6 KiB
C
#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
|