From b59d119c6c6edde6445cc91e95c930bc8b2fe11a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 8 Jun 2009 03:12:03 +0000 Subject: [PATCH] - Rewrite MiniQueryInformation so it creates a NDIS_REQUEST and passes it to MiniDoRequest for processing to reduce code duplication - Call MiniportCoRequest in connection-oriented miniports - Now our NDIS loads all the way to the ASSERT for unsupported media on XP svn path=/trunk/; revision=41348 --- reactos/drivers/network/ndis/ndis/miniport.c | 80 ++++++++++++-------- 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index c5611ff6512..08ed1cd374a 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -666,26 +666,30 @@ MiniQueryInformation( */ { NDIS_STATUS NdisStatus; - ULONG BytesNeeded; - KIRQL OldIrql; + PNDIS_REQUEST NdisRequest; NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); - /* call the miniport's queryinfo handler */ - KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); - NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)( - Adapter->NdisMiniportBlock.MiniportAdapterContext, - Oid, - Buffer, - Size, - BytesWritten, - &BytesNeeded); - KeLowerIrql(OldIrql); + NdisRequest = ExAllocatePool(NonPagedPool, sizeof(NDIS_REQUEST)); + if (!NdisRequest) return NDIS_STATUS_RESOURCES; + + RtlZeroMemory(NdisRequest, sizeof(NDIS_REQUEST)); + + NdisRequest->RequestType = NdisRequestQueryInformation; + NdisRequest->DATA.QUERY_INFORMATION.Oid = Oid; + NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer = Buffer; + NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength = Size; + + NdisStatus = MiniDoRequest(Adapter, NdisRequest); /* FIXME: Wait in pending case! */ ASSERT(NdisStatus != NDIS_STATUS_PENDING); + *BytesWritten = NdisRequest->DATA.QUERY_INFORMATION.BytesWritten; + + ExFreePool(NdisRequest); + return NdisStatus; } @@ -929,30 +933,40 @@ MiniDoRequest( Adapter->NdisMiniportBlock.PendingRequest = NdisRequest; KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); - switch (NdisRequest->RequestType) + if (!Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CoRequestHandler) { - case NdisRequestQueryInformation: - Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)( - Adapter->NdisMiniportBlock.MiniportAdapterContext, - NdisRequest->DATA.QUERY_INFORMATION.Oid, - NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer, - NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength, - (PULONG)&NdisRequest->DATA.QUERY_INFORMATION.BytesWritten, - (PULONG)&NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded); - break; + switch (NdisRequest->RequestType) + { + case NdisRequestQueryInformation: + Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, + NdisRequest->DATA.QUERY_INFORMATION.Oid, + NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer, + NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength, + (PULONG)&NdisRequest->DATA.QUERY_INFORMATION.BytesWritten, + (PULONG)&NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded); + break; - case NdisRequestSetInformation: - Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SetInformationHandler)( - Adapter->NdisMiniportBlock.MiniportAdapterContext, - NdisRequest->DATA.SET_INFORMATION.Oid, - NdisRequest->DATA.SET_INFORMATION.InformationBuffer, - NdisRequest->DATA.SET_INFORMATION.InformationBufferLength, - (PULONG)&NdisRequest->DATA.SET_INFORMATION.BytesRead, - (PULONG)&NdisRequest->DATA.SET_INFORMATION.BytesNeeded); - break; + case NdisRequestSetInformation: + Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SetInformationHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, + NdisRequest->DATA.SET_INFORMATION.Oid, + NdisRequest->DATA.SET_INFORMATION.InformationBuffer, + NdisRequest->DATA.SET_INFORMATION.InformationBufferLength, + (PULONG)&NdisRequest->DATA.SET_INFORMATION.BytesRead, + (PULONG)&NdisRequest->DATA.SET_INFORMATION.BytesNeeded); + break; - default: - Status = NDIS_STATUS_FAILURE; + default: + Status = NDIS_STATUS_FAILURE; + } + } + else + { + Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CoRequestHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, + NULL, /* FIXME */ + NdisRequest); } if (Status != NDIS_STATUS_PENDING) {