NTSTATUS NTAPI FsRecVfatFsControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION Stack; NTSTATUS Status; PDEVICE_OBJECT MountDevice; PPACKED_BOOT_SECTOR Bpb = NULL; ULONG SectorSize; LARGE_INTEGER Offset = {{0, 0}}; BOOLEAN DeviceError = FALSE; PAGED_CODE(); /* Get the I/O Stack and check the function type */ Stack = IoGetCurrentIrpStackLocation(Irp); switch (Stack->MinorFunction) { case IRP_MN_MOUNT_VOLUME: /* Assume failure */ Status = STATUS_UNRECOGNIZED_VOLUME; /* Get the device object and request the sector size */ MountDevice = Stack->Parameters.MountVolume.DeviceObject; if (FsRecGetDeviceSectorSize(MountDevice, &SectorSize)) { /* Try to read the BPB */ if (FsRecReadBlock(MountDevice, &Offset, 512, SectorSize, (PVOID)&Bpb, &DeviceError)) { /* Check if it's an actual FAT volume */ if (FsRecIsFatVolume(Bpb)) { /* It is! */ Status = STATUS_FS_DRIVER_REQUIRED; } } /* Free the boot sector if we have one */ ExFreePool(Bpb); } else { /* We have some sort of failure in the storage stack */ DeviceError = TRUE; } /* Check if we have an error on the stack */ if (DeviceError) { /* Was this because of a floppy? */ if (MountDevice->Characteristics & FILE_FLOPPY_DISKETTE) { /* Let the FS try anyway */ Status = STATUS_FS_DRIVER_REQUIRED; } } break; case IRP_MN_LOAD_FILE_SYSTEM: /* Load the file system */ Status = FsRecLoadFileSystem(DeviceObject, L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\fastfat"); break; default: /* Invalid request */ Status = STATUS_INVALID_DEVICE_REQUEST; } /* Return Status */ return Status; }
NTSTATUS UdfsRecFsControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) /*++ Routine Description: This function performs the mount and driver reload functions for this mini- file system recognizer driver. Arguments: DeviceObject - Pointer to this driver's device object. Irp - Pointer to the I/O Request Packet (IRP) representing the function to be performed. Return Value: The function value is the final status of the operation. -*/ { NTSTATUS status; PIO_STACK_LOCATION irpSp; PDEVICE_EXTENSION deviceExtension; UNICODE_STRING driverName; ULONG bytesPerSector; PDEVICE_OBJECT targetDevice; PAGED_CODE(); // // Begin by determining what function that is to be performed. // deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; irpSp = IoGetCurrentIrpStackLocation( Irp ); switch ( irpSp->MinorFunction ) { case IRP_MN_MOUNT_VOLUME: // // Attempt to mount a volume: There are two different cases here: // // 1) The device is being opened for DASD access, that is, no // file system is required, thus it is OK to allow RAW to // to open it. // // 2) We need to rummage the media to see if this is a UDF volume. // status = STATUS_UNRECOGNIZED_VOLUME; targetDevice = irpSp->Parameters.MountVolume.DeviceObject; if (FsRecGetDeviceSectorSize( targetDevice, &bytesPerSector )) { if (IsUdfsVolume( targetDevice, bytesPerSector )) { status = STATUS_FS_DRIVER_REQUIRED; } } break; case IRP_MN_LOAD_FILE_SYSTEM: status = FsRecLoadFileSystem( DeviceObject, L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Udfs" ); break; default: status = STATUS_INVALID_DEVICE_REQUEST; } // // Finally, complete the request and return the same status code to the // caller. // Irp->IoStatus.Status = status; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return status; }
NTSTATUS NTAPI FsRecNtfsFsControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION Stack; NTSTATUS Status; PDEVICE_OBJECT MountDevice; PPACKED_BOOT_SECTOR Bpb = NULL; ULONG SectorSize; LARGE_INTEGER Offset = {{0, 0}}, Offset2, Offset3, SectorCount; PAGED_CODE(); /* Get the I/O Stack and check the function type */ Stack = IoGetCurrentIrpStackLocation(Irp); switch (Stack->MinorFunction) { case IRP_MN_MOUNT_VOLUME: /* Assume failure */ Status = STATUS_UNRECOGNIZED_VOLUME; /* Get the device object and request the sector size */ MountDevice = Stack->Parameters.MountVolume.DeviceObject; if ((FsRecGetDeviceSectorSize(MountDevice, &SectorSize)) && (FsRecGetDeviceSectors(MountDevice, SectorSize, &SectorCount))) { /* Setup other offsets to try */ Offset2.QuadPart = SectorCount.QuadPart >> 1; Offset2.QuadPart *= SectorSize; Offset3.QuadPart = (SectorCount.QuadPart - 1) * SectorSize; /* Try to read the BPB */ if (FsRecReadBlock(MountDevice, &Offset, 512, SectorSize, (PVOID)&Bpb, NULL)) { /* Check if it's an actual NTFS volume */ if (FsRecIsNtfsVolume(Bpb, SectorSize, &SectorCount)) { /* It is! */ Status = STATUS_FS_DRIVER_REQUIRED; } } else if (FsRecReadBlock(MountDevice, &Offset2, 512, SectorSize, (PVOID)&Bpb, NULL)) { /* Check if it's an actual NTFS volume */ if (FsRecIsNtfsVolume(Bpb, SectorSize, &SectorCount)) { /* It is! */ Status = STATUS_FS_DRIVER_REQUIRED; } } else if (FsRecReadBlock(MountDevice, &Offset3, 512, SectorSize, (PVOID)&Bpb, NULL)) { /* Check if it's an actual NTFS volume */ if (FsRecIsNtfsVolume(Bpb, SectorSize, &SectorCount)) { /* It is! */ Status = STATUS_FS_DRIVER_REQUIRED; } } /* Free the boot sector if we have one */ ExFreePool(Bpb); } break; case IRP_MN_LOAD_FILE_SYSTEM: /* Load the file system */ Status = FsRecLoadFileSystem(DeviceObject, L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Ntfs"); break; default: /* Invalid request */ Status = STATUS_INVALID_DEVICE_REQUEST; }