mirror of
https://github.com/reactos/reactos.git
synced 2025-04-25 16:10:29 +00:00
- Implement handling for IRP_MN_QUERY_STOP_DEVICE
svn path=/trunk/; revision=40790
This commit is contained in:
parent
d7e9b1a61f
commit
12594902c9
3 changed files with 76 additions and 0 deletions
|
@ -55,6 +55,12 @@ ProSendPackets(
|
||||||
IN PPNDIS_PACKET PacketArray,
|
IN PPNDIS_PACKET PacketArray,
|
||||||
IN UINT NumberOfPackets);
|
IN UINT NumberOfPackets);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
NdisIPnPQueryStopDevice(
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
PIRP Irp);
|
||||||
|
|
||||||
#endif /* __PROTOCOL_H */
|
#endif /* __PROTOCOL_H */
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -2044,6 +2044,12 @@ NdisIDispatchPnp(
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
|
Status = NdisIPnPQueryStopDevice(DeviceObject, Irp);
|
||||||
|
Irp->IoStatus.Status = Status;
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
IoSkipCurrentIrpStackLocation(Irp);
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
Status = IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);
|
Status = IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);
|
||||||
|
|
|
@ -22,6 +22,70 @@ KSPIN_LOCK ProtocolListLock;
|
||||||
|
|
||||||
#define WORKER_TEST 0
|
#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
|
* @implemented
|
||||||
|
|
Loading…
Reference in a new issue