From b68104dd87b61c361c327cf44cc8845436c924ec Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Mon, 21 Oct 2019 16:50:36 +0200 Subject: [PATCH] [DISK] Forcibly declare our partitions to the MountMgr Because our disk.sys doesn't do anything related to PnP (compared to disk_new.sys), forcibly declare our partitions to the MountMgr so that it can references them and assign them a DOS drive letter on demand later on. --- drivers/storage/class/disk/disk.c | 131 ++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/drivers/storage/class/disk/disk.c b/drivers/storage/class/disk/disk.c index 580c89998d9..535de1fcd5d 100644 --- a/drivers/storage/class/disk/disk.c +++ b/drivers/storage/class/disk/disk.c @@ -1068,6 +1068,129 @@ CreateDiskDeviceObjectsExit: } // end CreateDiskDeviceObjects() +VOID +NTAPI +ReportToMountMgr( + IN PDEVICE_OBJECT DiskDeviceObject + ) + +/*++ + +Routine Description: + + This routine reports the creation of a disk device object to the + MountMgr to fake PnP. + +Arguments: + + DiskDeviceObject - Pointer to the created disk device. + +Return Value: + + VOID + +--*/ +{ + NTSTATUS status; + UNICODE_STRING mountMgrDevice; + PDEVICE_OBJECT deviceObject; + PFILE_OBJECT fileObject; + PMOUNTMGR_TARGET_NAME mountTarget; + ULONG diskLen; + PDEVICE_EXTENSION deviceExtension; + PIRP irp; + KEVENT event; + IO_STATUS_BLOCK ioStatus; + + // + // First, get MountMgr DeviceObject. + // + + RtlInitUnicodeString(&mountMgrDevice, MOUNTMGR_DEVICE_NAME); + status = IoGetDeviceObjectPointer(&mountMgrDevice, FILE_READ_ATTRIBUTES, + &fileObject, &deviceObject); + + if (!NT_SUCCESS(status)) { + + DebugPrint((1, + "ReportToMountMgr: Can't get MountMgr pointers %lx\n", + status)); + + return; + } + + deviceExtension = DiskDeviceObject->DeviceExtension; + diskLen = deviceExtension->DeviceName.Length; + + // + // Allocate input buffer to report our partition device. + // + + mountTarget = ExAllocatePool(NonPagedPool, + sizeof(MOUNTMGR_TARGET_NAME) + diskLen); + + if (!mountTarget) { + + DebugPrint((1, + "ReportToMountMgr: Allocation of mountTarget failed\n")); + + ObDereferenceObject(fileObject); + return; + } + + mountTarget->DeviceNameLength = diskLen; + RtlCopyMemory(mountTarget->DeviceName, deviceExtension->DeviceName.Buffer, diskLen); + + KeInitializeEvent(&event, NotificationEvent, FALSE); + + // + // Build the IRP used to communicate with the MountMgr. + // + + irp = IoBuildDeviceIoControlRequest(IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION, + deviceObject, + mountTarget, + sizeof(MOUNTMGR_TARGET_NAME) + diskLen, + NULL, + 0, + FALSE, + &event, + &ioStatus); + + if (!irp) { + + DebugPrint((1, + "ReportToMountMgr: Allocation of irp failed\n")); + + ExFreePool(mountTarget); + ObDereferenceObject(fileObject); + return; + } + + // + // Call the MountMgr. + // + + status = IoCallDriver(deviceObject, irp); + + if (status == STATUS_PENDING) { + KeWaitForSingleObject(&event, Suspended, KernelMode, FALSE, NULL); + status = ioStatus.Status; + } + + // + // We're done. + // + + DPRINT1("Reported to the MountMgr: %lx\n", status); + + ExFreePool(mountTarget); + ObDereferenceObject(fileObject); + + return; +} + + NTSTATUS NTAPI CreatePartitionDeviceObjects( @@ -1460,6 +1583,14 @@ CreatePartitionDeviceObjects( deviceExtension->DeviceObject = deviceObject; deviceExtension->DeviceFlags |= physicalDeviceExtension->DeviceFlags; + // + // Now we're done, report to the MountMgr. + // This is a HACK required to have the driver + // handle the associated DosDevices. + // + + ReportToMountMgr(deviceObject); + } // end for (partitionNumber) ... // -- 2.17.1