раздел Queuing I/O Requests из Олтера Оней,
приведен код "похожий" на оригинальный
VOID NaiveStartNextPacket(PDEVICE_EXTENSION pdx, PIRP Irp)
{
if (IsListEmpty(&pdx->IrpQueue))
pdx->DeviceBusy = FALSE;
else
{
PLIST_ENTRY foo = RemoveHeadList(&pdx->IrpQueue);
PIRP Irp = CONTAINING_RECORD(foo, IRP,
Tail.Overlay.ListEntry);
StartIo(pdx->DeviceObject, Irp);
}
}
далее
typedef struct _DEVICE_EXTENSION {
LIST_ENTRY IrpQueue;
KSPIN_LOCK IrpQueueLock;
BOOLEAN DeviceBusy;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
NTSTATUS AddDevice(...)
{
InitializeListHead(&pdx->IrpQueue);
KeInitializeSpinLock(&pdx->IrpQueueLock);
}
Здорово.....Как скомпиленный код IoStartNextPacket распознает поля IrpQueue и.т.п в моем DEVICE_EXTENSION не понятно.......Должно быть правило о размещении этих полей в моем DEVICE_EXTENSION...