Index: winmad/kernel/wm_driver.c
===================================================================
--- winmad/kernel/wm_driver.c	(revision 6842)
+++ winmad/kernel/wm_driver.c	(working copy)
@@ -41,7 +41,7 @@
 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WM_IB_DEVICE, WmIbDeviceGetContext)
 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WM_PROVIDER, WmProviderGetContext)
 
-WDFDEVICE				ControlDevice;
+WDFDEVICE				ControlDevice = NULL;
 static LIST_ENTRY		DevList;
 static LIST_ENTRY		ProvList;
 static KGUARDED_MUTEX	Lock;
@@ -195,11 +195,14 @@
 	WdfDeviceInitSetFileObjectConfig(pinit, &fileconfig, &attr);
 
 	WDF_OBJECT_ATTRIBUTES_INIT(&attr);
+	ASSERT(ControlDevice == NULL);
 	status = WdfDeviceCreate(&pinit, &attr, &ControlDevice);
 	if (!NT_SUCCESS(status)) {
 		goto err1;
 	}
 
+	
+	ASSERT(ControlDevice != NULL);
 	status = WdfDeviceCreateSymbolicLink(ControlDevice, &symlink);
 	if (!NT_SUCCESS(status)) {
 		goto err2;
@@ -220,6 +223,7 @@
 
 err2:
 	WdfObjectDelete(ControlDevice);
+	ControlDevice = NULL;
 	return;
 err1:
 	WdfDeviceInitFree(pinit);
@@ -340,14 +344,12 @@
 	WM_REGISTRATION		*reg;
 	LIST_ENTRY			*entry;
 	BOOLEAN				destroy;
-	WDFDEVICE			ctrldev;
 
 	pdev = WmIbDeviceGetContext(Device);
 
 	KeAcquireGuardedMutex(&Lock);
 	RemoveEntryList(&pdev->Entry);
 	destroy = IsListEmpty(&DevList);
-	ctrldev = ControlDevice;
 
 	for (entry = ProvList.Flink; entry != &ProvList; entry = entry->Flink) {
 		prov = CONTAINING_RECORD(entry, WM_PROVIDER, Entry);
@@ -365,7 +367,8 @@
 	}
 
 	if (destroy) {
-		WdfObjectDelete(ctrldev);
+		ASSERT(ControlDevice != NULL);
+		WdfObjectDelete(ControlDevice);
 	}
 
 	return STATUS_SUCCESS;
Index: winmad/kernel/wm_provider.c
===================================================================
--- winmad/kernel/wm_provider.c	(revision 6842)
+++ winmad/kernel/wm_provider.c	(working copy)
@@ -64,6 +64,8 @@
 	pProvider->Exclusive = 0;
 	KeInitializeEvent(&pProvider->ExclusiveEvent, SynchronizationEvent, FALSE);
 
+	ASSERT(ControlDevice != NULL);
+	
 	WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchManual);
 	status = WdfIoQueueCreate(ControlDevice, &config,
 							  WDF_NO_OBJECT_ATTRIBUTES, &pProvider->ReadQueue);
Index: winverbs/kernel/wv_cq.c
===================================================================
--- winverbs/kernel/wv_cq.c	(revision 6842)
+++ winverbs/kernel/wv_cq.c	(working copy)
@@ -97,6 +97,8 @@
 	cq->Ref = 1;
 	KeInitializeEvent(&cq->Event, NotificationEvent, FALSE);
 
+	ASSERT(ControlDevice != NULL);
+
 	WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchManual);
 	status = WdfIoQueueCreate(ControlDevice, &config,
 							  WDF_NO_OBJECT_ATTRIBUTES, &cq->Queue);
Index: winverbs/kernel/wv_device.c
===================================================================
--- winverbs/kernel/wv_device.c	(revision 6842)
+++ winverbs/kernel/wv_device.c	(working copy)
@@ -216,6 +216,8 @@
 		return STATUS_NO_MEMORY;
 	}
 
+	ASSERT(ControlDevice != NULL);
+
 	WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchManual);
 	for (i = 0; i < pDevice->PortCount; i++) {
 		pDevice->pPorts[i].Flags = 0;
Index: winverbs/kernel/wv_driver.c
===================================================================
--- winverbs/kernel/wv_driver.c	(revision 6842)
+++ winverbs/kernel/wv_driver.c	(working copy)
@@ -48,7 +48,7 @@
 
 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WV_RDMA_DEVICE, WvRdmaDeviceGetContext)
 
-WDFDEVICE				ControlDevice;
+WDFDEVICE				ControlDevice = NULL;
 static LIST_ENTRY		DevList;
 static LIST_ENTRY		ProvList;
 static KGUARDED_MUTEX	Lock;
@@ -565,6 +565,8 @@
 	ifc.InterfaceHeader.InterfaceReference = WdfDeviceInterfaceReferenceNoOp;
 	ifc.InterfaceHeader.InterfaceDereference = WdfDeviceInterfaceReferenceNoOp;
 
+	ASSERT(ControlDevice != NULL);
+
 	ifc.WdfDevice = (ULONG_PTR)ControlDevice;
 	ifc.WdmDevice = WdfDeviceWdmGetDeviceObject(ControlDevice);
 
@@ -608,12 +610,16 @@
 	WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attr, WV_PROVIDER);
 	WdfDeviceInitSetFileObjectConfig(pinit, &fileconfig, &attr);
 
+	ASSERT(ControlDevice == NULL);
+
 	WDF_OBJECT_ATTRIBUTES_INIT(&attr);
 	status = WdfDeviceCreate(&pinit, &attr, &ControlDevice);
 	if (!NT_SUCCESS(status)) {
 		goto err1;
 	}
 
+	ASSERT(ControlDevice != NULL);
+	
 	status = WdfDeviceCreateSymbolicLink(ControlDevice, &symlink);
 	if (!NT_SUCCESS(status)) {
 		goto err2;
@@ -633,6 +639,7 @@
 
 err2:
 	WdfObjectDelete(ControlDevice);
+	ControlDevice = NULL;
 	return;
 err1:
 	WdfDeviceInitFree(pinit);
@@ -723,7 +730,6 @@
 	KeAcquireGuardedMutex(&Lock);
 	RemoveEntryList(&pdev->Entry);
 	destroy = IsListEmpty(&DevList);
-	ctrldev = ControlDevice;
 
 	for (entry = ProvList.Flink; entry != &ProvList; entry = entry->Flink) {
 		prov = CONTAINING_RECORD(entry, WV_PROVIDER, Entry);
@@ -744,7 +750,10 @@
 			IbCmInterface.InterfaceHeader.InterfaceDereference(IbCmInterface.
 															   InterfaceHeader.Context);
 		}
-		WdfObjectDelete(ctrldev);
+
+		ASSERT(ControlDevice !+ NULL);
+		WdfObjectDelete(ControlDevice);
+		ControlDevice = NULL;
 	}
 }
 
Index: winverbs/kernel/wv_ep.c
===================================================================
--- winverbs/kernel/wv_ep.c	(revision 6842)
+++ winverbs/kernel/wv_ep.c	(working copy)
@@ -101,6 +101,8 @@
 	KeInitializeEvent(&ep->Event, NotificationEvent, FALSE);
 	InitializeListHead(&ep->Entry);
 
+	ASSERT(ControlDevice != NULL);
+	
 	WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchManual);
 	status = WdfIoQueueCreate(ControlDevice, &config,
 							  WDF_NO_OBJECT_ATTRIBUTES, &ep->Queue);
Index: winverbs/kernel/wv_srq.c
===================================================================
--- winverbs/kernel/wv_srq.c	(revision 6842)
+++ winverbs/kernel/wv_srq.c	(working copy)
@@ -109,6 +109,8 @@
 	srq->Ref = 1;
 	KeInitializeEvent(&srq->Event, NotificationEvent, FALSE);
 
+	ASSERT(ControlDevice != NULL);
+
 	WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchManual);
 	status = WdfIoQueueCreate(ControlDevice, &config,
 							  WDF_NO_OBJECT_ATTRIBUTES, &srq->Queue);
