Организация ввода-вывода. Драйверы WDM. Рощин А.В. - 70 стр.

UptoLike

Составители: 

70
В приведенном ниже коде части, относящиеся непосредственно к обработке
IRP выделены жирным шрифтом.
typedef struct _DEVICE_EXTENSION {
DEVQUEUE dqReadWrite;
} DEVICE_EXTENSION, *DEVICE_EXTENSION;
NTSTATUS AddDevice(PDRIVER_OBJECT DriverObject,
PDEVICE_OBJECT pdo)
{
InitializeQueue(&pdx->dqReadWrite, StartIo);
IoInitializeDpcRequest(fdo, (PIO_DPC_ROUTINE) DpcForIsr);
}
NTSTATUS DispatchReadWrite(PDEVICE_OBJECT fdo,PIRP Irp)
{
PDEVICE_EXTENSION pdx =
(PDEVICE_EXTENSION) fdo->DeviceExtension;
IoMarkIrpPending(Irp);
StartPacket(&pdx->dqReadWrite, fdo, Irp, CancelRoutine);
return STATUS_PENDING;
}
VOID CancelRoutine(PDEVICE_OBJECT fdo,PIRP Irp)
{
PDEVICE_EXTENSION pdx =
(PDEVICE_EXTENSION) fdo->DeviceExtension;
CancelRequest(&pdx->dqReadWrite, Irp);
}
VOID StartIo(PDEVICE_OBJECT fdo, PIRP Irp)
{
}
BOOLEAN OnInterrupt(PKITERRUPT junk, PDEVICE_EXTENSION pdx);
{
PIRP Irp = GetCurrentIrp(&pdx->dqReadWrite);
Irp->IoStatus.Status = STATUS_XXX;
    В приведенном ниже коде части, относящиеся непосредственно к обработке
IRP выделены жирным шрифтом.
typedef struct _DEVICE_EXTENSION {
DEVQUEUE dqReadWrite;
} DEVICE_EXTENSION, *DEVICE_EXTENSION;
NTSTATUS AddDevice(PDRIVER_OBJECT DriverObject,
PDEVICE_OBJECT pdo)
{
…
InitializeQueue(&pdx->dqReadWrite, StartIo);
IoInitializeDpcRequest(fdo, (PIO_DPC_ROUTINE) DpcForIsr);
…
}
NTSTATUS DispatchReadWrite(PDEVICE_OBJECT fdo,PIRP Irp)
{
PDEVICE_EXTENSION pdx =
 (PDEVICE_EXTENSION) fdo->DeviceExtension;
IoMarkIrpPending(Irp);
StartPacket(&pdx->dqReadWrite, fdo, Irp, CancelRoutine);
return STATUS_PENDING;
}
VOID CancelRoutine(PDEVICE_OBJECT fdo,PIRP Irp)
{
PDEVICE_EXTENSION pdx =
 (PDEVICE_EXTENSION) fdo->DeviceExtension;
CancelRequest(&pdx->dqReadWrite, Irp);
}
VOID StartIo(PDEVICE_OBJECT fdo, PIRP Irp)
{
…
}
BOOLEAN OnInterrupt(PKITERRUPT junk, PDEVICE_EXTENSION pdx);
{
…
PIRP Irp = GetCurrentIrp(&pdx->dqReadWrite);
Irp->IoStatus.Status = STATUS_XXX;
                                   70