} // end CreateDiskDeviceObjects()
\f
+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;
+}
+
+\f
NTSTATUS
NTAPI
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) ...
//