57 if (!Table || !Handle || ((uint64_t)Handle & 3))
return NULL;
59 uint64_t TableCode = Table->TableCode;
64 uint64_t Index = (uint64_t)(Handle) >> 2;
71 else if (Level == 1) {
75 uint64_t PageIndex = Index / MaxEntriesPerLevel;
76 uint64_t EntryIndex = Index % MaxEntriesPerLevel;
81 return &ActualPage[EntryIndex];
138HtpAllocateAndInitHandlePage(
140 IN uint32_t BaseHandleIndex
162 if (!NewPage)
return NULL;
210 uint32_t NewBaseIndex = 0;
215 if (CurrentLevel == 0) {
218 if (!Directory)
return;
225 NewFreePage = HtpAllocateAndInitHandlePage(Table, NewBaseIndex);
232 Directory[1] = NewFreePage;
235 Table->
TableCode = ((uint64_t)Directory) | 1;
244 else if (CurrentLevel == 1) {
248 uint32_t DirectoryIndex = 0;
250 if (Directory[DirectoryIndex] == NULL)
break;
262 NewFreePage = HtpAllocateAndInitHandlePage(Table, NewBaseIndex);
263 if (!NewFreePage)
return;
266 Directory[DirectoryIndex] = NewFreePage;
311 HtpExpandTable(Table);
369 if (!Handle || ((uint64_t)Handle & 3)) {
378 if (!Entry || !Entry->
Object) {
430 if (Entry && Entry->
Object) {
436 if (OutEntry) *OutEntry = Entry;
469 uint64_t TableCode = Table->TableCode;
479 void* Object =
Entries[i].Object;
495 else if (Level == 1) {
505 void* Object = Page[i].
Object;
527 assert(
false,
"Unsupported level encountered on handle table free.");
FORCEINLINE uint64_t InterlockedDecrementU64(volatile uint64_t *target)
FORCEINLINE bool InterlockedDecrementIfNotZero(volatile uint64_t *value)
struct _DOUBLY_LINKED_LIST DOUBLY_LINKED_LIST
PUSH_LOCK HandleTableLock
PHANDLE_TABLE HtCreateHandleTable(IN PEPROCESS Process)
HANDLE HtCreateHandle(PHANDLE_TABLE Table, void *Object, uint32_t Access)
DOUBLY_LINKED_LIST HandleTableList
void HtDeleteHandle(PHANDLE_TABLE Table, HANDLE Handle)
MTSTATUS HtClose(IN HANDLE Handle)
void HtDeleteHandleTable(IN PHANDLE_TABLE Table)
void * HtGetObject(IN PHANDLE_TABLE Table, IN HANDLE Handle, _Out_Opt PHANDLE_TABLE_ENTRY *OutEntry)
struct _HANDLE_TABLE HANDLE_TABLE
struct _HANDLE_TABLE_ENTRY * PHANDLE_TABLE_ENTRY
struct _HANDLE_TABLE * PHANDLE_TABLE
#define LOW_LEVEL_ENTRIES
struct _PUSH_LOCK PUSH_LOCK
#define MtCurrentThread()
#define MtCurrentProcess()
#define MT_INVALID_HANDLE
void ObDereferenceObject(IN void *Object)
struct _OBJECT_HEADER * POBJECT_HEADER
#define OBJECT_TO_OBJECT_HEADER(o)
void MmFreePool(IN void *buf)
void * MmAllocatePoolWithTag(IN enum _POOL_TYPE PoolType, IN size_t NumberOfBytes, IN uint32_t Tag)
FORCEINLINE PEPROCESS PsGetCurrentProcess(void)
void MsAcquirePushLockExclusive(IN PUSH_LOCK *Lock)
void MsAcquirePushLockShared(IN PUSH_LOCK *Lock)
void MsReleasePushLockExclusive(IN PUSH_LOCK *Lock)
void MsReleasePushLockShared(IN PUSH_LOCK *Lock)
PHANDLE_TABLE ObjectTable
uint32_t NextFreeTableEntry