Author: cgutman
Date: Fri Dec 28 00:36:28 2012
New Revision: 58022
URL:
http://svn.reactos.org/svn/reactos?rev=58022&view=rev
Log:
- Never queue a DPC for MiniportHandleInterrupt regardless of what MiniportISR requests if
MiniportInitialize is executing
- Very likely fixes CORE-6064
Modified:
trunk/reactos/drivers/network/ndis/ndis/io.c
Modified: trunk/reactos/drivers/network/ndis/ndis/io.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/ndis/ndis/…
==============================================================================
--- trunk/reactos/drivers/network/ndis/ndis/io.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/ndis/ndis/io.c [iso-8859-1] Fri Dec 28 00:36:28 2012
@@ -62,11 +62,16 @@
BOOLEAN QueueMiniportHandleInterrupt = FALSE;
PNDIS_MINIPORT_INTERRUPT NdisInterrupt = ServiceContext;
PNDIS_MINIPORT_BLOCK NdisMiniportBlock = NdisInterrupt->Miniport;
+ BOOLEAN Initializing;
NDIS_DbgPrint(MAX_TRACE, ("Called. Interrupt (0x%X)\n", NdisInterrupt));
- /* FIXME: This probably isn't the right check for MiniportInitialize, but we need
to see what Windows uses here */
- if ((NdisMiniportBlock->PnPDeviceState != NdisPnPDeviceStarted) ||
(NdisInterrupt->IsrRequested)) {
+ /* Certain behavior differs if MiniportInitialize is executing when the interrupt is
generated */
+ Initializing = (NdisMiniportBlock->PnPDeviceState != NdisPnPDeviceStarted);
+ NDIS_DbgPrint(MAX_TRACE, ("MiniportInitialize executing: %s\n", (Initializing
? "yes" : "no")));
+
+ /* MiniportISR is always called for interrupts during MiniportInitialize */
+ if ((Initializing) || (NdisInterrupt->IsrRequested)) {
NDIS_DbgPrint(MAX_TRACE, ("Calling MiniportISR\n"));
(*NdisMiniportBlock->DriverHandle->MiniportCharacteristics.ISRHandler)(
&InterruptRecognized,
@@ -81,8 +86,8 @@
InterruptRecognized = TRUE;
}
-
- if (QueueMiniportHandleInterrupt)
+ /* MiniportHandleInterrupt is never called for an interrupt during MiniportInitialize
*/
+ if ((QueueMiniportHandleInterrupt) && (!Initializing))
{
NDIS_DbgPrint(MAX_TRACE, ("Queuing DPC.\n"));
KeInsertQueueDpc(&NdisInterrupt->InterruptDpc, NULL, NULL);