[FLTMGR]
authorgedmurphy <starwars1>
Thu, 12 Oct 2017 20:06:41 +0000 (21:06 +0100)
committergedmurphy <starwars1>
Thu, 12 Oct 2017 20:06:41 +0000 (21:06 +0100)
- Implement FltGetVolumeProperties
- Internal structs taken from public pdbs

drivers/filters/fltmgr/CMakeLists.txt
drivers/filters/fltmgr/Volume.c [new file with mode: 0644]
drivers/filters/fltmgr/fltmgr.spec
drivers/filters/fltmgr/fltmgrint.h

index f3d52e2..5a02cab 100644 (file)
@@ -7,6 +7,7 @@ list(APPEND SOURCE
     Messaging.c
     Misc.c
     Object.c
+    Volume.c
     ${CMAKE_CURRENT_BINARY_DIR}/fltmgr.def
     fltmgr.h)
 
diff --git a/drivers/filters/fltmgr/Volume.c b/drivers/filters/fltmgr/Volume.c
new file mode 100644 (file)
index 0000000..6a854f7
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+* PROJECT:         Filesystem Filter Manager
+* LICENSE:         GPL - See COPYING in the top level directory
+* FILE:            drivers/filters/fltmgr/Context.c
+* PURPOSE:         Contains routines for the volume
+* PROGRAMMERS:     Ged Murphy (gedmurphy@reactos.org)
+*/
+
+/* INCLUDES ******************************************************************/
+
+#include "fltmgr.h"
+#include "fltmgrint.h"
+
+#define NDEBUG
+#include <debug.h>
+
+
+/* DATA *********************************************************************/
+
+
+
+/* EXPORTED FUNCTIONS ******************************************************/
+
+NTSTATUS
+FLTAPI
+FltGetVolumeProperties(
+    _In_ PFLT_VOLUME Volume,
+    _Out_writes_bytes_to_opt_(VolumePropertiesLength, *LengthReturned) PFLT_VOLUME_PROPERTIES VolumeProperties,
+    _In_ ULONG VolumePropertiesLength,
+    _Out_ PULONG LengthReturned
+)
+{
+    ULONG BufferRequired;
+    ULONG BytesWritten;
+    PCHAR Ptr;
+    NTSTATUS Status;
+
+    /* Calculate the required buffer size */
+    BufferRequired = sizeof(FLT_VOLUME_PROPERTIES) +
+                     Volume->CDODriverName.Length +
+                     Volume->DeviceName.Length +
+                     Volume->CDODeviceName.Length;
+
+    /* If we don't have enough buffer to fill in the fixed struct, return with the required size */
+    if (VolumePropertiesLength < sizeof(FLT_VOLUME_PROPERTIES))
+    {
+        *LengthReturned = BufferRequired;
+        return STATUS_BUFFER_TOO_SMALL;
+    }
+
+    /* Clear out the buffer */
+    RtlZeroMemory(VolumeProperties, sizeof(FLT_VOLUME_PROPERTIES));
+
+    /* Fill in the fixed data */
+    VolumeProperties->DeviceType = Volume->DeviceObject->DeviceType;
+    VolumeProperties->DeviceObjectFlags = Volume->DeviceObject->Flags;
+    VolumeProperties->AlignmentRequirement = Volume->DeviceObject->AlignmentRequirement;
+    VolumeProperties->SectorSize = Volume->DeviceObject->SectorSize;
+    if (Volume->DiskDeviceObject)
+    {
+        VolumeProperties->DeviceCharacteristics = Volume->DiskDeviceObject->Characteristics;
+    }
+    else
+    {
+        VolumeProperties->DeviceCharacteristics = Volume->DeviceObject->Characteristics;
+    }
+
+    /* So far we've written the fixed struct data */
+    BytesWritten = sizeof(FLT_VOLUME_PROPERTIES);
+    Ptr = (PCHAR)(VolumeProperties + 1);
+
+    /* Make sure we have enough room to add the dynamic data */
+    if (VolumePropertiesLength >= BufferRequired)
+    {
+        /* Add the FS device name */
+        VolumeProperties->FileSystemDeviceName.Length = 0;
+        VolumeProperties->FileSystemDeviceName.MaximumLength = Volume->CDODeviceName.Length;
+        VolumeProperties->FileSystemDeviceName.Buffer = (PWCH)Ptr;
+        RtlCopyUnicodeString(&VolumeProperties->FileSystemDeviceName, &Volume->CDODeviceName);
+        Ptr += VolumeProperties->FileSystemDeviceName.Length;
+
+        /* Add the driver name */
+        VolumeProperties->FileSystemDriverName.Length = 0;
+        VolumeProperties->FileSystemDriverName.MaximumLength = Volume->CDODriverName.Length;
+        VolumeProperties->FileSystemDriverName.Buffer = (PWCH)Ptr;
+        RtlCopyUnicodeString(&VolumeProperties->FileSystemDriverName, &Volume->CDODriverName);
+        Ptr += VolumeProperties->FileSystemDriverName.Length;
+
+        /* Add the volume name */
+        VolumeProperties->RealDeviceName.Length = 0;
+        VolumeProperties->RealDeviceName.MaximumLength = Volume->DeviceName.Length;
+        VolumeProperties->RealDeviceName.Buffer = (PWCH)Ptr;
+        RtlCopyUnicodeString(&VolumeProperties->RealDeviceName, &Volume->DeviceName);
+
+        BytesWritten = BufferRequired;
+
+        Status = STATUS_SUCCESS;
+    }
+    else
+    {
+        Status = STATUS_BUFFER_OVERFLOW;
+    }
+
+    /* Set the number of bytes we wrote and return */
+    *LengthReturned = BytesWritten;
+    return Status;
+}
+
+
+/* INTERNAL FUNCTIONS ******************************************************/
\ No newline at end of file
index 9e18cd5..c7094eb 100644 (file)
@@ -7,4 +7,5 @@
  @ stdcall FltBuildDefaultSecurityDescriptor(ptr long)
  @ stdcall FltFreeSecurityDescriptor(ptr)
  @ stdcall FltGetDiskDeviceObject(ptr ptr)
+ @ stdcall FltGetVolumeProperties(ptr ptr long ptr)
 
index e528087..a060b70 100644 (file)
@@ -201,6 +201,114 @@ typedef struct _FLT_PORT_OBJECT
 } FLT_PORT_OBJECT, *PFLT_PORT_OBJECT;
 
 
+typedef enum _FLT_VOLUME_FLAGS
+{
+    VOLFL_NETWORK_FILESYSTEM = 0x1,
+    VOLFL_PENDING_MOUNT_SETUP_NOTIFIES = 0x2,
+    VOLFL_MOUNT_SETUP_NOTIFIES_CALLED = 0x4,
+    VOLFL_MOUNTING = 0x8,
+    VOLFL_SENT_SHUTDOWN_IRP = 0x10,
+    VOLFL_ENABLE_NAME_CACHING = 0x20,
+    VOLFL_FILTER_EVER_ATTACHED = 0x40,
+    VOLFL_STANDARD_LINK_NOT_SUPPORTED = 0x80
+
+} FLT_VOLUME_FLAGS, *PFLT_VOLUME_FLAGS;
+
+
+typedef enum _CALLBACK_NODE_FLAGS
+{
+    CBNFL_SKIP_PAGING_IO = 0x1,
+    CBNFL_SKIP_CACHED_IO = 0x2,
+    CBNFL_USE_NAME_CALLBACK_EX = 0x4,
+    CBNFL_SKIP_NON_DASD_IO = 0x8
+
+} CALLBACK_NODE_FLAGS, *PCALLBACK_NODE_FLAGS;
+
+
+typedef struct _CALLBACK_CTRL
+{
+    LIST_ENTRY OperationLists[50];
+    CALLBACK_NODE_FLAGS OperationFlags[50];
+
+} CALLBACK_CTRL, *PCALLBACK_CTRL;
+
+typedef struct _TREE_ROOT
+{
+    RTL_SPLAY_LINKS *Tree;
+
+} TREE_ROOT, *PTREE_ROOT;
+
+
+typedef struct _CONTEXT_LIST_CTRL
+{
+    TREE_ROOT List;
+
+} CONTEXT_LIST_CTRL, *PCONTEXT_LIST_CTRL;
+
+typedef struct _NAME_CACHE_LIST_CTRL_STATS
+{
+    ULONG Searches;
+    ULONG Hits;
+    ULONG Created;
+    ULONG Temporary;
+    ULONG Duplicate;
+    ULONG Removed;
+    ULONG RemovedDueToCase;
+
+} NAME_CACHE_LIST_CTRL_STATS, *PNAME_CACHE_LIST_CTRL_STATS;
+
+
+typedef struct _NAME_CACHE_VOLUME_CTRL_STATS
+{
+    ULONG AllContextsTemporary;
+    ULONG PurgeNameCache;
+    NAME_CACHE_LIST_CTRL_STATS NormalizedNames;
+    NAME_CACHE_LIST_CTRL_STATS OpenedNames;
+    NAME_CACHE_LIST_CTRL_STATS ShortNames;
+    ULONG AncestorLookup;
+    ULONG ParentHit;
+    ULONG NonParentHit;
+
+} NAME_CACHE_VOLUME_CTRL_STATS, *PNAME_CACHE_VOLUME_CTRL_STATS;
+
+
+typedef struct _NAME_CACHE_VOLUME_CTRL
+{
+    FAST_MUTEX Lock;
+    ULONG AllContextsTemporary;
+    LARGE_INTEGER LastRenameCompleted;
+    NAME_CACHE_VOLUME_CTRL_STATS Stats;
+
+} NAME_CACHE_VOLUME_CTRL, *PNAME_CACHE_VOLUME_CTRL;
+
+
+typedef struct _FLT_VOLUME
+{
+    FLT_OBJECT Base;
+    FLT_VOLUME_FLAGS Flags;
+    FLT_FILESYSTEM_TYPE FileSystemType;
+    PDEVICE_OBJECT DeviceObject;
+    PDEVICE_OBJECT DiskDeviceObject;
+    PFLT_VOLUME FrameZeroVolume;
+    PFLT_VOLUME VolumeInNextFrame;
+    PFLTP_FRAME Frame;
+    UNICODE_STRING DeviceName;
+    UNICODE_STRING GuidName;
+    UNICODE_STRING CDODeviceName;
+    UNICODE_STRING CDODriverName;
+    FLT_RESOURCE_LIST_HEAD InstanceList;
+    CALLBACK_CTRL Callbacks;
+    EX_PUSH_LOCK ContextLock;
+    CONTEXT_LIST_CTRL VolumeContexts;
+    FLT_RESOURCE_LIST_HEAD StreamListCtrls;
+    FLT_RESOURCE_LIST_HEAD FileListCtrls;
+    NAME_CACHE_VOLUME_CTRL NameCacheCtrl;
+    ERESOURCE MountNotifyLock;
+    ULONG TargetedOpenActiveCount;
+    EX_PUSH_LOCK TxVolContextListLock;
+    TREE_ROOT TxVolContexts;
+
+} FLT_VOLUME, *PFLT_VOLUME;