[ISAPNP] Implement IRP_MN_QUERY_CAPABILITIES + IRP_MN_QUERY_ID

This commit is contained in:
Hervé Poussineau 2020-02-10 21:31:28 +01:00
parent c96ba5a713
commit 4788676671
2 changed files with 111 additions and 0 deletions

View file

@ -2,6 +2,7 @@
#define _ISAPNP_PCH_
#include <wdm.h>
#include <ntstrsafe.h>
#ifdef __cplusplus
extern "C" {

View file

@ -35,6 +35,108 @@ IsaPdoQueryDeviceRelations(
return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
IsaPdoQueryCapabilities(
IN PISAPNP_LOGICAL_DEVICE LogDev,
IN PIRP Irp,
IN PIO_STACK_LOCATION IrpSp)
{
PDEVICE_CAPABILITIES DeviceCapabilities;
DeviceCapabilities = IrpSp->Parameters.DeviceCapabilities.Capabilities;
if (DeviceCapabilities->Version != 1)
return STATUS_UNSUCCESSFUL;
DeviceCapabilities->UniqueID = LogDev->SerialNumber != 0xffffffff;
DeviceCapabilities->Address = LogDev->CSN;
return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
IsaPdoQueryId(
IN PISAPNP_LOGICAL_DEVICE LogDev,
IN PIRP Irp,
IN PIO_STACK_LOCATION IrpSp)
{
WCHAR Temp[256];
PWCHAR Buffer, End;
ULONG Length;
NTSTATUS Status;
switch (IrpSp->Parameters.QueryId.IdType)
{
case BusQueryDeviceID:
{
DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
Status = RtlStringCbPrintfExW(Temp, sizeof(Temp),
&End,
NULL, 0,
L"ISAPNP\\%3S%04X",
LogDev->VendorId,
LogDev->ProdId);
if (!NT_SUCCESS(Status))
return Status;
Length = End - Temp;
Temp[Length++] = UNICODE_NULL;
break;
}
case BusQueryHardwareIDs:
DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n");
Status = RtlStringCbPrintfExW(Temp, sizeof(Temp),
&End,
NULL, 0,
L"ISAPNP\\%3S%04X",
LogDev->VendorId,
LogDev->ProdId);
if (!NT_SUCCESS(Status))
return Status;
Length = End - Temp;
Temp[Length++] = UNICODE_NULL;
Status = RtlStringCbPrintfExW(Temp + Length, sizeof(Temp) - Length,
&End,
NULL, 0,
L"*%3S%04X",
LogDev->VendorId,
LogDev->ProdId);
if (!NT_SUCCESS(Status))
return Status;
Length = End - Temp;
Temp[Length++] = UNICODE_NULL;
Temp[Length++] = UNICODE_NULL;
break;
case BusQueryInstanceID:
DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n");
Status = RtlStringCbPrintfExW(Temp, sizeof(Temp),
&End,
NULL, 0,
L"%u",
LogDev->SerialNumber);
if (!NT_SUCCESS(Status))
return Status;
Length = End - Temp;
Temp[Length++] = UNICODE_NULL;
break;
default:
DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / unknown query id type 0x%lx\n",
IrpSp->Parameters.QueryId.IdType);
return Irp->IoStatus.Status;
}
Buffer = ExAllocatePool(PagedPool, Length * sizeof(WCHAR));
if (!Buffer)
return STATUS_NO_MEMORY;
RtlCopyMemory(Buffer, Temp, Length * sizeof(WCHAR));
Irp->IoStatus.Information = (ULONG_PTR)Buffer;
return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
IsaPdoPnp(
@ -64,6 +166,10 @@ IsaPdoPnp(
Status = IsaPdoQueryDeviceRelations(LogDev, Irp, IrpSp);
break;
case IRP_MN_QUERY_CAPABILITIES:
Status = IsaPdoQueryCapabilities(LogDev, Irp, IrpSp);
break;
case IRP_MN_QUERY_RESOURCES:
DPRINT1("IRP_MN_QUERY_RESOURCES is UNIMPLEMENTED!\n");
break;
@ -72,6 +178,10 @@ IsaPdoPnp(
DPRINT1("IRP_MN_QUERY_RESOURCE_REQUIREMENTS is UNIMPLEMENTED!\n");
break;
case IRP_MN_QUERY_ID:
Status = IsaPdoQueryId(LogDev, Irp, IrpSp);
break;
default:
DPRINT1("Unknown PnP code: %x\n", IrpSp->MinorFunction);
break;