Author: cgutman Date: Tue Jan 3 16:08:24 2012 New Revision: 54816
URL: http://svn.reactos.org/svn/reactos?rev=54816&view=rev Log: [NDISUIO] - Fix a race condition during adapter context destruction - Add missing IRP completion in IRP_MJ_READ and IRP_MJ_WRITE handlers - Create an adapter context in response to PnP events
Modified: branches/wlan-bringup/drivers/network/ndisuio/ioctl.c branches/wlan-bringup/drivers/network/ndisuio/protocol.c branches/wlan-bringup/drivers/network/ndisuio/readwrite.c
Modified: branches/wlan-bringup/drivers/network/ndisuio/ioctl.c URL: http://svn.reactos.org/svn/reactos/branches/wlan-bringup/drivers/network/ndi... ============================================================================== --- branches/wlan-bringup/drivers/network/ndisuio/ioctl.c [iso-8859-1] (original) +++ branches/wlan-bringup/drivers/network/ndisuio/ioctl.c [iso-8859-1] Tue Jan 3 16:08:24 2012 @@ -126,6 +126,7 @@ NTSTATUS Status; PNDISUIO_ADAPTER_CONTEXT AdapterContext; PNDISUIO_OPEN_ENTRY OpenEntry; + KIRQL OldIrql;
NameLength = IrpSp->Parameters.DeviceIoControl.InputBufferLength; if (NameLength != 0) @@ -135,16 +136,17 @@
/* Check if this already has a context */ AdapterContext = FindAdapterContextByName(&DeviceName); - if (AdapterContext == NULL) - { - /* Create a new context */ - Status = BindAdapterByName(&DeviceName, &AdapterContext); + if (AdapterContext != NULL) + { + /* Reference the adapter context */ + KeAcquireSpinLock(&AdapterContext->Spinlock, &OldIrql); + ReferenceAdapterContext(AdapterContext); + Status = STATUS_SUCCESS; } else { - /* Reference the existing context */ - ReferenceAdapterContext(AdapterContext, FALSE); - Status = STATUS_SUCCESS; + /* Invalid device name */ + Status = STATUS_INVALID_PARAMETER; }
/* Check that the bind succeeded */ @@ -161,24 +163,25 @@ FileObject->FsContext2 = OpenEntry;
/* Add it to the adapter's list */ - ExInterlockedInsertTailList(&AdapterContext->OpenEntryList, - &OpenEntry->ListEntry, - &AdapterContext->Spinlock); + InsertTailList(&AdapterContext->OpenEntryList, + &OpenEntry->ListEntry);
/* Success */ + KeReleaseSpinLock(&AdapterContext->Spinlock, OldIrql); Status = STATUS_SUCCESS; } else { /* Remove the reference we added */ + KeReleaseSpinLock(&AdapterContext->Spinlock, OldIrql); DereferenceAdapterContext(AdapterContext, NULL); - Status = STATUS_NO_MEMORY; } } } else { + /* Invalid device name */ Status = STATUS_INVALID_PARAMETER; }
Modified: branches/wlan-bringup/drivers/network/ndisuio/protocol.c URL: http://svn.reactos.org/svn/reactos/branches/wlan-bringup/drivers/network/ndi... ============================================================================== --- branches/wlan-bringup/drivers/network/ndisuio/protocol.c [iso-8859-1] (original) +++ branches/wlan-bringup/drivers/network/ndisuio/protocol.c [iso-8859-1] Tue Jan 3 16:08:24 2012 @@ -135,6 +135,11 @@ PLIST_ENTRY CurrentOpenEntry; PNDISUIO_OPEN_ENTRY OpenEntry;
+ /* Remove the adapter context from the global list */ + KeAcquireSpinLock(&GlobalAdapterListLock, &OldIrql); + RemoveEntryList(&AdapterContext->ListEntry); + KeReleaseSpinLock(&GlobalAdapterListLock, OldIrql); + /* Invalidate all handles to this adapter */ CurrentOpenEntry = AdapterContext->OpenEntryList.Flink; while (CurrentOpenEntry != &AdapterContext->OpenEntryList) @@ -163,11 +168,6 @@ /* If this fails, we have a refcount mismatch somewhere */ ASSERT(AdapterContext->OpenCount == 0);
- /* Remove the adapter context from the global list */ - KeAcquireSpinLock(&GlobalAdapterListLock, &OldIrql); - RemoveEntryList(&AdapterContext->ListEntry); - KeReleaseSpinLock(&GlobalAdapterListLock, OldIrql); - /* Send the close request */ NdisCloseAdapter(Status, AdapterContext->BindingHandle); @@ -209,7 +209,7 @@ KeInitializeSpinLock(&AdapterContext->Spinlock); InitializeListHead(&AdapterContext->PacketList); InitializeListHead(&AdapterContext->OpenEntryList); - AdapterContext->OpenCount = 1; + AdapterContext->OpenCount = 0;
/* Send the open request */ NdisOpenAdapter(&Status, @@ -261,8 +261,8 @@ PVOID SystemSpecific1, PVOID SystemSpecific2) { - /* We don't bind like this */ - *Status = NDIS_STATUS_SUCCESS; + /* Use our helper function to create a context for this adapter */ + *Status = BindAdapterByName(DeviceName); }
VOID
Modified: branches/wlan-bringup/drivers/network/ndisuio/readwrite.c URL: http://svn.reactos.org/svn/reactos/branches/wlan-bringup/drivers/network/ndi... ============================================================================== --- branches/wlan-bringup/drivers/network/ndisuio/readwrite.c [iso-8859-1] (original) +++ branches/wlan-bringup/drivers/network/ndisuio/readwrite.c [iso-8859-1] Tue Jan 3 16:08:24 2012 @@ -17,11 +17,13 @@ PIRP Irp) { ASSERT(DeviceObject == GlobalDeviceObject); - + /* FIXME: Not implemented */ Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; Irp->IoStatus.Information = 0; - + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_NOT_IMPLEMENTED; }
@@ -35,6 +37,8 @@ /* FIXME: Not implemented */ Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; Irp->IoStatus.Information = 0; - + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_NOT_IMPLEMENTED; }