Index: core/winmad/kernel/wm_driver.c
===================================================================
--- core/winmad/kernel/wm_driver.c	(revision 3381)
+++ core/winmad/kernel/wm_driver.c	(working copy)
@@ -99,6 +99,10 @@
 
 	file = WdfRequestGetFileObject(Request);
 	prov = WmProviderGetContext(file);
+	if (WmProviderGet(prov) == 0) {
+		WdfRequestComplete(Request, STATUS_FILE_CLOSED);
+		return;
+	}
 
 	switch (IoControlCode) {
 	case WM_IOCTL_REGISTER:
@@ -114,6 +118,7 @@
 		WdfRequestComplete(Request, STATUS_PROCEDURE_NOT_FOUND);
 		break;
 	}
+	WmProviderPut(prov);
 }
 
 static VOID WmIoRead(WDFQUEUE Queue, WDFREQUEST Request, size_t Length)
@@ -124,7 +129,12 @@
 
 	file = WdfRequestGetFileObject(Request);
 	prov = WmProviderGetContext(file);
-	WmProviderRead(prov, Request);
+	if (WmProviderGet(prov) > 0) {
+		WmProviderRead(prov, Request);
+		WmProviderPut(prov);
+	} else {
+		WdfRequestCompleteWithInformation(Request, STATUS_FILE_CLOSED, 0);
+	}
 }
 
 static VOID WmIoWrite(WDFQUEUE Queue, WDFREQUEST Request, size_t Length)
@@ -135,7 +145,12 @@
 
 	file = WdfRequestGetFileObject(Request);
 	prov = WmProviderGetContext(file);
-	WmProviderWrite(prov, Request);
+	if (WmProviderGet(prov) > 0) {
+		WmProviderWrite(prov, Request);
+		WmProviderPut(prov);
+	} else {
+		WdfRequestComplete(Request, STATUS_FILE_CLOSED);
+	}
 }
 
 static VOID WmFileCreate(WDFDEVICE Device, WDFREQUEST Request,
Index: core/winmad/kernel/wm_provider.c
===================================================================
--- core/winmad/kernel/wm_provider.c	(revision 3381)
+++ core/winmad/kernel/wm_provider.c	(working copy)
@@ -33,9 +33,18 @@
 #include "wm_provider.h"
 #include "wm_reg.h"
 
-void WmProviderGet(WM_PROVIDER *pProvider)
+LONG WmProviderGet(WM_PROVIDER *pProvider)
 {
-	InterlockedIncrement(&pProvider->Ref);
+	LONG val;
+
+	KeAcquireGuardedMutex(&pProvider->Lock);
+	val = InterlockedIncrement(&pProvider->Ref);
+	if (val == 1) {
+		pProvider->Ref = 0;
+		val = 0;
+	}
+	KeReleaseGuardedMutex(&pProvider->Lock);
+	return val;
 }
 
 void WmProviderPut(WM_PROVIDER *pProvider)
Index: core/winmad/kernel/wm_provider.h
===================================================================
--- core/winmad/kernel/wm_provider.h	(revision 3381)
+++ core/winmad/kernel/wm_provider.h	(working copy)
@@ -60,7 +60,7 @@
 
 }	WM_PROVIDER;
 
-void WmProviderGet(WM_PROVIDER *pProvider);
+LONG WmProviderGet(WM_PROVIDER *pProvider);
 void WmProviderPut(WM_PROVIDER *pProvider);
 NTSTATUS WmProviderInit(WM_PROVIDER *pProvider);
 void WmProviderCleanup(WM_PROVIDER *pProvider);
