[FASTFAT] Fix size checking in VfatGetFileNameInformation()
[reactos.git] / drivers / filesystems / fs_rec / ntfs.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS File System Recognizer
4 * FILE: drivers/filesystems/fs_rec/ntfs.c
5 * PURPOSE: NTFS Recognizer
6 * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
7 * Eric Kohl
8 */
9
10 /* INCLUDES *****************************************************************/
11
12 #include "fs_rec.h"
13
14 #define NDEBUG
15 #include <debug.h>
16
17 /* FUNCTIONS ****************************************************************/
18
19 BOOLEAN
20 NTAPI
21 FsRecIsNtfsVolume(IN PPACKED_BOOT_SECTOR BootSector,
22 IN ULONG BytesPerSector,
23 IN PLARGE_INTEGER NumberOfSectors)
24 {
25 /* Assume failure */
26 BOOLEAN Result = FALSE;
27
28 UNREFERENCED_PARAMETER(BytesPerSector);
29 UNREFERENCED_PARAMETER(NumberOfSectors);
30
31 PAGED_CODE();
32
33 if ((BootSector->Oem[0] == 'N') &&
34 (BootSector->Oem[1] == 'T') &&
35 (BootSector->Oem[2] == 'F') &&
36 (BootSector->Oem[3] == 'S') &&
37 (BootSector->Oem[4] == ' ') &&
38 (BootSector->Oem[5] == ' ') &&
39 (BootSector->Oem[6] == ' ') &&
40 (BootSector->Oem[7] == ' '))
41 {
42 /* Success */
43 Result = TRUE;
44 }
45
46 /* Return the result */
47 return Result;
48 }
49
50 NTSTATUS
51 NTAPI
52 FsRecNtfsFsControl(IN PDEVICE_OBJECT DeviceObject,
53 IN PIRP Irp)
54 {
55 PIO_STACK_LOCATION Stack;
56 NTSTATUS Status;
57 PDEVICE_OBJECT MountDevice;
58 PPACKED_BOOT_SECTOR Bpb = NULL;
59 ULONG SectorSize;
60 LARGE_INTEGER Offset = {{0, 0}}, Offset2, Offset3, SectorCount;
61 PAGED_CODE();
62
63 /* Get the I/O Stack and check the function type */
64 Stack = IoGetCurrentIrpStackLocation(Irp);
65 switch (Stack->MinorFunction)
66 {
67 case IRP_MN_MOUNT_VOLUME:
68
69 /* Assume failure */
70 Status = STATUS_UNRECOGNIZED_VOLUME;
71
72 /* Get the device object and request the sector size */
73 MountDevice = Stack->Parameters.MountVolume.DeviceObject;
74 if ((FsRecGetDeviceSectorSize(MountDevice, &SectorSize)) &&
75 (FsRecGetDeviceSectors(MountDevice, SectorSize, &SectorCount)))
76 {
77 /* Setup other offsets to try */
78 Offset2.QuadPart = SectorCount.QuadPart >> 1;
79 Offset2.QuadPart *= SectorSize;
80 Offset3.QuadPart = (SectorCount.QuadPart - 1) * SectorSize;
81
82 /* Try to read the BPB */
83 if (FsRecReadBlock(MountDevice,
84 &Offset,
85 512,
86 SectorSize,
87 (PVOID)&Bpb,
88 NULL))
89 {
90 /* Check if it's an actual NTFS volume */
91 if (FsRecIsNtfsVolume(Bpb, SectorSize, &SectorCount))
92 {
93 /* It is! */
94 Status = STATUS_FS_DRIVER_REQUIRED;
95 }
96 }
97 else if (FsRecReadBlock(MountDevice,
98 &Offset2,
99 512,
100 SectorSize,
101 (PVOID)&Bpb,
102 NULL))
103 {
104 /* Check if it's an actual NTFS volume */
105 if (FsRecIsNtfsVolume(Bpb, SectorSize, &SectorCount))
106 {
107 /* It is! */
108 Status = STATUS_FS_DRIVER_REQUIRED;
109 }
110 }
111 else if (FsRecReadBlock(MountDevice,
112 &Offset3,
113 512,
114 SectorSize,
115 (PVOID)&Bpb,
116 NULL))
117 {
118 /* Check if it's an actual NTFS volume */
119 if (FsRecIsNtfsVolume(Bpb, SectorSize, &SectorCount))
120 {
121 /* It is! */
122 Status = STATUS_FS_DRIVER_REQUIRED;
123 }
124 }
125
126 /* Free the boot sector if we have one */
127 ExFreePool(Bpb);
128 }
129 break;
130
131 case IRP_MN_LOAD_FILE_SYSTEM:
132
133 /* Load the file system */
134 Status = FsRecLoadFileSystem(DeviceObject,
135 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Ntfs");
136 break;
137
138 default:
139
140 /* Invalid request */
141 Status = STATUS_INVALID_DEVICE_REQUEST;
142 }
143
144 /* Return Status */
145 return Status;
146 }
147
148 /* EOF */