Layered SCSI port driver

Hi All,

I’m writing a simple layered driver that is supposed to receive SCSI
requests from a user application and send them to the port driver. Under
Windows 2000 the driver is working as expected. Under Windows NT if the
application sending the request is using MFC (Microsoft Foundation Class)
after the code below is executed the complete routine never gets called.

IrpStack->MajorFunction = IRP_MJ_SCSI;
IrpStack->Parameters.Scsi.Srb = Srb;

IoSetCompletionRoutine(Irp, CompleteScsiRequest, Context, TRUE, TRUE,
TRUE);

IrpStack = IoGetNextIrpStackLocation(Irp);
IrpStack->MajorFunction = IRP_MJ_SCSI;
IrpStack->Parameters.Scsi.Srb = Srb;

IoMarkIrpPending(Irp);
IoCallDriver(PortDevice, Irp);

return (STATUS_PENDING);

I tried to trace my thread and invariably, if some MFCxx! Call is in the
stack the irp gets “lost” and the thread stops in some NT unexpected
exception after a write operation. If, on the other hand, the process
calling my driver doesn’t use the MFC library, the completion routine is
called and everything works fine. Also, in Windows 2000 the same driver is
working fine with applications using MFC.

Does anybody have any idea how and why MFC is affecting my driver behavior
under Windows NT 4?

TIA,

Mirco Caramori