mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 12:55:43 +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;
|
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
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
RamdiskPnp(IN PDEVICE_OBJECT DeviceObject,
|
RamdiskPnp(IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
@ -2150,7 +2275,7 @@ RamdiskPnp(IN PDEVICE_OBJECT DeviceObject,
|
||||||
//
|
//
|
||||||
if (DeviceExtension->Type == RamdiskDrive)
|
if (DeviceExtension->Type == RamdiskDrive)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED_DBGBREAK("PnP IRP: %lx\n", Minor);
|
Status = RamdiskQueryId((PRAMDISK_DRIVE_EXTENSION)DeviceExtension, Irp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue