[FASTFAT] Fix size checking in VfatGetFileNameInformation()
[reactos.git] / drivers / filters / fltmgr / Volume.c
1 /*
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)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include "fltmgr.h"
12 #include "fltmgrint.h"
13
14 #define NDEBUG
15 #include <debug.h>
16
17
18 /* DATA *********************************************************************/
19
20
21
22 /* EXPORTED FUNCTIONS ******************************************************/
23
24 NTSTATUS
25 FLTAPI
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
31 )
32 {
33 ULONG BufferRequired;
34 ULONG BytesWritten;
35 PCHAR Ptr;
36 NTSTATUS Status;
37
38 /* Calculate the required buffer size */
39 BufferRequired = sizeof(FLT_VOLUME_PROPERTIES) +
40 Volume->CDODriverName.Length +
41 Volume->DeviceName.Length +
42 Volume->CDODeviceName.Length;
43
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))
46 {
47 *LengthReturned = BufferRequired;
48 return STATUS_BUFFER_TOO_SMALL;
49 }
50
51 /* Clear out the buffer */
52 RtlZeroMemory(VolumeProperties, sizeof(FLT_VOLUME_PROPERTIES));
53
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)
60 {
61 VolumeProperties->DeviceCharacteristics = Volume->DiskDeviceObject->Characteristics;
62 }
63 else
64 {
65 VolumeProperties->DeviceCharacteristics = Volume->DeviceObject->Characteristics;
66 }
67
68 /* So far we've written the fixed struct data */
69 BytesWritten = sizeof(FLT_VOLUME_PROPERTIES);
70 Ptr = (PCHAR)(VolumeProperties + 1);
71
72 /* Make sure we have enough room to add the dynamic data */
73 if (VolumePropertiesLength >= BufferRequired)
74 {
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;
81
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;
88
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);
94
95 BytesWritten = BufferRequired;
96
97 Status = STATUS_SUCCESS;
98 }
99 else
100 {
101 Status = STATUS_BUFFER_OVERFLOW;
102 }
103
104 /* Set the number of bytes we wrote and return */
105 *LengthReturned = BytesWritten;
106 return Status;
107 }
108
109
110 /* INTERNAL FUNCTIONS ******************************************************/