[FLTMGR]
[reactos.git] / reactos / drivers / filters / fltmgr / Object.c
diff --git a/reactos/drivers/filters/fltmgr/Object.c b/reactos/drivers/filters/fltmgr/Object.c
new file mode 100644 (file)
index 0000000..d0cf795
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+* PROJECT:         Filesystem Filter Manager
+* LICENSE:         GPL - See COPYING in the top level directory
+* FILE:            drivers/fs_minifilter/fltmgr/Object.c
+* PURPOSE:         Miscellaneous library functions
+* PROGRAMMERS:     Ged Murphy (gedmurphy@reactos.org)
+*/
+
+// NOTE: Split this file into filter object and device object functions
+// when the code base grows sufficiently
+
+/* INCLUDES ******************************************************************/
+
+#include "fltmgr.h"
+
+#define NDEBUG
+#include <debug.h>
+
+
+/* DATA *********************************************************************/
+
+
+
+/* EXPORTED FUNCTIONS ******************************************************/
+
+
+NTSTATUS
+NTAPI
+FltObjectReference(_Inout_ PFLT_OBJECT Object)
+{
+    if (!FltpExAcquireRundownProtection(&Object->RundownRef))
+    {
+        return STATUS_FLT_DELETING_OBJECT;
+    }
+
+    return STATUS_SUCCESS;
+}
+
+BOOLEAN
+NTAPI
+FltObjectDereference(_Inout_ PFLT_OBJECT Object)
+{
+    return FltpExReleaseRundownProtection(&Object->RundownRef);
+}
+
+
+
+/* INTERNAL FUNCTIONS ******************************************************/
+
+VOID
+FltpExInitializeRundownProtection(_Out_ PEX_RUNDOWN_REF RundownRef)
+{
+    ExInitializeRundownProtection(RundownRef);
+}
+
+BOOLEAN
+FltpExAcquireRundownProtection(_Inout_ PEX_RUNDOWN_REF RundownRef)
+{
+    return ExAcquireRundownProtection(RundownRef);
+}
+
+BOOLEAN
+FltpExReleaseRundownProtection(_Inout_ PEX_RUNDOWN_REF RundownRef)
+{
+    ExReleaseRundownProtection(RundownRef);
+    return TRUE;
+}
+
+BOOLEAN
+FltpExRundownCompleted(_Inout_ PEX_RUNDOWN_REF RundownRef)
+{
+    return _InterlockedExchange((PLONG)RundownRef, 1);
+}
+
+NTSTATUS
+NTAPI
+FltpObjectRundownWait(_Inout_ PEX_RUNDOWN_REF RundownRef)
+{
+    //return FltpExWaitForRundownProtectionRelease(RundownRef);
+    return 0;
+}
+
+NTSTATUS
+FltpGetBaseDeviceObjectName(_In_ PDEVICE_OBJECT DeviceObject,
+                            _Inout_ PUNICODE_STRING ObjectName)
+{
+    PDEVICE_OBJECT BaseDeviceObject;
+    NTSTATUS Status;
+
+    /*
+    * Get the lowest device object on the stack, which may be the
+    * object we were passed, and lookup the name for that object
+    */
+    BaseDeviceObject = IoGetDeviceAttachmentBaseRef(DeviceObject);
+    Status = FltpGetObjectName(BaseDeviceObject, ObjectName);
+    ObDereferenceObject(BaseDeviceObject);
+
+    return Status;
+}
+
+NTSTATUS
+FltpGetObjectName(_In_ PVOID Object,
+                  _Inout_ PUNICODE_STRING ObjectName)
+{
+    POBJECT_NAME_INFORMATION ObjectNameInfo = NULL;
+    OBJECT_NAME_INFORMATION LocalNameInfo;
+    ULONG ReturnLength;
+    NTSTATUS Status;
+
+    if (ObjectName == NULL)
+        return STATUS_INVALID_PARAMETER;
+
+    /* Get the size of the buffer required to hold the nameinfo */
+    Status = ObQueryNameString(Object,
+                               &LocalNameInfo,
+                               sizeof(LocalNameInfo),
+                               &ReturnLength);
+    if (Status == STATUS_INFO_LENGTH_MISMATCH)
+    {
+        ObjectNameInfo = ExAllocatePoolWithTag(PagedPool,
+                                               ReturnLength,
+                                               FM_TAG_UNICODE_STRING);
+        if (ObjectNameInfo == NULL) return STATUS_INSUFFICIENT_RESOURCES;
+
+        /* Get the actual name info now we have the buffer to hold it */
+        Status = ObQueryNameString(Object,
+                                   ObjectNameInfo,
+                                   ReturnLength,
+                                   &ReturnLength);
+    }
+
+
+    if (NT_SUCCESS(Status))
+    {
+        /* Make sure the buffer we were passed is large enough to hold the string */
+        if (ObjectName->MaximumLength < ObjectNameInfo->Name.Length)
+        {
+            /* It wasn't, let's enlarge the buffer */
+            Status = FltpReallocateUnicodeString(ObjectName,
+                                                 ObjectNameInfo->Name.Length,
+                                                 FALSE);
+
+        }
+
+        if (NT_SUCCESS(Status))
+        {
+            /* Copy the object name into the callers buffer */
+            RtlCopyUnicodeString(ObjectName, &ObjectNameInfo->Name);
+        }
+    }
+
+    if (ObjectNameInfo)
+    {
+        ExFreePoolWithTag(ObjectNameInfo, FM_TAG_UNICODE_STRING);
+    }
+
+    return Status;
+}