- Handle IRP_MN_QUERY_REMOVE_DEVICE and IRP_MN_CANCEL_REMOVE_DEVICE

- Implement NdisCompletePnPEvent
 - Handle pending cases

svn path=/trunk/; revision=40792
This commit is contained in:
Cameron Gutman 2009-05-05 02:13:53 +00:00
parent 11d957b125
commit 3065a6b84c
3 changed files with 74 additions and 23 deletions

View file

@ -165,26 +165,6 @@ NdisWriteEventLogEntry
*/
/*
* @unimplemented
*/
VOID
EXPORT
NdisCompletePnPEvent(
IN NDIS_STATUS Status,
IN NDIS_HANDLE NdisBindingHandle,
IN PNET_PNP_EVENT NetPnPEvent)
/*
* FUNCTION:
* ARGUMENTS:
* NOTES:
* NDIS 5.0
*/
{
UNIMPLEMENTED
}
/*
* @unimplemented
*/

View file

@ -2044,12 +2044,14 @@ NdisIDispatchPnp(
IoCompleteRequest(Irp, IO_NO_INCREMENT);
break;
case IRP_MN_QUERY_REMOVE_DEVICE:
case IRP_MN_QUERY_STOP_DEVICE:
Status = NdisIPnPQueryStopDevice(DeviceObject, Irp);
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
break;
case IRP_MN_CANCEL_REMOVE_DEVICE:
case IRP_MN_CANCEL_STOP_DEVICE:
Status = NdisIPnPCancelStopDevice(DeviceObject, Irp);
Irp->IoStatus.Status = Status;
@ -2812,5 +2814,65 @@ NdisQueryAdapterInstanceName(
Adapter);
}
/*
* @implemented
*/
VOID
EXPORT
NdisCompletePnPEvent(
IN NDIS_STATUS Status,
IN NDIS_HANDLE NdisBindingHandle,
IN PNET_PNP_EVENT NetPnPEvent)
/*
* FUNCTION:
* ARGUMENTS:
* NOTES:
* NDIS 5.0
*/
{
PIRP Irp = (PIRP)NetPnPEvent->NdisReserved[0];
PLIST_ENTRY CurrentEntry = (PLIST_ENTRY)NetPnPEvent->NdisReserved[1];
PADAPTER_BINDING AdapterBinding = NdisBindingHandle;
PLOGICAL_ADAPTER Adapter = AdapterBinding->Adapter;
NDIS_STATUS NdisStatus;
if (Status != NDIS_STATUS_SUCCESS)
{
ExFreePool(NetPnPEvent);
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return;
}
while (CurrentEntry != &Adapter->ProtocolListHead)
{
AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
NdisStatus = (*AdapterBinding->ProtocolBinding->Chars.PnPEventHandler)(
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
NetPnPEvent);
if (NdisStatus == NDIS_STATUS_PENDING)
{
NetPnPEvent->NdisReserved[1] = (ULONG_PTR)CurrentEntry->Flink;
return;
}
else if (NdisStatus != NDIS_STATUS_SUCCESS)
{
ExFreePool(NetPnPEvent);
Irp->IoStatus.Status = NdisStatus;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return;
}
CurrentEntry = CurrentEntry->Flink;
}
ExFreePool(NetPnPEvent);
Irp->IoStatus.Status = NDIS_STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
/* EOF */

View file

@ -71,8 +71,11 @@ NdisIPnPQueryStopDevice(
if (Status == NDIS_STATUS_PENDING)
{
/* We don't handle this yet */
ASSERT(FALSE);
IoMarkIrpPending(Irp);
/* Yes, I know this is stupid */
PnPEvent->NdisReserved[0] = (ULONG_PTR)Irp;
PnPEvent->NdisReserved[1] = (ULONG_PTR)CurrentEntry->Flink;
return NDIS_STATUS_PENDING;
}
else if (Status != NDIS_STATUS_SUCCESS)
{
@ -115,7 +118,13 @@ NdisIPnPCancelStopDevice(
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
PnPEvent);
/* A protocol should always succeed NetEventCancelRemoveDevice */
if (Status == NDIS_STATUS_PENDING)
{
IoMarkIrpPending(Irp);
PnPEvent->NdisReserved[0] = (ULONG_PTR)Irp;
PnPEvent->NdisReserved[1] = (ULONG_PTR)CurrentEntry->Flink;
return NDIS_STATUS_PENDING;
}
ASSERT(Status == NDIS_STATUS_SUCCESS);