/*++ Copyright (c) 2024, Quinn Stephens. Provided under the BSD 3-Clause license. Module Name: ntdef.h Abstract: Provides basic NT definitions. --*/ #ifndef _NTDEF_H #define _NTDEF_H #include #ifndef IN #define IN #endif #ifndef OUT #define OUT #endif #ifndef OPTIONAL #define OPTIONAL #endif #ifndef VOID #define VOID void #endif #ifndef CONST #define CONST const #endif #ifndef ANYSIZE_ARRAY #define ANYSIZE_ARRAY 1 #endif #ifndef NULL #if defined(__cplusplus) #define NULL 0 #else #define NULL ((VOID *)0) #endif #endif #ifndef FORCEINLINE #if defined(_MSC_EXTENSIONS) #define FORCEINLINE __forceinline #else #define FORCEINLINE static inline #endif #endif #ifndef FASTCALL #if defined(_M_IX86) #define FASTCALL __fastcall #else #define FASTCALL #endif #endif #ifndef NTAPI #if !defined(_M_AMD64) #define NTAPI __stdcall #else #define NTAPI #endif #endif // // Basic types. // typedef char CHAR; typedef short SHORT; typedef long LONG; typedef unsigned char UCHAR; typedef unsigned short USHORT; typedef unsigned long ULONG; // // Minimum/maximum values of basic types. // #define MINCHAR 0x80 #define MAXCHAR 0x7f #define MINSHORT 0x8000 #define MAXSHORT 0x7fff #define MINLONG 0x80000000 #define MAXLONG 0x7fffffff #define MAXUCHAR 0xff #define MAXUSHORT 0xffff #define MAXULONG 0xffffffff // // Long long types. // #if defined(_MSC_EXTENSIONS) typedef __int64 LONGLONG; typedef unsigned __int64 ULONGLONG; #elif defined(UNIX_LP64) typedef long LONGLONG; typedef unsigned long ULONGLONG; #else typedef long long LONGLONG; typedef unsigned long long ULONGLONG; #endif typedef LONGLONG *PLONGLONG; typedef ULONGLONG *PULONGLONG; #define MAXLONGLONG 0x7fffffffffffffff #define MAXULONGLONG 0xffffffffffffffff // // Logical/boolean value types. // typedef ULONG LOGICAL; typedef ULONG *PLOGICAL; typedef int BOOL; typedef BOOL *PBOOL; typedef UCHAR BOOLEAN; typedef BOOLEAN *PBOOLEAN; #define TRUE 1 #define FALSE 0 // // Basic pointer types. // typedef VOID *PVOID; typedef CHAR *PCHAR; typedef SHORT *PSHORT; typedef UCHAR *PUCHAR; typedef USHORT *PUSHORT; typedef ULONG *PULONG; // // Numeric pointer types. // #ifdef _WIN64 typedef LONGLONG LONG_PTR; typedef ULONGLONG ULONG_PTR; #else typedef LONG LONG_PTR; typedef ULONG ULONG_PTR; #endif // // String types. // typedef CHAR *PSTR, *LPSTR; typedef CONST CHAR *PCSTR, *LPCSTR; // // Wide character/string types. // typedef USHORT WCHAR; typedef WCHAR *PWCHAR, *PWSTR, *LPWSTR; typedef CONST WCHAR *PCWSTR, *LPCWSTR; // // Handle types. // typedef PVOID HANDLE; typedef HANDLE *PHANDLE; #define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1) // // Status code types. // typedef LONG NTSTATUS; typedef NTSTATUS *PNTSTATUS; // // Status code utilities. // #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) #define NT_INFORMATION(Status) ((ULONG)(Status) >> 30 == 1) #define NT_WARNING(Status) ((ULONG)(Status) >> 30 == 2) #define NT_ERROR(Status) ((ULONG)(Status) >> 30 == 3) // // Struct field offset helper. // #if defined(__clang__) || defined(__GNUC__) #define FIELD_OFFSET(type, field) ((ULONG)__builtin_offsetof(type, field)) #else #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field)) #endif // // Alignment helpers. // #define ALIGN_DOWN(x, a) ((x) & ~((a) - 1)) #define ALIGN_UP(x, a) ALIGN_DOWN((x) + (a) - 1, a) // // Large (64-bit) integer value. // typedef union LARGE_INTEGER { struct { ULONG LowPart; LONG HighPart; }; LONGLONG QuadPart; } LARGE_INTEGER, *PLARGE_INTEGER; // // Large (64-bit) unsigned integer value. // typedef union ULARGE_INTEGER { struct { ULONG LowPart; ULONG HighPart; }; ULONGLONG QuadPart; } ULARGE_INTEGER, *PULARGE_INTEGER; // // Doubly-linked list entry. // typedef struct _LIST_ENTRY { struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Blink; } LIST_ENTRY, *PLIST_ENTRY; FORCEINLINE VOID InitializeListHead ( IN PLIST_ENTRY Head ) /*++ Routine Description: Initializes a list head. Arguments: Head - the list head. Return Value: None. --*/ { Head->Blink = Head; Head->Flink = Head; } FORCEINLINE BOOLEAN RemoveEntryList ( IN PLIST_ENTRY Entry ) /*++ Routine Description: Removes a list entry from a list. Arguments: Entry - the entry to remove. Return Value: True if the list is now empty, False if the list still has at least one entry. --*/ { PLIST_ENTRY Blink, Flink; Blink = Entry->Blink; Flink = Entry->Flink; Blink->Flink = Flink; Flink->Blink = Blink; return (BOOLEAN)(Flink == Blink); } // // Unicode string. // typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, *PUNICODE_STRING; typedef CONST UNICODE_STRING *PCUNICODE_STRING; #define UNICODE_NULL ((WCHAR) 0) #define MAX_USTRING ALIGN_DOWN(MAXUSHORT, sizeof(WCHAR)) #include #endif /* !_NTDEF_H */