- Implement handling for IRP_MN_QUERY_STOP_DEVICE

svn path=/trunk/; revision=40790
This commit is contained in:
Cameron Gutman 2009-05-05 01:08:06 +00:00
parent d7e9b1a61f
commit 12594902c9
3 changed files with 76 additions and 0 deletions

View file

@ -55,6 +55,12 @@ ProSendPackets(
IN PPNDIS_PACKET PacketArray,
IN UINT NumberOfPackets);
NTSTATUS
NTAPI
NdisIPnPQueryStopDevice(
IN PDEVICE_OBJECT DeviceObject,
PIRP Irp);
#endif /* __PROTOCOL_H */
/* EOF */

View file

@ -2044,6 +2044,12 @@ NdisIDispatchPnp(
IoCompleteRequest(Irp, IO_NO_INCREMENT);
break;
case IRP_MN_QUERY_STOP_DEVICE:
Status = NdisIPnPQueryStopDevice(DeviceObject, Irp);
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
break;
default:
IoSkipCurrentIrpStackLocation(Irp);
Status = IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);

View file

@ -22,6 +22,70 @@ KSPIN_LOCK ProtocolListLock;
#define WORKER_TEST 0
PNET_PNP_EVENT
ProSetupPnPEvent(
NET_PNP_EVENT_CODE EventCode,
PVOID EventBuffer,
ULONG EventBufferLength)
{
PNET_PNP_EVENT PnPEvent;
PnPEvent = ExAllocatePool(PagedPool, sizeof(NET_PNP_EVENT));
if (!PnPEvent)
return NULL;
RtlZeroMemory(PnPEvent, sizeof(NET_PNP_EVENT));
PnPEvent->NetEvent = EventCode;
PnPEvent->Buffer = EventBuffer;
PnPEvent->BufferLength = EventBufferLength;
return PnPEvent;
}
NTSTATUS
NTAPI
NdisIPnPQueryStopDevice(
IN PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
PLIST_ENTRY CurrentEntry;
PADAPTER_BINDING AdapterBinding;
PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
PNET_PNP_EVENT PnPEvent;
NDIS_STATUS Status;
PnPEvent = ProSetupPnPEvent(NetEventQueryRemoveDevice, NULL, 0);
if (!PnPEvent)
return NDIS_STATUS_RESOURCES;
CurrentEntry = Adapter->ProtocolListHead.Flink;
while (CurrentEntry != &Adapter->ProtocolListHead)
{
AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
Status = (*AdapterBinding->ProtocolBinding->Chars.PnPEventHandler)(
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
PnPEvent);
if (Status == NDIS_STATUS_PENDING)
{
/* We don't handle this yet */
ASSERT(FALSE);
}
else if (Status != NDIS_STATUS_SUCCESS)
{
/* One protocol failed so we can fail the query stop device IRP */
return Status;
}
CurrentEntry = CurrentEntry->Flink;
}
return NDIS_STATUS_SUCCESS;
}
/*
* @implemented