89 if (!TypeName || !ObjectTypeInitializer || !ReturnedObjectType) {
111 *ReturnedObjectType = NewType;
118 IN uint32_t ObjectSize,
119 OUT void** ObjectCreated
142 size_t ActualSize =
sizeof(OBJECT_HEADER) + ObjectSize;
148 Header->Type = ObjectType;
149 Header->PointerCount = 1;
181 if (!Object)
return false;
184 uint64_t OldCount = Header->PointerCount;
186 if (OldCount == 0)
return false;
189 (
volatile uint64_t*)&Header->PointerCount,
194 if (NewCount == OldCount)
return true;
233 if (DesiredType != NULL && Header->Type != DesiredType) {
249 IN uint32_t DesiredAccess,
299 if (DesiredType && Header->Type != DesiredType) {
305 if ((OutHandleEntry->
GrantedAccess & DesiredAccess) != DesiredAccess) {
312 *Object = RetrievedObject;
313 if (HandleInformation) *HandleInformation = *OutHandleEntry;
358 *ReturnedHandle = Handle;
403 *ReturnedHandle = Handle;
409ObpDeferObjectDeletion(
430 volatile void* Entry;
436 Header->NextToFree = Entry;
482 if (
Type->TypeInfo.DumpProcedure)
Type->TypeInfo.DumpProcedure(Object);
486 if (
Type->TypeInfo.DeleteProcedure)
Type->TypeInfo.DeleteProcedure(Object);
FORCEINLINE uint32_t InterlockedIncrementU32(volatile uint32_t *target)
FORCEINLINE uint64_t InterlockedCompareExchangeU64(volatile uint64_t *target, uint64_t value, uint64_t comparand)
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)
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)
void * HtGetObject(PHANDLE_TABLE Table, HANDLE Handle, PHANDLE_TABLE_ENTRY *OutEntry)
HANDLE HtCreateHandle(PHANDLE_TABLE Table, void *Object, uint32_t Access)
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 MT_INVALID_ADDRESS
#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)
MTSTATUS ObCreateObject(IN POBJECT_TYPE ObjectType, IN uint32_t ObjectSize, OUT void **ObjectCreated)
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)
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