20 #define SizeOfHandle(x) (sizeof(HANDLE) * (x)) 21 #define INDEX_TO_HANDLE_VALUE(x) ((x) << HANDLE_TAG_BITS) 58 TableLevel = (
ULONG)(TableBase & 3);
61 PointerArray = (
PVOID*)TableBase;
70 PointerArray = PointerArray[
Handle.HighIndex];
77 HandleArray = PointerArray[
Handle.MidIndex];
195 Level1 = (
PVOID)TableBase;
198 else if (TableLevel == 1)
201 Level2 = (
PVOID)TableBase;
207 if (!Level2[
i])
break;
219 Level3 = (
PVOID)TableBase;
225 if (!Level3[
i])
break;
231 if (!Level3[
i][
j])
break;
279 LockIndex =
Handle.Index % 4;
296 HandleTableEntry->NextFreeTableEntry = OldValue;
334 if (!HandleTableTable)
345 HandleEntry = &HandleTableTable[0];
347 HandleEntry->
Value = 0;
359 HandleEntry->
Value = 0;
367 HandleEntry->
Value = 0;
381 for (
i = 0;
i < 4;
i++)
406 HandleEntry = &
Low[0];
408 HandleEntry->
Value = 0;
424 HandleEntry->
Value = 0;
430 HandleEntry->
Value = 0;
447 if (!Mid)
return NULL;
460 *LowTableEntry =
Low;
471 ULONG NewFree, FirstFree;
483 if (!Mid)
return FALSE;
487 Mid[0] = (
PVOID)TableBase;
493 else if (TableLevel == 1)
496 SecondLevel = (
PVOID)TableBase;
539 else if (TableLevel == 2)
542 ThirdLevel = (
PVOID)TableBase;
553 if (!Mid)
return FALSE;
602 if (NewFree == FirstFree)
break;
620 if (!LastFree)
return LastFree;
623 for (
i = 1;
i < 4;
i++)
650 ULONG OldValue, NewValue, NewValue1;
702 NewHandle->GenericHandleOverlay =
NULL;
715 OldHandle.
Value = OldValue;
730 NewValue = *(
volatile ULONG*)&
Entry->NextFreeTableEntry;
740 if (NewValue1 == OldValue)
809 *NewEntry = *HandleTableEntry;
817 return Handle.GenericHandleOverlay;
832 OldValue = HandleTableEntry->Value;
861 OldValue = *(
volatile LONG_PTR *)&HandleTableEntry->Object;
877 if (!OldValue)
return FALSE;
936 if (DestroyHandleProcedure)
961 if (!HandleTableEntry)
967 if (!(HandleTableEntry) ||
968 !(HandleTableEntry->Object) ||
969 (HandleTableEntry->NextFreeTableEntry == -2))
1025 if (!HandleTableEntry)
return NULL;
1031 return HandleTableEntry;
1049 if (!NewTable)
return NULL;
1067 NewTable->FirstFree = 0;
1099 *NewEntry = *HandleTableEntry;
1102 if (DupHandleProcedure(
Process,
1170 if (!(HandleTableEntry) ||
1171 !(HandleTableEntry->
Object) ||
1215 EnumHandleProcedure(HandleTableEntry,
1216 Handle.GenericHandleOverlay,
1236 IN PEX_ENUM_HANDLE_CALLBACK EnumHandleProcedure,
1253 if ((HandleTableEntry->
Object) &&
1260 Result = EnumHandleProcedure(HandleTableEntry,
1261 Handle.GenericHandleOverlay,
1271 if (EnumHandle) *EnumHandle =
Handle.GenericHandleOverlay;
1286 #if DBG && defined(KDBG) 1300 ULONG NeededLength = 0;
1324 KdbpPrint(
"Invalid parameter: %s\n", Argv[1]);
1334 if (*endptr !=
'\0')
1336 KdbpPrint(
"Invalid parameter: %s\n", Argv[1]);
1373 KdbpPrint(
"\tObjectHeader: %p\n", ObjectHeader);
1409 while (CurrentKcb !=
NULL)
1421 if (NeededLength <
sizeof(KeyPath))
1425 while (CurrentKcb !=
NULL)
1443 NeededLength -= NameLength;
#define KeGetCurrentIrql()
PHANDLE_TABLE NTAPI ExpAllocateHandleTable(IN PEPROCESS Process OPTIONAL, IN BOOLEAN NewTable)
FORCEINLINE VOID ExAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
PHANDLE_TABLE_ENTRY NTAPI ExpLookupHandleTableEntry(IN PHANDLE_TABLE HandleTable, IN EXHANDLE Handle)
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ProcessId
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
VOID FASTCALL ExBlockPushLock(PEX_PUSH_LOCK PushLock, PVOID pWaitBlock)
POBJECT_TYPE ExWindowStationObjectType
BOOLEAN NTAPI ExDestroyHandle(IN PHANDLE_TABLE HandleTable, IN HANDLE Handle, IN PHANDLE_TABLE_ENTRY HandleTableEntry OPTIONAL)
ULONG NextHandleNeedingPool
IN BOOLEAN OUT PSTR Buffer
struct _CM_KEY_CONTROL_BLOCK * ParentKcb
PHANDLE_TABLE_ENTRY NTAPI ExMapHandleToPointer(IN PHANDLE_TABLE HandleTable, IN HANDLE Handle)
VOID NTAPI ExDestroyHandleTable(IN PHANDLE_TABLE HandleTable, IN PVOID DestroyHandleProcedure OPTIONAL)
PHANDLE_TABLE_ENTRY NTAPI ExpAllocateLowLevelTable(IN PHANDLE_TABLE HandleTable, IN BOOLEAN DoInit)
FORCEINLINE VOID ExWaitOnPushLock(PEX_PUSH_LOCK PushLock)
VOID NTAPI ExpBlockOnLockedHandleEntry(IN PHANDLE_TABLE HandleTable, IN PHANDLE_TABLE_ENTRY HandleTableEntry)
#define InterlockedCompareExchange
IN PVOID IN PVOID IN USHORT IN USHORT Size
#define OBJECT_HEADER_TO_NAME_INFO(h)
LIST_ENTRY HandleTableList
POBJECT_TYPE ExDesktopObjectType
PHANDLE_TABLE_ENTRY *NTAPI ExpAllocateMidLevelTable(IN PHANDLE_TABLE HandleTable, IN BOOLEAN DoInit, OUT PHANDLE_TABLE_ENTRY *LowTableEntry)
static XMS_HANDLE HandleTable[XMS_MAX_HANDLES]
VOID FASTCALL ExWaitForUnblockPushLock(IN PEX_PUSH_LOCK PushLock, IN PVOID WaitBlock)
PCM_NAME_CONTROL_BLOCK NameBlock
#define InsertTailList(ListHead, Entry)
VOID NTAPI ExUnlockHandleTableEntry(IN PHANDLE_TABLE HandleTable, IN PHANDLE_TABLE_ENTRY HandleTableEntry)
BOOLEAN NTAPI KdbpGetHexNumber(IN PCHAR pszNum, OUT ULONG_PTR *pulValue)
BOOLEAN(NTAPI * PEX_CHANGE_HANDLE_CALLBACK)(PHANDLE_TABLE_ENTRY HandleTableEntry, ULONG_PTR Context)
BOOLEAN NTAPI ExChangeHandle(IN PHANDLE_TABLE HandleTable, IN HANDLE Handle, IN PEX_CHANGE_HANDLE_CALLBACK ChangeRoutine, IN ULONG_PTR Context)
_In_opt_ PALLOCATE_FUNCTION _In_opt_ PFREE_FUNCTION Free
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
HANDLE NTAPI ExCreateHandle(IN PHANDLE_TABLE HandleTable, IN PHANDLE_TABLE_ENTRY HandleTableEntry)
BOOLEAN(NTAPI * PEX_DUPLICATE_HANDLE_CALLBACK)(IN PEPROCESS Process, IN PHANDLE_TABLE HandleTable, IN PHANDLE_TABLE_ENTRY HandleTableEntry, IN PHANDLE_TABLE_ENTRY NewEntry)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
BOOLEAN NTAPI ExpAllocateHandleTableEntrySlow(IN PHANDLE_TABLE HandleTable, IN BOOLEAN DoInit)
#define OBJ_NAME_PATH_SEPARATOR
VOID NTAPI CmpCopyCompressedName(OUT PWCHAR Destination, IN ULONG DestinationLength, IN PWCHAR Source, IN ULONG SourceLength)
#define InterlockedCompareExchangePointer
#define PsGetCurrentProcess
FORCEINLINE VOID ExReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
PVOID NTAPI ExpAllocateTablePagedPool(IN PEPROCESS Process OPTIONAL, IN SIZE_T Size)
#define ObpGetHandleObject(x)
VOID NTAPI ExpFreeTablePagedPool(IN PEPROCESS Process OPTIONAL, IN PVOID Buffer, IN SIZE_T Size)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
#define ExInitializePushLock
#define InterlockedExchangeAdd
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
struct _HANDLE_TABLE_ENTRY * PHANDLE_TABLE_ENTRY
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
PHANDLE_TABLE NTAPI ExDupHandleTable(IN PEPROCESS Process, IN PHANDLE_TABLE HandleTable, IN PEX_DUPLICATE_HANDLE_CALLBACK DupHandleProcedure, IN ULONG_PTR Mask)
struct _LIST_ENTRY * Flink
#define ObpDirectoryObjectType
#define InterlockedExchangePointer(Target, Value)
PHANDLE_TABLE_ENTRY NTAPI ExpAllocateHandleTableEntry(IN PHANDLE_TABLE HandleTable, OUT PEXHANDLE NewHandle)
VOID NTAPI ExpInitializeHandleTables(VOID)
VOID NTAPI ExRemoveHandleTable(IN PHANDLE_TABLE HandleTable)
_In_ WDFCOLLECTION _In_ ULONG Index
HANDLE GenericHandleOverlay
BOOLEAN NTAPI ExpLockHandleTableEntry(IN PHANDLE_TABLE HandleTable, IN PHANDLE_TABLE_ENTRY HandleTableEntry)
VOID KdbpPrint(IN PCHAR Format, IN ... OPTIONAL)
Prints the given string with printf-like formatting.
#define INDEX_TO_HANDLE_VALUE(x)
PHANDLE_TABLE NTAPI ExCreateHandleTable(IN PEPROCESS Process OPTIONAL)
POBJECT_TYPE MmSectionObjectType
#define ExAllocatePoolWithTag(hernya, size, tag)
#define InterlockedDecrement
#define KeEnterCriticalRegion()
#define HIGH_LEVEL_ENTRIES
BOOLEAN NTAPI ExEnumHandleTable(IN PHANDLE_TABLE HandleTable, IN PEX_ENUM_HANDLE_CALLBACK EnumHandleProcedure, IN OUT PVOID Context, OUT PHANDLE EnumHandle OPTIONAL)
POBJECT_TYPE IoFileObjectType
#define EXHANDLE_TABLE_ENTRY_LOCK_BIT
#define InterlockedExchange
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
PVOID NTAPI ExpAllocateTablePagedPoolNoZero(IN PEPROCESS Process OPTIONAL, IN SIZE_T Size)
WCHAR Name[ANYSIZE_ARRAY]
ULONG NTAPI ExpMoveFreeHandles(IN PHANDLE_TABLE HandleTable)
FORCEINLINE VOID ExAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
VOID NTAPI ExpFreeLowLevelTable(IN PEPROCESS Process, IN PHANDLE_TABLE_ENTRY TableEntry)
#define KeLeaveCriticalRegion()
#define InterlockedIncrement
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define LOW_LEVEL_ENTRIES
#define InitializeListHead(ListHead)
VOID NTAPI ExpFreeHandleTable(IN PHANDLE_TABLE HandleTable)
HANDLE NTAPI PsGetCurrentProcessId(VOID)
VOID NTAPI ExSweepHandleTable(IN PHANDLE_TABLE HandleTable, IN PEX_SWEEP_HANDLE_CALLBACK EnumHandleProcedure, IN PVOID Context)
VOID FASTCALL ExfUnblockPushLock(PEX_PUSH_LOCK PushLock, PVOID CurrentWaitBlock)
_Must_inspect_result_ typedef _In_ ULONG TableEntry
#define MID_LEVEL_ENTRIES
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
FORCEINLINE VOID ExReleasePushLockShared(PEX_PUSH_LOCK PushLock)
VOID NTAPI ExpFreeHandleTableEntry(IN PHANDLE_TABLE HandleTable, IN EXHANDLE Handle, IN PHANDLE_TABLE_ENTRY HandleTableEntry)
EX_PUSH_LOCK HandleTableListLock
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
LIST_ENTRY HandleTableListHead
HANDLE NTAPI PsGetProcessId(PEPROCESS Process)
#define ExFreePoolWithTag(_P, _T)
#define KeGetCurrentThread
struct _CM_KEY_BODY * PCM_KEY_BODY
USHORT NTAPI CmpCompressedNameSize(IN PWCHAR Name, IN ULONG Length)
BOOLEAN(NTAPI * PEX_SWEEP_HANDLE_CALLBACK)(PHANDLE_TABLE_ENTRY HandleTableEntry, HANDLE Handle, PVOID Context)
base of all file and directory entries
PULONG MinorVersion OPTIONAL
BOOLEAN ExpKdbgExtHandle(ULONG Argc, PCHAR Argv[])