mirror of
https://github.com/reactos/reactos.git
synced 2025-05-21 10:05:35 +00:00
[RAMDISK]
Implement RamdiskQueryId() which is used in case of IRP_MJ_PNP + IRP_MN_QUERY_ID svn path=/trunk/; revision=65895
This commit is contained in:
parent
4037b3b7c0
commit
ff098a27eb
1 changed files with 126 additions and 1 deletions
|
@ -2022,6 +2022,131 @@ RamdiskRemoveBusDevice(IN PDEVICE_OBJECT DeviceObject,
|
|||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
RamdiskQueryId(IN PRAMDISK_DRIVE_EXTENSION DriveExtension,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PIO_STACK_LOCATION IoStackLocation;
|
||||
PWSTR OutputString = NULL;
|
||||
ULONG StringLength;
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
//
|
||||
// Get what is being queried
|
||||
//
|
||||
switch (IoStackLocation->Parameters.QueryId.IdType)
|
||||
{
|
||||
case BusQueryDeviceID:
|
||||
|
||||
//
|
||||
// Allocate a buffer long enough to receive Ramdisk\RamDisk in any case
|
||||
// In case we don't have RAMDISK_REGISTRY_DISK, we then need two more
|
||||
// chars to store Ramdisk\RamVolume instead
|
||||
//
|
||||
StringLength = 4 * (DriveExtension->DiskType != RAMDISK_REGISTRY_DISK) + sizeof(L"Ramdisk\\RamDisk");
|
||||
OutputString = ExAllocatePoolWithTag(PagedPool, StringLength, 'dmaR');
|
||||
if (OutputString == NULL)
|
||||
{
|
||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
break;
|
||||
}
|
||||
|
||||
wcsncpy(OutputString, L"Ramdisk\\", StringLength / sizeof(WCHAR));
|
||||
if (DriveExtension->DiskType != RAMDISK_REGISTRY_DISK)
|
||||
{
|
||||
wcsncat(OutputString, L"RamVolume", StringLength / sizeof(WCHAR));
|
||||
}
|
||||
else
|
||||
{
|
||||
wcsncat(OutputString, L"RamDisk", StringLength / sizeof(WCHAR));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case BusQueryHardwareIDs:
|
||||
|
||||
//
|
||||
// Allocate a buffer long enough to receive Ramdisk\RamDisk in any case
|
||||
// In case we don't have RAMDISK_REGISTRY_DISK, we then need two more
|
||||
// chars to store Ramdisk\RamVolume instead
|
||||
// We also need an extra char, because it is required that the string
|
||||
// is null-terminated twice
|
||||
//
|
||||
StringLength = 4 * (DriveExtension->DiskType != RAMDISK_REGISTRY_DISK) +
|
||||
sizeof(UNICODE_NULL) + sizeof(L"Ramdisk\\RamDisk");
|
||||
OutputString = ExAllocatePoolWithTag(PagedPool, StringLength, 'dmaR');
|
||||
if (OutputString == NULL)
|
||||
{
|
||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
break;
|
||||
}
|
||||
|
||||
wcsncpy(OutputString, L"Ramdisk\\", StringLength / sizeof(WCHAR));
|
||||
if (DriveExtension->DiskType != RAMDISK_REGISTRY_DISK)
|
||||
{
|
||||
wcsncat(OutputString, L"RamVolume", StringLength / sizeof(WCHAR));
|
||||
}
|
||||
else
|
||||
{
|
||||
wcsncat(OutputString, L"RamDisk", StringLength / sizeof(WCHAR));
|
||||
}
|
||||
OutputString[(StringLength / sizeof(WCHAR)) - 1] = UNICODE_NULL;
|
||||
|
||||
break;
|
||||
|
||||
case BusQueryCompatibleIDs:
|
||||
|
||||
if (DriveExtension->DiskType != RAMDISK_REGISTRY_DISK)
|
||||
{
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
break;
|
||||
}
|
||||
|
||||
StringLength = sizeof(L"GenDisk");
|
||||
OutputString = ExAllocatePoolWithTag(PagedPool, StringLength, 'dmaR');
|
||||
if (OutputString == NULL)
|
||||
{
|
||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
break;
|
||||
}
|
||||
|
||||
wcsncpy(OutputString, L"GenDisk", StringLength / sizeof(WCHAR));
|
||||
OutputString[(StringLength / sizeof(WCHAR)) - 1] = UNICODE_NULL;
|
||||
|
||||
break;
|
||||
|
||||
case BusQueryInstanceID:
|
||||
|
||||
OutputString = ExAllocatePoolWithTag(PagedPool, DriveExtension->GuidString.MaximumLength, 'dmaR');
|
||||
if (OutputString == NULL)
|
||||
{
|
||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
break;
|
||||
}
|
||||
|
||||
wcsncpy(OutputString, DriveExtension->GuidString.Buffer, DriveExtension->GuidString.MaximumLength / sizeof(WCHAR));
|
||||
|
||||
break;
|
||||
|
||||
case BusQueryDeviceSerialNumber:
|
||||
|
||||
//
|
||||
// Nothing to do
|
||||
//
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
Irp->IoStatus.Status = Status;
|
||||
Irp->IoStatus.Information = (ULONG_PTR)OutputString;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
RamdiskPnp(IN PDEVICE_OBJECT DeviceObject,
|
||||
|
@ -2150,7 +2275,7 @@ RamdiskPnp(IN PDEVICE_OBJECT DeviceObject,
|
|||
//
|
||||
if (DeviceExtension->Type == RamdiskDrive)
|
||||
{
|
||||
UNIMPLEMENTED_DBGBREAK("PnP IRP: %lx\n", Minor);
|
||||
Status = RamdiskQueryId((PRAMDISK_DRIVE_EXTENSION)DeviceExtension, Irp);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in a new issue