Author: hpoussin
Date: Thu Sep 28 20:33:12 2006
New Revision: 24286
URL:
http://svn.reactos.org/svn/reactos?rev=24286&view=rev
Log:
Support mount manager in disk.sys
Modified:
trunk/reactos/drivers/storage/disk/disk.c
Modified: trunk/reactos/drivers/storage/disk/disk.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/disk/disk.…
==============================================================================
--- trunk/reactos/drivers/storage/disk/disk.c (original)
+++ trunk/reactos/drivers/storage/disk/disk.c Thu Sep 28 20:33:12 2006
@@ -16,8 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: services/storage/disk/disk.c
@@ -31,6 +30,8 @@
#include <ntdddisk.h>
#include <scsi.h>
#include <ntddscsi.h>
+#include <mountdev.h>
+#include <mountmgr.h>
#include <include/class2.h>
#include <stdio.h>
@@ -849,6 +850,62 @@
DiskData->HiddenSectors = PartitionEntry->HiddenSectors;
DiskData->BootIndicator = PartitionEntry->BootIndicator;
DiskData->DriveNotReady = FALSE;
+
+ /* Tell mount manager that we have a new partition for him. This should be
replaced
+ * by the registration of MOUNTDEV_MOUNTED_DEVICE_GUID interface on partition
PDO.
+ */
+ {
+ UNICODE_STRING MountManagerU = RTL_CONSTANT_STRING(MOUNTMGR_DEVICE_NAME);
+ IO_STATUS_BLOCK IoStatusBlock;
+ ULONG Length = strlen(NameBuffer2) * sizeof(WCHAR);
+ PMOUNTMGR_TARGET_NAME TargetName;
+ HANDLE hMountManager;
+ InitializeObjectAttributes(
+ &ObjectAttributes,
+ &MountManagerU,
+ 0,
+ NULL,
+ NULL);
+ Status = NtOpenFile(&hMountManager, FILE_READ_ACCESS, &ObjectAttributes,
&IoStatusBlock, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("NtOpenFile(%wZ) failed with status 0x%08lx\n",
&MountManagerU, Status);
+ }
+ else
+ {
+ TargetName = ExAllocatePool(PagedPool, FIELD_OFFSET(MOUNTMGR_TARGET_NAME,
DeviceName) + Length + sizeof(UNICODE_NULL));
+ if (!TargetName)
+ {
+ DPRINT("ExAllocatePool() failed\n");
+ }
+ else
+ {
+ TargetName->DeviceNameLength = Length;
+ swprintf(
+ TargetName->DeviceName,
+ L"\\Device\\Harddisk%lu\\Partition%lu",
+ DiskNumber,
+ PartitionNumber + 1);
+ Status = NtDeviceIoControlFile(
+ hMountManager,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION,
+ TargetName, FIELD_OFFSET(MOUNTMGR_TARGET_NAME, DeviceName) + Length,
+ NULL, 0);
+ if (NT_SUCCESS(Status))
+ Status = NtWaitForSingleObject(hMountManager, FALSE, NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("NtDeviceIoControlFile() failed with status
0x%08lx\n", Status);
+ }
+ ExFreePool(TargetName);
+ }
+ NtClose(hMountManager);
+ }
+ }
}
else
{
@@ -1589,6 +1646,76 @@
break;
}
+ case IOCTL_MOUNTDEV_QUERY_DEVICE_NAME:
+ {
+ WCHAR NameBuffer[80];
+ PMOUNTDEV_NAME pMountDevName;
+ ULONG NameLength;
+ DPRINT("IOCTL_MOUNTDEV_QUERY_DEVICE_NAME\n");
+ if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(MOUNTDEV_NAME))
+ {
+ Status = STATUS_BUFFER_TOO_SMALL;
+ Information = 0;
+ }
+ else
+ {
+ pMountDevName = (PMOUNTDEV_NAME)Irp->AssociatedIrp.SystemBuffer;
+ swprintf(NameBuffer,
+ L"\\Device\\Harddisk%lu\\Partition%lu",
+ DeviceExtension->DeviceNumber,
+ ((PDISK_DATA)(DeviceExtension + 1))->PartitionNumber);
+ NameLength = wcslen(NameBuffer) * sizeof(WCHAR);
+ pMountDevName->NameLength = NameLength;
+ if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength <
FIELD_OFFSET(MOUNTDEV_NAME, Name) + NameLength)
+ {
+ Information = sizeof(MOUNTDEV_NAME);
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ RtlCopyMemory(pMountDevName->Name, NameBuffer, NameLength);
+ Information = FIELD_OFFSET(MOUNTDEV_NAME, Name) + NameLength;
+ Status = STATUS_SUCCESS;
+ }
+ }
+ break;
+ }
+
+ case IOCTL_MOUNTDEV_QUERY_UNIQUE_ID:
+ {
+ WCHAR NameBuffer[80];
+ PMOUNTDEV_UNIQUE_ID pMountDevUniqueId;
+ ULONG UniqueIdLength;
+ DPRINT("IOCTL_MOUNTDEV_QUERY_UNIQUE_ID\n");
+ if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(MOUNTDEV_NAME))
+ {
+ Status = STATUS_BUFFER_TOO_SMALL;
+ Information = 0;
+ }
+ else
+ {
+ pMountDevUniqueId =
(PMOUNTDEV_UNIQUE_ID)Irp->AssociatedIrp.SystemBuffer;
+ swprintf(NameBuffer,
+ L"\\Device\\Harddisk%lu\\Partition%lu",
+ DeviceExtension->DeviceNumber,
+ ((PDISK_DATA)(DeviceExtension + 1))->PartitionNumber);
+ UniqueIdLength = wcslen(NameBuffer) * sizeof(WCHAR);
+ pMountDevUniqueId->UniqueIdLength = UniqueIdLength;
+ if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength <
FIELD_OFFSET(MOUNTDEV_UNIQUE_ID, UniqueId) + UniqueIdLength)
+ {
+ Information = sizeof(MOUNTDEV_UNIQUE_ID);
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ RtlCopyMemory(pMountDevUniqueId->UniqueId, NameBuffer,
UniqueIdLength);
+ Information = FIELD_OFFSET(MOUNTDEV_UNIQUE_ID, UniqueId) +
UniqueIdLength;
+ Status = STATUS_SUCCESS;
+ }
+ }
+ break;
+ }
+
default:
/* Call the common device control function */
return(ScsiClassDeviceControl(DeviceObject, Irp));