раздел 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...