54 if (!Table || !Handle || ((uint64_t)Handle & 3))
return NULL;
56 uint64_t TableCode = Table->TableCode;
61 uint64_t Index = (uint64_t)(Handle) >> 2;
68 else if (Level == 1) {
72 uint64_t PageIndex = Index / MaxEntriesPerLevel;
73 uint64_t EntryIndex = Index % MaxEntriesPerLevel;
78 return &ActualPage[EntryIndex];
130HtpAllocateAndInitHandlePage(
132 IN uint32_t BaseHandleIndex
154 if (!NewPage)
return NULL;
202 uint32_t NewBaseIndex = 0;
207 if (CurrentLevel == 0) {
210 if (!Directory)
return;
217 NewFreePage = HtpAllocateAndInitHandlePage(Table, NewBaseIndex);
224 Directory[1] = NewFreePage;
227 Table->
TableCode = ((uint64_t)Directory) | 1;
236 else if (CurrentLevel == 1) {
240 uint32_t DirectoryIndex = 0;
242 if (Directory[DirectoryIndex] == NULL)
break;
254 NewFreePage = HtpAllocateAndInitHandlePage(Table, NewBaseIndex);
255 if (!NewFreePage)
return;
258 Directory[DirectoryIndex] = NewFreePage;
302 HtpExpandTable(Table);
361 if (!Handle || ((uint64_t)Handle & 3)) {
370 if (!Entry || !Entry->
Object) {
422 if (Entry && Entry->
Object) {
428 if (OutEntry) *OutEntry = Entry;
462 uint64_t TableCode = Table->TableCode;
472 void* Object =
Entries[i].Object;
485 else if (Level == 1) {
495 void* Object = Page[i].
Object;
514 assert(
false,
"Unsupported level encountered on handle table free.");
struct _DOUBLY_LINKED_LIST DOUBLY_LINKED_LIST
void * HtGetObject(PHANDLE_TABLE Table, HANDLE Handle, PHANDLE_TABLE_ENTRY *OutEntry)
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)
void HtDeleteHandleTable(IN PHANDLE_TABLE Table)
struct _HANDLE_TABLE HANDLE_TABLE
struct _HANDLE_TABLE_ENTRY * PHANDLE_TABLE_ENTRY
struct _HANDLE_TABLE * PHANDLE_TABLE
#define LOW_LEVEL_ENTRIES
struct _SPINLOCK SPINLOCK
#define MT_INVALID_HANDLE
void ObDereferenceObject(IN void *Object)
void MmFreePool(IN void *buf)
void * MmAllocatePoolWithTag(IN enum _POOL_TYPE PoolType, IN size_t NumberOfBytes, IN uint32_t Tag)
void MsAcquireSpinlock(IN PSPINLOCK lock, IN PIRQL OldIrql)
void MsReleaseSpinlock(IN PSPINLOCK lock, IN IRQL OldIrql)
uint32_t NextFreeTableEntry