https://git.reactos.org/?p=reactos.git;a=commitdiff;h=887200703ccd580b69492…
commit 887200703ccd580b694929e961357b0f55f1f24d
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Mon Nov 11 18:18:12 2019 +0100
Commit: Pierre Schweitzer <pierre(a)reactos.org>
CommitDate: Mon Nov 11 18:18:32 2019 +0100
[CLASS2] Drop the drive letter hack
---
drivers/storage/class/class2/class2.c | 329 +---------------------------------
1 file changed, 7 insertions(+), 322 deletions(-)
diff --git a/drivers/storage/class/class2/class2.c
b/drivers/storage/class/class2/class2.c
index bf67de960fd..5639f072949 100644
--- a/drivers/storage/class/class2/class2.c
+++ b/drivers/storage/class/class2/class2.c
@@ -13,10 +13,6 @@
#include <include/class2.h>
#include <stdio.h>
-/* Part of the drive letter hack */
-#include <ntifs.h>
-#include <ketypes.h>
-
//#define NDEBUG
#include <debug.h>
@@ -135,315 +131,28 @@ DriverEntry(
return STATUS_SUCCESS;
}
-/* The following hack to assign drive letters with a non-PnP storage stack */
-
-typedef struct _CLASS_DEVICE_INFO {
- ULONG Signature;
- ULONG DeviceType;
- ULONG Partitions;
- ULONG DeviceNumber;
- ULONG DriveNumber;
- PDEVICE_OBJECT LowerDevice;
-} CLASS_DEVICE_INFO, *PCLASS_DEVICE_INFO;
-
-typedef struct _CLASS_DRIVER_EXTENSION {
- ULONG PortNumber;
- UNICODE_STRING RegistryPath;
- CLASS_INIT_DATA InitializationData;
-} CLASS_DRIVER_EXTENSION, *PCLASS_DRIVER_EXTENSION;
-
-VOID
-NTAPI
-ScsiClassRemoveDriveLetter(PCLASS_DEVICE_INFO DeviceInfo)
-{
- WCHAR Buffer1[100];
- UNICODE_STRING DriveLetterU;
- ULONG Index;
-
- DriveLetterU.Buffer = Buffer1;
- DriveLetterU.MaximumLength = sizeof(Buffer1);
-
- /* Delete the symbolic link to PhysicalDriveX */
- DriveLetterU.Length = swprintf(DriveLetterU.Buffer,
L"\\??\\PhysicalDrive%d", DeviceInfo->DriveNumber) * sizeof(WCHAR);
- IoDeleteSymbolicLink(&DriveLetterU);
-
- DbgPrint("HACK: Deleted symbolic link %wZ\n", &DriveLetterU);
-
- for (Index = 0; Index < sizeof(ULONG) * 8; Index++)
- {
- if (DeviceInfo->Partitions & (1 << Index))
- {
- DriveLetterU.Length = swprintf(DriveLetterU.Buffer, L"\\??\\%C:",
('C' + Index)) * sizeof(WCHAR);
- IoDeleteSymbolicLink(&DriveLetterU);
- DbgPrint("HACK: Deleted symbolic link %wZ\n", &DriveLetterU);
- }
- }
-}
-
-NTSTATUS
-NTAPI
-ScsiClassAssignDriveLetter(PCLASS_DEVICE_INFO DeviceInfo)
-{
- WCHAR Buffer1[100];
- WCHAR Buffer2[100];
- UNICODE_STRING DriveLetterU, PartitionU;
- NTSTATUS Status;
- ULONG Index, PartitionNumber, DeviceNumber, DriveNumber;
- OBJECT_ATTRIBUTES ObjectAttributes;
- IO_STATUS_BLOCK Iosb;
- HANDLE PartitionHandle;
-
- /* We assume this device does not current have a drive letter */
-
- Index = 0;
- DeviceNumber = 0;
- DriveNumber = 0;
- PartitionNumber = 1;
- DriveLetterU.Buffer = Buffer1;
- DriveLetterU.MaximumLength = sizeof(Buffer1);
- PartitionU.Buffer = Buffer2;
- PartitionU.MaximumLength = sizeof(Buffer2);
-
- /* Determine the correct disk number */
- do
- {
- /* Check that the disk exists */
- if (DeviceInfo->DeviceType == FILE_DEVICE_DISK)
- {
- PartitionU.Length = swprintf(PartitionU.Buffer,
L"\\Device\\HardDisk%d\\Partition0", DeviceNumber) * sizeof(WCHAR);
- }
- else if (DeviceInfo->DeviceType == FILE_DEVICE_CD_ROM)
- {
- PartitionU.Length = swprintf(PartitionU.Buffer,
L"\\Device\\CdRom%d", DeviceNumber) * sizeof(WCHAR);
- }
-
- InitializeObjectAttributes(&ObjectAttributes,
- &PartitionU,
- OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
- NULL,
- NULL);
- Status = ZwOpenFile(&PartitionHandle,
- FILE_READ_ATTRIBUTES,
- &ObjectAttributes,
- &Iosb,
- 0,
- 0);
- if (!NT_SUCCESS(Status))
- {
- /* Return the last one that worked */
- DeviceNumber--;
- }
- else
- {
- ZwClose(PartitionHandle);
- DeviceNumber++;
- }
- } while (Status == STATUS_SUCCESS);
-
- /* Determine the correct drive number */
- do
- {
- /* Check that the drive exists */
- if (DeviceInfo->DeviceType == FILE_DEVICE_DISK)
- {
- PartitionU.Length = swprintf(PartitionU.Buffer,
L"\\??\\PhysicalDrive%d", DriveNumber) * sizeof(WCHAR);
- }
- else if (DeviceInfo->DeviceType == FILE_DEVICE_CD_ROM)
- {
- PartitionU.Length = swprintf(PartitionU.Buffer, L"\\??\\%C:",
('C' + DriveNumber)) * sizeof(WCHAR);
- }
- InitializeObjectAttributes(&ObjectAttributes,
- &PartitionU,
- OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
- NULL,
- NULL);
- Status = ZwOpenFile(&PartitionHandle,
- FILE_READ_ATTRIBUTES,
- &ObjectAttributes,
- &Iosb,
- 0,
- 0);
- if (NT_SUCCESS(Status))
- {
- ZwClose(PartitionHandle);
- DriveNumber++;
- }
- } while (Status == STATUS_SUCCESS);
-
- if (DeviceInfo->DeviceType == FILE_DEVICE_DISK)
- {
- PartitionU.Length = swprintf(PartitionU.Buffer,
L"\\Device\\Harddisk%d\\Partition0", DeviceNumber) * sizeof(WCHAR);
- DriveLetterU.Length = swprintf(DriveLetterU.Buffer,
L"\\??\\PhysicalDrive%d", DriveNumber) * sizeof(WCHAR);
- }
- else if (DeviceInfo->DeviceType == FILE_DEVICE_CD_ROM)
- {
- PartitionU.Length = swprintf(PartitionU.Buffer, L"\\Device\\CdRom%d",
DeviceNumber) * sizeof(WCHAR);
- DriveLetterU.Length = swprintf(DriveLetterU.Buffer, L"\\??\\%C:",
('C' + DriveNumber)) * sizeof(WCHAR);
- }
-
- /* Create the symbolic link to PhysicalDriveX */
- Status = IoCreateSymbolicLink(&DriveLetterU, &PartitionU);
- if (!NT_SUCCESS(Status))
- {
- /* Failed to create symbolic link */
- DbgPrint("Failed to create symbolic link %wZ -> %wZ with %lx\n",
&PartitionU, &DriveLetterU, Status);
- return Status;
- }
-
- DbgPrint("HACK: Created symbolic link %wZ -> %wZ\n", &PartitionU,
&DriveLetterU);
-
- DeviceInfo->DeviceNumber = DeviceNumber;
- DeviceInfo->DriveNumber = DriveNumber;
-
- if (DeviceInfo->DeviceType == FILE_DEVICE_CD_ROM)
- {
- /* done for cdroms */
- return STATUS_SUCCESS;
- }
-
- while (TRUE)
- {
- /* Check that the disk exists */
- PartitionU.Length = swprintf(PartitionU.Buffer,
L"\\Device\\Harddisk%d\\Partition%d", DeviceNumber, PartitionNumber) *
sizeof(WCHAR);
- InitializeObjectAttributes(&ObjectAttributes,
- &PartitionU,
- OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
- NULL,
- NULL);
- Status = ZwOpenFile(&PartitionHandle,
- FILE_READ_ATTRIBUTES,
- &ObjectAttributes,
- &Iosb,
- 0,
- 0);
- if (!NT_SUCCESS(Status))
- break;
- else
- {
- ZwClose(PartitionHandle);
-
- /* Assign it a drive letter */
- do
- {
- DriveLetterU.Length = swprintf(DriveLetterU.Buffer,
L"\\??\\%C:", ('C' + Index)) * sizeof(WCHAR);
-
- Status = IoCreateSymbolicLink(&DriveLetterU, &PartitionU);
-
- Index++;
- } while (Status != STATUS_SUCCESS);
-
- DeviceInfo->Partitions |= (1 << (Index - 1));
-
- DbgPrint("HACK: Created symbolic link %wZ -> %wZ\n",
&PartitionU, &DriveLetterU);
- PartitionNumber++;
- }
- }
-
- return STATUS_SUCCESS;
-}
-
NTSTATUS
NTAPI
ScsiClassPlugPlay(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- PCLASS_DEVICE_INFO DeviceInfo = DeviceObject->DeviceExtension;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
if (IrpSp->MinorFunction == IRP_MN_START_DEVICE)
{
- ASSERT(DeviceInfo->Signature == '2slc');
- IoSkipCurrentIrpStackLocation(Irp);
- return IoCallDriver(DeviceInfo->LowerDevice, Irp);
- }
- else if (IrpSp->MinorFunction == IRP_MN_REMOVE_DEVICE)
- {
- ASSERT(DeviceInfo->Signature == '2slc');
- ScsiClassRemoveDriveLetter(DeviceInfo);
-
- IoForwardIrpSynchronously(DeviceInfo->LowerDevice, Irp);
-
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- IoDetachDevice(DeviceInfo->LowerDevice);
- IoDeleteDevice(DeviceObject);
return STATUS_SUCCESS;
}
else
{
- if (DeviceInfo->Signature == '2slc')
- {
- IoSkipCurrentIrpStackLocation(Irp);
- return IoCallDriver(DeviceInfo->LowerDevice, Irp);
- }
-
Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_NOT_SUPPORTED;
}
}
-NTSTATUS
-NTAPI
-ScsiClassAddDevice(
- IN PDRIVER_OBJECT DriverObject,
- IN PDEVICE_OBJECT PhysicalDeviceObject)
-{
- PCLASS_DRIVER_EXTENSION DriverExtension = IoGetDriverObjectExtension(DriverObject,
DriverObject);
- PCLASS_DEVICE_INFO DeviceInfo;
- PDEVICE_OBJECT DeviceObject;
- NTSTATUS Status;
-
- if (DriverExtension->InitializationData.ClassFindDevices(DriverObject,
&DriverExtension->RegistryPath, &DriverExtension->InitializationData,
- PhysicalDeviceObject,
DriverExtension->PortNumber))
- {
- /* Create a device object */
- Status = IoCreateDevice(DriverObject,
- sizeof(CLASS_DEVICE_INFO),
- NULL,
- DriverExtension->InitializationData.DeviceType,
- 0,
- FALSE,
- &DeviceObject);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- DeviceInfo = DeviceObject->DeviceExtension;
- RtlZeroMemory(DeviceInfo, sizeof(CLASS_DEVICE_INFO));
- DeviceInfo->Signature = '2slc';
-
- /* Attach it to the PDO */
- DeviceInfo->LowerDevice = IoAttachDeviceToDeviceStack(DeviceObject,
PhysicalDeviceObject);
- DeviceInfo->DeviceType = DriverExtension->InitializationData.DeviceType;
-
- /* Check that the kernel has already assigned drive letters */
- if (KeLoaderBlock == NULL)
- {
- /* Assign a drive letter */
- ScsiClassAssignDriveLetter(DeviceInfo);
- }
- else
- {
- /* The kernel will handle it */
- }
-
- /* Move to the next port number */
- DriverExtension->PortNumber++;
- }
- else
- {
- /* Failed to find device */
- DbgPrint("FAILED TO FIND DEVICE!\n");
- }
-
- return STATUS_SUCCESS;
-}
-/* ---- End hack ---- */
-
ULONG
@@ -477,15 +186,14 @@ Return Value:
PDRIVER_OBJECT DriverObject = Argument1;
+ ULONG portNumber = 0;
PDEVICE_OBJECT portDeviceObject;
NTSTATUS status;
STRING deviceNameString;
UNICODE_STRING unicodeDeviceName;
PFILE_OBJECT fileObject;
CCHAR deviceNameBuffer[256];
- /* BOOLEAN deviceFound = FALSE; See note at the end */
- PCLASS_DRIVER_EXTENSION DriverExtension;
- PUNICODE_STRING RegistryPath = Argument2;
+ BOOLEAN deviceFound = FALSE;
DebugPrint((3,"\n\nSCSI Class Driver\n"));
@@ -516,27 +224,6 @@ Return Value:
return (ULONG) STATUS_REVISION_MISMATCH;
}
- status = IoAllocateDriverObjectExtension(DriverObject,
- DriverObject,
- sizeof(CLASS_DRIVER_EXTENSION),
- (PVOID *)&DriverExtension);
- if (!NT_SUCCESS(status))
- return status;
-
- RtlCopyMemory(&DriverExtension->InitializationData, InitializationData,
sizeof(CLASS_INIT_DATA));
- DriverExtension->PortNumber = 0;
-
- DriverExtension->RegistryPath.Buffer = ExAllocatePool(PagedPool,
RegistryPath->MaximumLength);
- if (!DriverExtension->RegistryPath.Buffer)
- return STATUS_NO_MEMORY;
-
- DriverExtension->RegistryPath.Length = RegistryPath->Length;
- DriverExtension->RegistryPath.MaximumLength = RegistryPath->MaximumLength;
-
- RtlCopyMemory(DriverExtension->RegistryPath.Buffer,
- RegistryPath->Buffer,
- RegistryPath->Length);
-
//
// Update driver object with entry points.
//
@@ -550,7 +237,6 @@ Return Value:
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
ScsiClassDeviceControlDispatch;
DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = ScsiClassShutdownFlush;
DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = ScsiClassShutdownFlush;
- DriverObject->DriverExtension->AddDevice = ScsiClassAddDevice;
if (InitializationData->ClassStartIo) {
DriverObject->DriverStartIo = InitializationData->ClassStartIo;
@@ -562,7 +248,7 @@ Return Value:
do {
- sprintf(deviceNameBuffer, "\\Device\\ScsiPort%lu",
DriverExtension->PortNumber);
+ sprintf(deviceNameBuffer, "\\Device\\ScsiPort%lu", portNumber);
DebugPrint((2, "ScsiClassInitialize: Open Port %s\n",
deviceNameBuffer));
@@ -588,9 +274,9 @@ Return Value:
//
if (InitializationData->ClassFindDevices(DriverObject, Argument2,
InitializationData,
- portDeviceObject,
DriverExtension->PortNumber)) {
+ portDeviceObject, portNumber)) {
- /* deviceFound = TRUE; See note at the end */
+ deviceFound = TRUE;
}
}
@@ -598,12 +284,11 @@ Return Value:
// Check next SCSI adapter.
//
- DriverExtension->PortNumber++;
+ portNumber++;
} while(NT_SUCCESS(status));
- /* We don't want to fail init just because we don't have devices right now
*/
- return STATUS_SUCCESS; /*deviceFound ? STATUS_SUCCESS : STATUS_NO_SUCH_DEVICE;*/
+ return deviceFound ? STATUS_SUCCESS : STATUS_NO_SUCH_DEVICE;
}