/* * Copyright (c) 2026, Chloe M. * Provided under the BSD-3 clause. * * Description: Object manager * Author: Chloe M. */ #include #include #include #include #include ST_STATUS ObCreateDirectory(const CHAR *Name, ST_OBJECT **Result) { ST_STATUS Status; ST_OBJECT *DirecObj; OBJECT_DIRECTORY *Direc; if (Name == NULL || Result == NULL) { return STATUS_INVALID_PARAM; } Status = ObCreateObject( Name, OBJECT_TYPE_DIRECTORY, NULL, &DirecObj ); if (Status != STATUS_SUCCESS) { return Status; } Direc = ExAllocatePoolWithTag( POOL_NON_PAGED, sizeof(*Direc), OBJECT_POOL_TAG ); /* FIXME: Free DirecObj */ if (Direc == NULL) { return STATUS_NO_MEMORY; } RtlMemSet(Direc, 0, sizeof(*Direc)); DirecObj->Data = Direc; *Result = DirecObj; return STATUS_SUCCESS; } ST_STATUS ObCreateObject(const CHAR *Name, OBJECT_TYPE Type, VOID *Data, ST_OBJECT **Result) { ST_OBJECT *Object; USIZE NameLen; if (Name == NULL || Result == NULL) { return STATUS_INVALID_PARAM; } NameLen = RtlStrLen(Name); if (NameLen >= OBJECT_NAMESZ - 1) { return STATUS_NAME_TOO_LONG; } Object = ExAllocatePoolWithTag( POOL_NON_PAGED, sizeof(*Object), OBJECT_POOL_TAG ); if (Object == NULL) { return STATUS_NO_MEMORY; } RtlMemSet(Object, 0, sizeof(*Object)); RtlMemCpy(Object->Name, Name, NameLen); Object->Name[NameLen] = '\0'; Object->RefCount = 1; Object->Type = Type; Object->Data = Data; *Result = Object; return STATUS_SUCCESS; } VOID ObReclaimObject(ST_OBJECT *Object) { if (Object == NULL) { return; } if (AtomicDecLong(&Object->RefCount) == 0) { ObReclaimToCache(&gObCache, Object); } }