91 if (!TypeName || !ObjectTypeInitializer || !ReturnedObjectType) {
113 *ReturnedObjectType = NewType;
120 IN uint32_t ObjectSize,
121 OUT void** ObjectCreated
144 size_t ActualSize =
sizeof(OBJECT_HEADER) + ObjectSize;
150 Header->Type = ObjectType;
151 Header->PointerCount = 1;
152 Header->HandleCount = 0;
184 if (!Object)
return false;
187 uint64_t expected = __atomic_load_n((
volatile uint64_t*)&Header->PointerCount, __ATOMIC_SEQ_CST);
195 uint64_t desired = expected + 1;
238 if (Header->Type != DesiredType) {
279 IN uint32_t DesiredAccess,
324 if (HandleInformation) {
326 HandleInformation->Object = CurrentProcess;
333 *Object = CurrentProcess;
345 if (HandleInformation) {
347 HandleInformation->Object = CurrentThread;
354 *Object = CurrentThread;
381 if (DesiredType && Header->Type != DesiredType) {
387 DesiredAccess = DesiredAccess & DesiredType->TypeInfo.ValidAccessRights;
390 if ((OutHandleEntry->
GrantedAccess & DesiredAccess) != DesiredAccess) {
397 *Object = RetrievedObject;
398 if (HandleInformation) *HandleInformation = *OutHandleEntry;
479 Header->HandleCount++;
480 Header->Type->TotalNumberOfHandles++;
486 *ReturnedHandle = Handle;
492ObpDeferObjectDeletion(
513 volatile void* Entry;
519 Header->NextToFree = Entry;
535 assert(Header->HandleCount == 0 && Header->PointerCount == 0);
586 assert(Header->HandleCount == 0);
FORCEINLINE uint32_t InterlockedIncrementU32(volatile uint32_t *target)
FORCEINLINE void * InterlockedCompareExchangePointer(volatile void *volatile *target, void *value, void *comparand)
FORCEINLINE uint32_t InterlockedDecrementU32(volatile uint32_t *target)
FORCEINLINE uint64_t InterlockedDecrementU64(volatile uint64_t *target)
FORCEINLINE bool InterlockedCompareExchangeU64_bool(volatile uint64_t *target, uint64_t value, uint64_t *expected)
struct _DOUBLY_LINKED_LIST DOUBLY_LINKED_LIST
bool MeInsertQueueDpc(IN PDPC Dpc, IN void *SystemArgument1, IN void *SystemArgument2)
volatile void * ObpReaperList
void MeInitializeDpc(IN PDPC DpcAllocated, IN PDEFERRED_ROUTINE DeferredRoutine, IN void *DeferredContext, IN DPC_PRIORITY DeferredPriority)
void ReapOb(DPC *dpc, void *DeferredContext, void *SystemArgument1, void *SystemArgument2)
void gop_printf(uint32_t color, const char *fmt,...)
char * kstrncpy(char *dst, const char *src, size_t n)
HANDLE HtCreateHandle(PHANDLE_TABLE Table, void *Object, uint32_t Access)
void * HtGetObject(IN PHANDLE_TABLE Table, IN HANDLE Handle, _Out_Opt PHANDLE_TABLE_ENTRY *OutEntry)
struct _HANDLE_TABLE_ENTRY * PHANDLE_TABLE_ENTRY
struct _HANDLE_TABLE * PHANDLE_TABLE
#define COLOR_RED
Colors definitions for easier access.
FORCEINLINE void * kmemcpy(void *dest, const void *src, size_t len)
FORCEINLINE void * kmemset(void *dest, int64_t val, uint64_t len)
FORCEINLINE void InitializeListHead(PDOUBLY_LINKED_LIST Head)
FORCEINLINE void InsertTailList(PDOUBLY_LINKED_LIST Head, PDOUBLY_LINKED_LIST Entry)
struct _SPINLOCK SPINLOCK
#define MtCurrentThread()
#define MtCurrentProcess()
#define MT_INVALID_ADDRESS
#define MT_FAILURE(Status)
#define MT_OBJECT_DELETED
#define MT_INVALID_HANDLE
MTSTATUS ObCreateHandleForObject(IN void *Object, IN ACCESS_MASK DesiredAccess, OUT PHANDLE ReturnedHandle)
MTSTATUS ObReferenceObjectByHandle(IN HANDLE Handle, IN uint32_t DesiredAccess, IN POBJECT_TYPE DesiredType, OUT void **Object, _Out_Opt PHANDLE_TABLE_ENTRY HandleInformation)
MTSTATUS ObReferenceObjectByPointer(IN void *Object, IN POBJECT_TYPE DesiredType)
MTSTATUS ObCreateHandleForObjectEx(IN void *Object, IN ACCESS_MASK DesiredAccess, OUT PHANDLE ReturnedHandle, IN PHANDLE_TABLE ObjectTable)
MTSTATUS ObCreateObjectType(IN char *TypeName, IN POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, OUT POBJECT_TYPE *ReturnedObjectType)
void ObDereferenceObject(IN void *Object)
bool ObReferenceObject(IN void *Object)
void ObDeleteObject(IN POBJECT_HEADER Header)
MTSTATUS ObCreateObject(IN POBJECT_TYPE ObjectType, IN uint32_t ObjectSize, OUT void **ObjectCreated)
MTSTATUS ObOpenObjectByPointer(IN void *Object, IN POBJECT_TYPE ObjectType, IN ACCESS_MASK DesiredAccess, OUT PHANDLE Handle)
DOUBLY_LINKED_LIST ObTypeDirectoryList
struct _OBJECT_TYPE * POBJECT_TYPE
struct _OBJECT_TYPE_INITIALIZER * POBJECT_TYPE_INITIALIZER
#define OBJECT_HEADER_TO_OBJECT(h)
struct _OBJECT_HEADER * POBJECT_HEADER
struct _OBJECT_TYPE OBJECT_TYPE
struct _OBJECT_TYPE_INITIALIZER OBJECT_TYPE_INITIALIZER
#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)
#define MT_THREAD_ALL_ACCESS
#define MT_PROCESS_ALL_ACCESS
POBJECT_TYPE PsThreadType
POBJECT_TYPE PsProcessType
void MsAcquireSpinlock(IN PSPINLOCK lock, IN PIRQL OldIrql)
void MsReleaseSpinlock(IN PSPINLOCK lock, IN IRQL OldIrql)
PHANDLE_TABLE ObjectTable
DOUBLY_LINKED_LIST TypeList
OBJECT_TYPE_INITIALIZER TypeInfo
PETHREAD PsGetCurrentThread(void)