From 91ac8bce6e7cd9179b41d619bfdae7cb621c80ff Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 14 Sep 2008 05:16:32 +0000 Subject: [PATCH] - Change our method of queuing work items so we don't leak anymore svn path=/branches/aicom-network-fixes/; revision=36211 --- drivers/network/ndis/ndis/miniport.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/drivers/network/ndis/ndis/miniport.c b/drivers/network/ndis/ndis/miniport.c index e854bd467de..66b22d9abad 100644 --- a/drivers/network/ndis/ndis/miniport.c +++ b/drivers/network/ndis/ndis/miniport.c @@ -748,11 +748,10 @@ NdisMQueryInformationComplete( KeLowerIrql(OldIrql); } -VOID NTAPI MiniportWorker( - IN PDEVICE_OBJECT DeviceObject, - IN PVOID Context) +VOID NTAPI MiniportWorker(IN PVOID WorkItem) { - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(Context); + PNDIS_WORK_ITEM NdisWorkItem = WorkItem; + PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(NdisWorkItem->Context); KIRQL OldIrql; NDIS_STATUS NdisStatus; PVOID WorkItemContext; @@ -858,6 +857,8 @@ VOID NTAPI MiniportWorker( break; } } + + ExFreePool(WorkItem); } @@ -876,15 +877,20 @@ VOID NTAPI MiniportDpc( * SystemArgument2 = Unused */ { - PIO_WORKITEM WorkItem; - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext); + PNDIS_WORK_ITEM NdisWorkItem; + PWORK_QUEUE_ITEM WorkItem; NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); - WorkItem = IoAllocateWorkItem(Adapter->NdisMiniportBlock.DeviceObject); - if( !WorkItem ) return; + NdisWorkItem = ExAllocatePool(NonPagedPool, sizeof(PNDIS_WORK_ITEM)); - IoQueueWorkItem(WorkItem, MiniportWorker, CriticalWorkQueue, DeferredContext); + WorkItem = (PWORK_QUEUE_ITEM)NdisWorkItem->WrapperReserved; + + NdisWorkItem->Context = DeferredContext; + + ExInitializeWorkItem(WorkItem, MiniportWorker, NdisWorkItem); + + ExQueueWorkItem(WorkItem, CriticalWorkQueue); }