// Object manager. This file owns reference-counted kernel objects and handle-table lifetime rules. #include #include #include #include // Creates object. __declspec(dllexport) OBJECT* ObAllocateObject(OBJECT_TYPE type, size_t size) { if (size < sizeof(OBJECT)) size = sizeof(OBJECT); OBJECT* obj = (OBJECT *)MmAllocatePool(size); if (!obj) return (OBJECT *)0; memset(obj, 0, size); obj->Type = type; obj->RefCount = 1; obj->Destroy = (void *)0; // caller fills this in return obj; } // Implements the reference Object operation. __declspec(dllexport) void ObReferenceObject(OBJECT* object) { if (!object) return; _InterlockedIncrement(&object->RefCount); } // Implements the dereference Object operation. __declspec(dllexport) void ObDereferenceObject(OBJECT* object) { if (!object) return; long prev = _InterlockedDecrement(&object->RefCount); if (prev == 0) { // Reference count hit zero - run the destructor then free. if (object->Destroy) { object->Destroy(object); } MmFreePool(object); } }