Hello,
I’m writing a WDM driver for our firewire device and I’m wondering howto
handle surprise removal. In the 1394 diag example from the ddk all
resource are freed upon surprise removal. The code shown below is taken
from that example. Expecially this part of code seems not to work for
my device, because t1394_SubmitIrpSynch fails with error code 0xC0000022
(Access Denied). Sending an remove-resource-irp to the firewire bus
driver seems not possible after disconnecting the device.
Maybee someone could explain what is going wrong here.
Thanks
Uwe Kirst
// remove any isoch resource data
while (TRUE) {
KeAcquireSpinLock(&deviceExtension->IsochResourceSpinLock, &Irql);
if (!IsListEmpty(&deviceExtension->IsochResourceData)) {
PISOCH_RESOURCE_DATA IsochResourceData;
IsochResourceData =
(PISOCH_RESOURCE_DATA)RemoveHeadList(&deviceExtension->IsochResourceData);
KeReleaseSpinLock(&deviceExtension->IsochResourceSpinLock,
Irql);
TRACE(TL_TRACE, (“Surprise Removal: IsochResourceData =
0x%x\n”, IsochResourceData));
if (IsochResourceData) {
PIRB pIrb;
NTSTATUS ntStatus;
PIRP ResourceIrp;
CCHAR StackSize;
TRACE(TL_TRACE, (“Surprise Removal: Freeing hResource =
0x%x\n”, IsochResourceData->hResource));
StackSize =
deviceExtension->StackDeviceObject->StackSize + 1;
ResourceIrp = IoAllocateIrp(StackSize, FALSE);
if (ResourceIrp == NULL) {
TRACE(TL_ERROR, (“Failed to allocate ResourceIrp!\n”));
TRAP;
}
else {
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
IoFreeIrp(ResourceIrp);
TRACE(TL_ERROR, (“Failed to allocate pIrb!\n”));
TRAP;
}
else {
RtlZeroMemory (pIrb, sizeof (IRB));
pIrb->FunctionNumber = REQUEST_ISOCH_FREE_RESOURCES;
pIrb->Flags = 0;
pIrb->u.IsochFreeResources.hResource =
IsochResourceData->hResource;
ntStatus =
t1394_SubmitIrpSynch(deviceExtension->StackDeviceObject, ResourceIrp, pIrb);
if (!NT_SUCCESS(ntStatus)) {
TRACE(TL_ERROR, (“SubmitIrpSync failed =
0x%x\n”, ntStatus));
TRAP;
}
ExFreePool(pIrb);
IoFreeIrp(ResourceIrp);
}
}
}
}
else {
KeReleaseSpinLock(&deviceExtension->IsochResourceSpinLock,
Irql);
break;
}
}