ВУЗ:
Составители:
52
…
IoCopyCurrentIrpStackLocationToNext копирует все поля
IO_STACK_LOCATION из текущей позиции в следующую. При этом не
копируются поля, связанные с функциями завершения ввода-вывода.
3.10 Постановка IRP в очередь для последующей обработки
Постановка IRP в очередь для последующей обработки – третий возможный
вариант поведения диспетчерской функции. Приведенный ниже фрагмент кода
предполагает, что для работы с
очередями IRP используется объект DEVQUEUE:
NTSTATUS DispatchSomething(PDEVICE_OBJECT fdo, PIRP Irp)
{
…
IoMarkIrpPending(Irp); //a
StartPacket(&pdx->dqSomething, fdo, Irp, CancelRoutine);//b
return STATUS_PENDING; //c
}
a. Эту функцию следует вызывать всегда, когда диспетчерская функция
возвращает STATUS_PENDING.
b. Если устройство в данный момент занято или остановлено из-за события
PnP или управления питанием, функция StartPacket помещает запрос в
очередь; в противном случае устройство помечается как занятое, и
вызывается функция StartIo.
c. Возврат STATUS_PENDING говорит о том, что
обработка IRP еще не
завершена.
Следует отметить, что после вызова StartPacket не следует обращаться к
IRP, так как к моменту возврата управления из этой функции IRP может
оказаться завершенным, а занимаемая им память – освобожденной.
3.11 Функция StartIo
Функция StartIo часто используется для обработки IRP в очередях. В
приведенном ниже примере собственно
обработка IRP изображена многоточием.
VOID StartIo(PDEVICE_OBJECT device, PIRP Irp)
… IoCopyCurrentIrpStackLocationToNext копирует все поля IO_STACK_LOCATION из текущей позиции в следующую. При этом не копируются поля, связанные с функциями завершения ввода-вывода. 3.10 Постановка IRP в очередь для последующей обработки Постановка IRP в очередь для последующей обработки – третий возможный вариант поведения диспетчерской функции. Приведенный ниже фрагмент кода предполагает, что для работы с очередями IRP используется объект DEVQUEUE: NTSTATUS DispatchSomething(PDEVICE_OBJECT fdo, PIRP Irp) { … IoMarkIrpPending(Irp); //a StartPacket(&pdx->dqSomething, fdo, Irp, CancelRoutine);//b return STATUS_PENDING; //c } a. Эту функцию следует вызывать всегда, когда диспетчерская функция возвращает STATUS_PENDING. b. Если устройство в данный момент занято или остановлено из-за события PnP или управления питанием, функция StartPacket помещает запрос в очередь; в противном случае устройство помечается как занятое, и вызывается функция StartIo. c. Возврат STATUS_PENDING говорит о том, что обработка IRP еще не завершена. Следует отметить, что после вызова StartPacket не следует обращаться к IRP, так как к моменту возврата управления из этой функции IRP может оказаться завершенным, а занимаемая им память – освобожденной. 3.11 Функция StartIo Функция StartIo часто используется для обработки IRP в очередях. В приведенном ниже примере собственно обработка IRP изображена многоточием. VOID StartIo(PDEVICE_OBJECT device, PIRP Irp) 52
Страницы
- « первая
- ‹ предыдущая
- …
- 50
- 51
- 52
- 53
- 54
- …
- следующая ›
- последняя »