2 * PROJECT: Filesystem Filter Manager
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/filters/fltmgr/Context.c
5 * PURPOSE: Contains routines for the volume
6 * PROGRAMMERS: Ged Murphy (gedmurphy@reactos.org)
9 /* INCLUDES ******************************************************************/
12 #include "fltmgrint.h"
18 /* DATA *********************************************************************/
22 /* EXPORTED FUNCTIONS ******************************************************/
26 FltGetVolumeProperties(
27 _In_ PFLT_VOLUME Volume
,
28 _Out_writes_bytes_to_opt_(VolumePropertiesLength
, *LengthReturned
) PFLT_VOLUME_PROPERTIES VolumeProperties
,
29 _In_ ULONG VolumePropertiesLength
,
30 _Out_ PULONG LengthReturned
38 /* Calculate the required buffer size */
39 BufferRequired
= sizeof(FLT_VOLUME_PROPERTIES
) +
40 Volume
->CDODriverName
.Length
+
41 Volume
->DeviceName
.Length
+
42 Volume
->CDODeviceName
.Length
;
44 /* If we don't have enough buffer to fill in the fixed struct, return with the required size */
45 if (VolumePropertiesLength
< sizeof(FLT_VOLUME_PROPERTIES
))
47 *LengthReturned
= BufferRequired
;
48 return STATUS_BUFFER_TOO_SMALL
;
51 /* Clear out the buffer */
52 RtlZeroMemory(VolumeProperties
, sizeof(FLT_VOLUME_PROPERTIES
));
54 /* Fill in the fixed data */
55 VolumeProperties
->DeviceType
= Volume
->DeviceObject
->DeviceType
;
56 VolumeProperties
->DeviceObjectFlags
= Volume
->DeviceObject
->Flags
;
57 VolumeProperties
->AlignmentRequirement
= Volume
->DeviceObject
->AlignmentRequirement
;
58 VolumeProperties
->SectorSize
= Volume
->DeviceObject
->SectorSize
;
59 if (Volume
->DiskDeviceObject
)
61 VolumeProperties
->DeviceCharacteristics
= Volume
->DiskDeviceObject
->Characteristics
;
65 VolumeProperties
->DeviceCharacteristics
= Volume
->DeviceObject
->Characteristics
;
68 /* So far we've written the fixed struct data */
69 BytesWritten
= sizeof(FLT_VOLUME_PROPERTIES
);
70 Ptr
= (PCHAR
)(VolumeProperties
+ 1);
72 /* Make sure we have enough room to add the dynamic data */
73 if (VolumePropertiesLength
>= BufferRequired
)
75 /* Add the FS device name */
76 VolumeProperties
->FileSystemDeviceName
.Length
= 0;
77 VolumeProperties
->FileSystemDeviceName
.MaximumLength
= Volume
->CDODeviceName
.Length
;
78 VolumeProperties
->FileSystemDeviceName
.Buffer
= (PWCH
)Ptr
;
79 RtlCopyUnicodeString(&VolumeProperties
->FileSystemDeviceName
, &Volume
->CDODeviceName
);
80 Ptr
+= VolumeProperties
->FileSystemDeviceName
.Length
;
82 /* Add the driver name */
83 VolumeProperties
->FileSystemDriverName
.Length
= 0;
84 VolumeProperties
->FileSystemDriverName
.MaximumLength
= Volume
->CDODriverName
.Length
;
85 VolumeProperties
->FileSystemDriverName
.Buffer
= (PWCH
)Ptr
;
86 RtlCopyUnicodeString(&VolumeProperties
->FileSystemDriverName
, &Volume
->CDODriverName
);
87 Ptr
+= VolumeProperties
->FileSystemDriverName
.Length
;
89 /* Add the volume name */
90 VolumeProperties
->RealDeviceName
.Length
= 0;
91 VolumeProperties
->RealDeviceName
.MaximumLength
= Volume
->DeviceName
.Length
;
92 VolumeProperties
->RealDeviceName
.Buffer
= (PWCH
)Ptr
;
93 RtlCopyUnicodeString(&VolumeProperties
->RealDeviceName
, &Volume
->DeviceName
);
95 BytesWritten
= BufferRequired
;
97 Status
= STATUS_SUCCESS
;
101 Status
= STATUS_BUFFER_OVERFLOW
;
104 /* Set the number of bytes we wrote and return */
105 *LengthReturned
= BytesWritten
;
110 /* INTERNAL FUNCTIONS ******************************************************/