ВУЗ:
Составители:
60
}
После этого пишутся две простые функции для постановки IRP в очередь
VOID NativeStartPacket(PDEVICE_EXTENSION pdx, PIRP Irp)
{
if (pdx->DeviceBusy)
InsertTailList(&pdx->IrpQueue,&Irp->Tail.Overlay.ListEntry);
else
{
pdx->DeviceBusy = TRUE;
StartIo(pdx->DeviceObject, Irp);
}
}
и извлечения его из очереди
VOID NativeStartNextPacket(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);
}
}
В коде извлечения IRP из очереди используется оригинальный макрос,
определенный в ntdef.h:
#define CONTAINING_RECORD(address, type, field) \
((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
Этот макрос восстанавливает по известному адресу поля структуры адрес
самой структуры.
Рассмотренный метод неудобен тем, что дополнительно необходим
механизм приостановки очереди на время некоторых состояний PnP и управления
питанием [3]. При этом пакеты запроса ввода-вывода накапливаются в
} После этого пишутся две простые функции для постановки IRP в очередь VOID NativeStartPacket(PDEVICE_EXTENSION pdx, PIRP Irp) { if (pdx->DeviceBusy) InsertTailList(&pdx->IrpQueue,&Irp->Tail.Overlay.ListEntry); else { pdx->DeviceBusy = TRUE; StartIo(pdx->DeviceObject, Irp); } } и извлечения его из очереди VOID NativeStartNextPacket(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); } } В коде извлечения IRP из очереди используется оригинальный макрос, определенный в ntdef.h: #define CONTAINING_RECORD(address, type, field) \ ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field))) Этот макрос восстанавливает по известному адресу поля структуры адрес самой структуры. Рассмотренный метод неудобен тем, что дополнительно необходим механизм приостановки очереди на время некоторых состояний PnP и управления питанием [3]. При этом пакеты запроса ввода-вывода накапливаются в 60
Страницы
- « первая
- ‹ предыдущая
- …
- 58
- 59
- 60
- 61
- 62
- …
- следующая ›
- последняя »