diff --git a/drivers/storage/class/cdrom/cdrom.c b/drivers/storage/class/cdrom/cdrom.c index a1c477ef9e5..220eb1fcf4f 100644 --- a/drivers/storage/class/cdrom/cdrom.c +++ b/drivers/storage/class/cdrom/cdrom.c @@ -731,6 +731,130 @@ Return Value: RtlFreeUnicodeString(&unicodeString); } + +VOID +NTAPI +ReportToMountMgr( + IN PDEVICE_OBJECT CdDeviceObject + ) + +/*++ + +Routine Description: + + This routine reports the creation of a cdrom device object to the + MountMgr to fake PnP. + +Arguments: + + CdDeviceObject - Pointer to the created cdrom device. + +Return Value: + + VOID + +--*/ +{ + NTSTATUS status; + UNICODE_STRING mountMgrDevice; + PDEVICE_OBJECT deviceObject; + PFILE_OBJECT fileObject; + PMOUNTMGR_TARGET_NAME mountTarget; + ULONG cdLen; + 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 = CdDeviceObject->DeviceExtension; + cdLen = deviceExtension->DeviceName.Length; + + // + // Allocate input buffer to report our partition device. + // + + mountTarget = ExAllocatePool(NonPagedPool, + sizeof(MOUNTMGR_TARGET_NAME) + cdLen); + + if (!mountTarget) { + + DebugPrint((1, + "ReportToMountMgr: Allocation of mountTarget failed\n")); + + ObDereferenceObject(fileObject); + return; + } + + mountTarget->DeviceNameLength = cdLen; + RtlCopyMemory(mountTarget->DeviceName, deviceExtension->DeviceName.Buffer, cdLen); + + 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) + cdLen, + 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 CreateCdRomDeviceObject( @@ -1323,6 +1447,8 @@ Return Value: ExFreePool(buffer); + ReportToMountMgr(deviceObject); + // // Start the timer now regardless of if Autorun is enabled. // The timer must run forever since IoStopTimer faults. diff --git a/drivers/storage/class/cdrom/precomp.h b/drivers/storage/class/cdrom/precomp.h index 25e00ea68ef..586ddfa59fc 100644 --- a/drivers/storage/class/cdrom/precomp.h +++ b/drivers/storage/class/cdrom/precomp.h @@ -3,5 +3,7 @@ #include #include +#include +#include #endif /* _CDROM_PCH_ */