这篇博文是在上一篇基础上修改一下的...如果有不清楚地方可以先看上一篇博文
其实也就是处理一下IRP_MJ_PNP的IRP_MN_QUERY_CAPABILITIES
先上图,
先写个完成例程
NTSTATUS DRIVERWDMTEST_DispatchPnp_IoCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
)
{
KeSetEvent((KEVENT*)Context, 0, FALSE);
return STATUS_MORE_PROCESSING_REQUIRED;
}
重点修改的地方就是pnp
NTSTATUS DRIVERWDMTEST_DispatchPnp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
DEVICE_EXTENSION *pDEX=(DEVICE_EXTENSION*)DeviceObject->DeviceExtension;
IO_STACK_LOCATION *pIOStack=IoGetCurrentIrpStackLocation(Irp);
KdPrint(("DRIVERWDMTEST_DispatchPnp pIOStack->MinorFunction %d ",pIOStack->MinorFunction));
switch(pIOStack->MinorFunction){
case IRP_MN_QUERY_CAPABILITIES:
{
KdPrint(("IRP_MN_QUERY_CAPABILITIES"));
NTSTATUS statusQC=STATUS_SUCCESS;
KEVENT eventWait;
KeInitializeEvent(&eventWait,NotificationEvent,FALSE);
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine(Irp,DRIVERWDMTEST_DispatchPnp_IoCompletion,PVOID)&eventWait,true,true,true);
statusQC=IoCallDriver(pDEX->pStackNextDeviceObject,Irp);
KeWaitForSingleObject(&eventWait,Executive,KernelMode,FALSE,NULL);
pIOStack->Parameters.DeviceCapabilities.Capabilities->Removable=true;//重点在这里
KdPrint(("IRP_MN_QUERY_CAPABILITIES finished"));
return statusQC;
}
default:
IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(pDEX->pStackNextDeviceObject, Irp);
}
return STATUS_SUCCESS;
}