About "IoDeleteDevice" and "DriverUnload"

Hello:
I am developing USB audio filter driver. I use “IoDeleteDevice”
function in “IRP_MN_REMOVE_DEVICE”.
In normal case, when device is be removed, the “IoDeleteDevice”
should be finished, then, the system call the “DriverUnload” function.
When I unplug the device, the debug message is shown as below:
00000005 0.02962160 REMOVE_DEVICE
00000006 0.02967280 REMOVE_DEVICE - waiting for 0 irps
to complete…
00000007 0.02971200 REMOVE_DEVICE - … DONE waiting.
00000008 0.02973840 iodetach
00000009 0.98685520 remove iodelete before
00000010 0.98689600 remove iodelete after
00000011 0.98696640 VA_DriverUnload
If the debug message is as above sequence, the device will be
unload successfully.

However, in special case, the debug message will be as below:
00000005 0.02962160 REMOVE_DEVICE
00000006 0.02967280 REMOVE_DEVICE - waiting for 0 irps
to complete…
00000007 0.02971200 REMOVE_DEVICE - … DONE waiting.
00000008 0.02973840 iodetach
00000009 0.98685520 remove iodelete before
00000011 0.98696640 VA_DriverUnload
00000010 0.98689600 remove iodelete after
That is, the “IoDeleteDevice” function is not finished, but
the DriverUnload function is be called.
This may cause system be hung.

***********************************************************************************************

The source of this filter driver about “IRP_MN_REMOVE_DEVICE” and
“VA_DriverUnload” is as below:

case IRP_MN_REMOVE_DEVICE:
DBGOUT((“REMOVE_DEVICE”));
if (devExt->state != STATE_REMOVED){

devExt->state = STATE_REMOVED;
IoCopyCurrentIrpStackLocationToNext(irp);
status = IoCallDriver(devExt->topDevObj, irp);
justReturnStatus = TRUE;

DBGOUT((“REMOVE_DEVICE - waiting for %d irps to complete…”,
devExt->pendingActionCount));

DecrementPendingActionCount(devExt);
KeWaitForSingleObject( &devExt->removeEvent,
Executive, // wait reason
KernelMode,
FALSE, // not alertable
NULL ); // no timeout

DBGOUT(("REMOVE_DEVICE - … DONE waiting. "));

IoDetachDevice(devExt->topDevObj);
DBGOUT(( “iodetach” ));
DBGOUT(( “remove iodelete before” ));
IoDeleteDevice(devExt->filterDevObj);
DBGOUT(( “remove iodelete after” ));
}
break;

VOID VA_DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
PAGED_CODE();
DBGOUT((“VA_DriverUnload”));
}

****************************************************************************
How should I solve this problem?
Thank you for help,
Best Regards,
Gordon


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

DQotLS0tLSDC4KdlqswgZ29yZG9uL1N1bnBsdXMgqfMgMjAwMS8xMC8wMyAxMTo0NCBBTSAtLS0t
LQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAg
ICAgZ29yZG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIKaspfOkSKFHICAgICBudGRldkBsaXN0cy5vc3IuY29tICAgICAgICAgICAgICAgICAgIA0K
ICAgICAgICAgICAgICAgICAgICAyMDAxLzEwLzAzICAgICAgICAgICCwxqW7p9uwZaFHICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAg
MTE6MzQgQU0gICAgICAgICAgICAgpUSmrqFHICBBYm91dCAiSW9EZWxldGVEZXZpY2UiIGFuZCAi
RHJpdmVyVW5sb2FkIiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KDQoNCkhlbGxvOg0KICAgICAgICAg
ICBJIGFtIGRldmVsb3BpbmcgVVNCIGF1ZGlvIGZpbHRlciBkcml2ZXIuIEkgdXNlICJJb0RlbGV0
ZURldmljZSINCmZ1bmN0aW9uIGluICJJUlBfTU5fUkVNT1ZFX0RFVklDRSIuDQogICAgICAgICAg
IEluICBub3JtYWwgY2FzZSwgd2hlbiBkZXZpY2UgaXMgYmUgcmVtb3ZlZCwgdGhlICJJb0RlbGV0
ZURldmljZSINCnNob3VsZCBiZSBmaW5pc2hlZCwgdGhlbiwgdGhlIHN5c3RlbSBjYWxsIHRoZSAi
RHJpdmVyVW5sb2FkIiBmdW5jdGlvbi4NCiAgICAgICAgICAgV2hlbiBJIHVucGx1ZyB0aGUgZGV2
aWNlLCB0aGUgZGVidWcgbWVzc2FnZSBpcyBzaG93biBhcyBiZWxvdzoNCiAgICAgICAgICAgICAg
ICAwMDAwMDAwNSAwLjAyOTYyMTYwICAgICAgUkVNT1ZFX0RFVklDRQ0KICAgICAgICAgICAgICAg
IDAwMDAwMDA2IDAuMDI5NjcyODAgICAgICBSRU1PVkVfREVWSUNFIC0gd2FpdGluZyBmb3IgMCBp
cnBzDQp0byBjb21wbGV0ZS4uLg0KICAgICAgICAgICAgICAgIDAwMDAwMDA3IDAuMDI5NzEyMDAg
ICAgICBSRU1PVkVfREVWSUNFIC0gLi4uIERPTkUgd2FpdGluZy4NCiAgICAgICAgICAgICAgICAw
MDAwMDAwOCAwLjAyOTczODQwICAgICAgaW9kZXRhY2gNCiAgICAgICAgICAgICAgICAwMDAwMDAw
OSAwLjk4Njg1NTIwICAgICAgcmVtb3ZlIGlvZGVsZXRlIGJlZm9yZQ0KICAgICAgICAgICAgICAg
IDAwMDAwMDEwIDAuOTg2ODk2MDAgICAgICByZW1vdmUgaW9kZWxldGUgYWZ0ZXINCiAgICAgICAg
ICAgICAgICAwMDAwMDAxMSAwLjk4Njk2NjQwICAgICAgVkFfRHJpdmVyVW5sb2FkDQogICAgICAg
ICAgICBJZiB0aGUgZGVidWcgbWVzc2FnZSBpcyBhcyBhYm92ZSBzZXF1ZW5jZSwgdGhlIGRldmlj
ZSB3aWxsIGJlDQp1bmxvYWQgc3VjY2Vzc2Z1bGx5Lg0KDQogICAgICAgICAgICBIb3dldmVyLCBp
biBzcGVjaWFsIGNhc2UsIHRoZSBkZWJ1ZyBtZXNzYWdlIHdpbGwgYmUgYXMgYmVsb3c6DQogICAg
ICAgICAgICAgICAgMDAwMDAwMDUgMC4wMjk2MjE2MCAgICAgIFJFTU9WRV9ERVZJQ0UNCiAgICAg
ICAgICAgICAgICAwMDAwMDAwNiAwLjAyOTY3MjgwICAgICAgUkVNT1ZFX0RFVklDRSAtIHdhaXRp
bmcgZm9yIDAgaXJwcw0KdG8gY29tcGxldGUuLi4NCiAgICAgICAgICAgICAgICAwMDAwMDAwNyAw
LjAyOTcxMjAwICAgICAgUkVNT1ZFX0RFVklDRSAtIC4uLiBET05FIHdhaXRpbmcuDQogICAgICAg
ICAgICAgICAgMDAwMDAwMDggMC4wMjk3Mzg0MCAgICAgIGlvZGV0YWNoDQogICAgICAgICAgICAg
ICAgMDAwMDAwMDkgMC45ODY4NTUyMCAgICAgIHJlbW92ZSBpb2RlbGV0ZSBiZWZvcmUNCiAgICAg
ICAgICAgICAgICAwMDAwMDAxMSAwLjk4Njk2NjQwICAgICAgVkFfRHJpdmVyVW5sb2FkDQogICAg
ICAgICAgICAgICAgMDAwMDAwMTAgMC45ODY4OTYwMCAgICAgIHJlbW92ZSBpb2RlbGV0ZSBhZnRl
cg0KICAgICAgICAgICAgIFRoYXQgaXMsIHRoZSAiSW9EZWxldGVEZXZpY2UiIGZ1bmN0aW9uIGlz
IG5vdCBmaW5pc2hlZCwgYnV0DQp0aGUgRHJpdmVyVW5sb2FkIGZ1bmN0aW9uIGlzIGJlIGNhbGxl
ZC4NCiAgICAgICAgICAgICBUaGlzIG1heSBjYXVzZSBzeXN0ZW0gYmUgaHVuZy4NCg0KKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCg0KDQogICAgVGhlIHNvdXJjZSBvZiB0
aGlzIGZpbHRlciBkcml2ZXIgYWJvdXQgICJJUlBfTU5fUkVNT1ZFX0RFVklDRSIgYW5kDQoiVkFf
RHJpdmVyVW5sb2FkIiBpcyBhcyBiZWxvdzoNCg0KICAgIGNhc2UgSVJQX01OX1JFTU9WRV9ERVZJ
Q0U6DQogICAgICAgIERCR09VVCgoIlJFTU9WRV9ERVZJQ0UiKSk7DQogICAgICAgIGlmIChkZXZF
eHQtPnN0YXRlICE9IFNUQVRFX1JFTU9WRUQpew0KDQogICAgICAgICAgICBkZXZFeHQtPnN0YXRl
ID0gU1RBVEVfUkVNT1ZFRDsNCiAgICAgICAgICAgIElvQ29weUN1cnJlbnRJcnBTdGFja0xvY2F0
aW9uVG9OZXh0KGlycCk7DQogICAgICAgICAgICBzdGF0dXMgPSBJb0NhbGxEcml2ZXIoZGV2RXh0
LT50b3BEZXZPYmosIGlycCk7DQogICAgICAgICAgICBqdXN0UmV0dXJuU3RhdHVzID0gVFJVRTsN
Cg0KICAgICAgICAgICAgREJHT1VUKCgiUkVNT1ZFX0RFVklDRSAtIHdhaXRpbmcgZm9yICVkIGly
cHMgdG8gY29tcGxldGUuLi4iLA0KICAgICAgICAgICAgICAgICAgICBkZXZFeHQtPnBlbmRpbmdB
Y3Rpb25Db3VudCkpOw0KDQogICAgICAgICAgICBEZWNyZW1lbnRQZW5kaW5nQWN0aW9uQ291bnQo
ZGV2RXh0KTsNCiAgICAgICAgICAgIEtlV2FpdEZvclNpbmdsZU9iamVjdCggICZkZXZFeHQtPnJl
bW92ZUV2ZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aXZl
LCAgICAgIC8vIHdhaXQgcmVhc29uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBLZXJuZWxNb2RlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Us
ICAgICAgICAgIC8vIG5vdCBhbGVydGFibGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIE5VTEwgKTsgICAgICAgICAvLyBubyB0aW1lb3V0DQoNCiAgICAgICAgICAgIERCR09V
VCgoIlJFTU9WRV9ERVZJQ0UgLSAuLi4gRE9ORSB3YWl0aW5nLiAiKSk7DQoNCg0KICAgICAgICAg
ICAgSW9EZXRhY2hEZXZpY2UoZGV2RXh0LT50b3BEZXZPYmopOw0KICAgICAgICAgICAgIERCR09V
VCgoICJpb2RldGFjaCIgKSk7DQogICAgICAgICAgICAgREJHT1VUKCggInJlbW92ZSBpb2RlbGV0
ZSBiZWZvcmUiICkpOw0KICAgICAgICAgICAgIElvRGVsZXRlRGV2aWNlKGRldkV4dC0+ZmlsdGVy
RGV2T2JqKTsNCiAgICAgICAgICAgICBEQkdPVVQoKCAicmVtb3ZlIGlvZGVsZXRlIGFmdGVyIiAp
KTsNCiAgICAgICAgfQ0KICAgICAgICBicmVhazsNCg0KICAgICAgVk9JRCBWQV9Ecml2ZXJVbmxv
YWQoSU4gUERSSVZFUl9PQkpFQ1QgRHJpdmVyT2JqZWN0KQ0KICAgIHsNCiAgICAgICAgUEFHRURf
Q09ERSgpOw0KICAgICAgIERCR09VVCgoIlZBX0RyaXZlclVubG9hZCIpKTsNCiAgICB9DQoNCioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgIEhvdyBzaG91bGQgSSBzb2x2ZSB0aGlzIHBy
b2JsZW0/DQogICAgICAgICAgICAgVGhhbmsgeW91IGZvciBoZWxwLA0KICAgICAgICAgICAgQmVz
dCBSZWdhcmRzLA0KICAgICAgICBHb3Jkb24NCg0K


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com