mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 18:33:10 +00:00
- Protect MiniportBusy with a spin lock
- Adapter is PLOGICAL_ADAPTER not PNDIS_MINIPORT_BLOCK - Make sure memory allocation was successful - Cleanup code in ProRequest svn path=/branches/aicom-network-fixes/; revision=36556
This commit is contained in:
parent
a4c5f0d79c
commit
72f9da2665
3 changed files with 30 additions and 32 deletions
|
@ -146,7 +146,7 @@ MiniDequeueWorkItem(
|
||||||
|
|
||||||
NDIS_STATUS
|
NDIS_STATUS
|
||||||
MiniDoRequest(
|
MiniDoRequest(
|
||||||
PNDIS_MINIPORT_BLOCK Adapter,
|
PLOGICAL_ADAPTER Adapter,
|
||||||
PNDIS_REQUEST NdisRequest);
|
PNDIS_REQUEST NdisRequest);
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
|
|
|
@ -326,8 +326,10 @@ MiniRequestComplete(
|
||||||
Request,
|
Request,
|
||||||
Status);
|
Status);
|
||||||
}
|
}
|
||||||
KeLowerIrql(OldIrql);
|
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||||
Adapter->MiniportBusy = FALSE;
|
Adapter->MiniportBusy = FALSE;
|
||||||
|
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||||
|
KeLowerIrql(OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID NTAPI
|
VOID NTAPI
|
||||||
|
@ -357,8 +359,10 @@ MiniSendComplete(
|
||||||
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
|
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
|
||||||
Packet,
|
Packet,
|
||||||
Status);
|
Status);
|
||||||
KeLowerIrql(OldIrql);
|
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||||
Adapter->MiniportBusy = FALSE;
|
Adapter->MiniportBusy = FALSE;
|
||||||
|
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||||
|
KeLowerIrql(OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -392,8 +396,10 @@ MiniTransferDataComplete(
|
||||||
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
|
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
|
||||||
Packet,
|
Packet,
|
||||||
Status);
|
Status);
|
||||||
KeLowerIrql(OldIrql);
|
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||||
Adapter->MiniportBusy = FALSE;
|
Adapter->MiniportBusy = FALSE;
|
||||||
|
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||||
|
KeLowerIrql(OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -767,7 +773,7 @@ MiniDequeueWorkItem(
|
||||||
|
|
||||||
NDIS_STATUS
|
NDIS_STATUS
|
||||||
MiniDoRequest(
|
MiniDoRequest(
|
||||||
PNDIS_MINIPORT_BLOCK Adapter,
|
PLOGICAL_ADAPTER Adapter,
|
||||||
PNDIS_REQUEST NdisRequest)
|
PNDIS_REQUEST NdisRequest)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Sends a request to a miniport
|
* FUNCTION: Sends a request to a miniport
|
||||||
|
@ -782,14 +788,14 @@ MiniDoRequest(
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
||||||
|
|
||||||
Adapter->MediaRequest = NdisRequest;
|
Adapter->NdisMiniportBlock.MediaRequest = NdisRequest;
|
||||||
|
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||||
switch (NdisRequest->RequestType)
|
switch (NdisRequest->RequestType)
|
||||||
{
|
{
|
||||||
case NdisRequestQueryInformation:
|
case NdisRequestQueryInformation:
|
||||||
Status = (*Adapter->DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
|
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
|
||||||
Adapter->MiniportAdapterContext,
|
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
||||||
NdisRequest->DATA.QUERY_INFORMATION.Oid,
|
NdisRequest->DATA.QUERY_INFORMATION.Oid,
|
||||||
NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
|
NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
|
||||||
NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
|
NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
|
||||||
|
@ -798,8 +804,8 @@ MiniDoRequest(
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NdisRequestSetInformation:
|
case NdisRequestSetInformation:
|
||||||
Status = (*Adapter->DriverHandle->MiniportCharacteristics.SetInformationHandler)(
|
Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SetInformationHandler)(
|
||||||
Adapter->MiniportAdapterContext,
|
Adapter->NdisMiniportBlock.MiniportAdapterContext,
|
||||||
NdisRequest->DATA.SET_INFORMATION.Oid,
|
NdisRequest->DATA.SET_INFORMATION.Oid,
|
||||||
NdisRequest->DATA.SET_INFORMATION.InformationBuffer,
|
NdisRequest->DATA.SET_INFORMATION.InformationBuffer,
|
||||||
NdisRequest->DATA.SET_INFORMATION.InformationBufferLength,
|
NdisRequest->DATA.SET_INFORMATION.InformationBufferLength,
|
||||||
|
@ -833,8 +839,10 @@ NdisMQueryInformationComplete(
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||||
if( Adapter->NdisMiniportBlock.QueryCompleteHandler )
|
if( Adapter->NdisMiniportBlock.QueryCompleteHandler )
|
||||||
(Adapter->NdisMiniportBlock.QueryCompleteHandler)(MiniportAdapterHandle, Status);
|
(Adapter->NdisMiniportBlock.QueryCompleteHandler)(MiniportAdapterHandle, Status);
|
||||||
KeLowerIrql(OldIrql);
|
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||||
Adapter->MiniportBusy = FALSE;
|
Adapter->MiniportBusy = FALSE;
|
||||||
|
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||||
|
KeLowerIrql(OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
||||||
|
@ -962,7 +970,7 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NdisWorkItemRequest:
|
case NdisWorkItemRequest:
|
||||||
NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, (PNDIS_REQUEST)WorkItemContext);
|
NdisStatus = MiniDoRequest(Adapter, (PNDIS_REQUEST)WorkItemContext);
|
||||||
|
|
||||||
if (NdisStatus == NDIS_STATUS_PENDING)
|
if (NdisStatus == NDIS_STATUS_PENDING)
|
||||||
break;
|
break;
|
||||||
|
@ -1019,6 +1027,7 @@ VOID NTAPI MiniportDpc(
|
||||||
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
|
||||||
|
|
||||||
NdisWorkItem = ExAllocatePool(NonPagedPool, sizeof(NDIS_WORK_ITEM));
|
NdisWorkItem = ExAllocatePool(NonPagedPool, sizeof(NDIS_WORK_ITEM));
|
||||||
|
if (!NdisWorkItem) return;
|
||||||
|
|
||||||
WorkItem = (PWORK_QUEUE_ITEM)NdisWorkItem->WrapperReserved;
|
WorkItem = (PWORK_QUEUE_ITEM)NdisWorkItem->WrapperReserved;
|
||||||
|
|
||||||
|
@ -2123,8 +2132,10 @@ NdisMSetInformationComplete(
|
||||||
ASSERT(Adapter);
|
ASSERT(Adapter);
|
||||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||||
(Adapter->NdisMiniportBlock.SetCompleteHandler)(MiniportAdapterHandle, Status);
|
(Adapter->NdisMiniportBlock.SetCompleteHandler)(MiniportAdapterHandle, Status);
|
||||||
KeLowerIrql(OldIrql);
|
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||||
Adapter->MiniportBusy = FALSE;
|
Adapter->MiniportBusy = FALSE;
|
||||||
|
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
|
||||||
|
KeLowerIrql(OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -119,8 +119,6 @@ ProRequest(
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
BOOLEAN QueueWorkItem = FALSE;
|
|
||||||
NDIS_STATUS NdisStatus;
|
|
||||||
PADAPTER_BINDING AdapterBinding;
|
PADAPTER_BINDING AdapterBinding;
|
||||||
PLOGICAL_ADAPTER Adapter;
|
PLOGICAL_ADAPTER Adapter;
|
||||||
PNDIS_REQUEST_MAC_BLOCK MacBlock = (PNDIS_REQUEST_MAC_BLOCK)NdisRequest->MacReserved;
|
PNDIS_REQUEST_MAC_BLOCK MacBlock = (PNDIS_REQUEST_MAC_BLOCK)NdisRequest->MacReserved;
|
||||||
|
@ -141,26 +139,15 @@ ProRequest(
|
||||||
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
|
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
|
||||||
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
|
||||||
{
|
{
|
||||||
if(Adapter->MiniportBusy)
|
if (Adapter->MiniportBusy) {
|
||||||
QueueWorkItem = TRUE;
|
MiniQueueWorkItem(Adapter, NdisWorkItemRequest, (PVOID)NdisRequest);
|
||||||
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||||
|
return NDIS_STATUS_PENDING;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* MiniQueueWorkItem must be called at IRQL >= DISPATCH_LEVEL */
|
|
||||||
if (QueueWorkItem)
|
|
||||||
{
|
|
||||||
MiniQueueWorkItem(Adapter, NdisWorkItemRequest, (PVOID)NdisRequest);
|
|
||||||
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
|
||||||
return NDIS_STATUS_PENDING;
|
|
||||||
}
|
|
||||||
|
|
||||||
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
|
||||||
|
|
||||||
NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, NdisRequest);
|
return MiniDoRequest(Adapter, NdisRequest);
|
||||||
|
|
||||||
if( NdisStatus == NDIS_STATUS_PENDING )
|
|
||||||
Adapter->MiniportBusy = TRUE;
|
|
||||||
|
|
||||||
return NdisStatus;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue