} // 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) ...
//