Author: pschweitzer Date: Thu Jan 22 11:25:28 2009 New Revision: 39025
URL: http://svn.reactos.org/svn/reactos?rev=39025&view=rev Log: - Implemented FatPerformDevIoCtrl - Use it while mounting new volume to get the right sector size. This fixes a TODO (that was looking as a hack :p)
Modified: trunk/reactos/drivers/filesystems/fastfat_new/device.c trunk/reactos/drivers/filesystems/fastfat_new/fastfat.h trunk/reactos/drivers/filesystems/fastfat_new/fsctl.c
Modified: trunk/reactos/drivers/filesystems/fastfat_new/device.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat... ============================================================================== --- trunk/reactos/drivers/filesystems/fastfat_new/device.c [iso-8859-1] (original) +++ trunk/reactos/drivers/filesystems/fastfat_new/device.c [iso-8859-1] Thu Jan 22 11:25:28 2009 @@ -21,4 +21,51 @@ return STATUS_NOT_IMPLEMENTED; }
+NTSTATUS +FatPerformDevIoCtrl(PDEVICE_OBJECT DeviceObject, + ULONG ControlCode, + PVOID InputBuffer, + ULONG InputBufferSize, + PVOID OutputBuffer, + ULONG OutputBufferSize, + BOOLEAN Override) +{ + PIRP Irp; + KEVENT Event; + NTSTATUS Status; + PIO_STACK_LOCATION Stack; + IO_STATUS_BLOCK IoStatus; + + KeInitializeEvent(&Event, NotificationEvent, FALSE); + + Irp = IoBuildDeviceIoControlRequest(ControlCode, + DeviceObject, + InputBuffer, + InputBufferSize, + OutputBuffer, + OutputBufferSize, + FALSE, + &Event, + &IoStatus); + if (Irp == NULL) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + if (Override) + { + Stack = IoGetNextIrpStackLocation(Irp); + Stack->Flags |= SL_OVERRIDE_VERIFY_VOLUME; + } + + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL); + Status = IoStatus.Status; + } + + return Status; +} + /* EOF */
Modified: trunk/reactos/drivers/filesystems/fastfat_new/fastfat.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat... ============================================================================== --- trunk/reactos/drivers/filesystems/fastfat_new/fastfat.h [iso-8859-1] (original) +++ trunk/reactos/drivers/filesystems/fastfat_new/fastfat.h [iso-8859-1] Thu Jan 22 11:25:28 2009 @@ -342,6 +342,15 @@ NTSTATUS NTAPI FatDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS +FatPerformDevIoCtrl(PDEVICE_OBJECT DeviceObject, + ULONG ControlCode, + PVOID InputBuffer, + ULONG InputBufferSize, + PVOID OutputBuffer, + ULONG OutputBufferSize, + BOOLEAN Override); + /* ------------------------------------------------------ direntry.c */
/* ----------------------------------------------------------- fcb.c */
Modified: trunk/reactos/drivers/filesystems/fastfat_new/fsctl.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat... ============================================================================== --- trunk/reactos/drivers/filesystems/fastfat_new/fsctl.c [iso-8859-1] (original) +++ trunk/reactos/drivers/filesystems/fastfat_new/fsctl.c [iso-8859-1] Thu Jan 22 11:25:28 2009 @@ -55,6 +55,7 @@ PDEVICE_OBJECT FsDeviceObject) { NTSTATUS Status; + DISK_GEOMETRY DiskGeometry; PVOLUME_DEVICE_OBJECT VolumeDevice;
DPRINT1("FatMountVolume()\n"); @@ -89,8 +90,18 @@ /* Init stack size */ VolumeDevice->DeviceObject.StackSize = TargetDeviceObject->StackSize + 1;
- /* TODO: IOCTL_DISK_GET_DRIVE_GEOMETRY to obtain BytesPerSector */ - VolumeDevice->DeviceObject.SectorSize = 512; + /* Get sector size */ + Status = FatPerformDevIoCtrl(TargetDeviceObject, + IOCTL_DISK_GET_DRIVE_GEOMETRY, + NULL, + 0, + &DiskGeometry, + sizeof(DISK_GEOMETRY), + TRUE); + + if (!NT_SUCCESS(Status)) return Status; + + VolumeDevice->DeviceObject.SectorSize = DiskGeometry.BytesPerSector;
/* Signal we're done with initializing */ VolumeDevice->DeviceObject.Flags &= ~DO_DEVICE_INITIALIZING;