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

UptoLike

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

50
Завершение IRP сводится к заполнению полей Status и Information в блоке
IRP IoStatus и последующему вызову функции IoCompleteRequest.
Поле Status принимает одно из значений, определенных в заголовочном
файле NTSTATUS.H. Некоторые стандартные значения состояния приведены в
таблице 3.2.
Таблица 3.2 – Стандартные значения NTSTATUS
Значение Описание
STATUS_SUCCESS Нормальное завершение
STATUS_UNSUCCESSFULL Запрос завершился неудачно, но точная
причина не может быть описана
STATUS_NOT_IMPLEMENTED Функция не была реализована
STATUS_INVALID_HANDLE Для выполнения операции был передан
недействительный дескриптор
STATUS_INVALID_PARAMETER Неверное значение параметра
STATUS_INVALID_DEVICE_REQUEST Запрос недействителен для данного
устройства
STATUS_EBD_OF_FILE Достигнут конец файла
STATUS_DELETE_PENDING Устройство находится в процессе
отключения
STATUS_INSUFFICIENT_RESOURCES Недостаточно системных ресурсов
(обычно памяти)
Завершение запроса в диспетчерской функции встречается наиболее часто.
Соответствующая функция может выглядеть следующим образом:
NTSTATUS CompleteRequest(PIRP Irp, NTSTATUS Status,
ULONG_PTR Information)
{
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = Information;
IoCompleteRequest(Irp, IO_NO_INCREMENT)
return status;
}
При вызове функции IoCompleteRequest аргументом передается величина
приращения приоритета, относящаяся ко всем потокам, ожидающим завершения
этого запроса.
Перед вызовом функции IoCompleteRequest необходимо удалить все
функции отмены, которые могли бы быть связаны с IRP. Эта функция решает
несколько задач:
      Завершение IRP сводится к заполнению полей Status и Information в блоке
IRP IoStatus и последующему вызову функции IoCompleteRequest.
      Поле Status принимает одно из значений, определенных в заголовочном
файле NTSTATUS.H. Некоторые стандартные значения состояния приведены в
таблице 3.2.

                 Таблица 3.2 – Стандартные значения NTSTATUS
Значение                             Описание
STATUS_SUCCESS                       Нормальное завершение
STATUS_UNSUCCESSFULL                 Запрос завершился неудачно, но точная
                                     причина не может быть описана
STATUS_NOT_IMPLEMENTED               Функция не была реализована
STATUS_INVALID_HANDLE                Для выполнения операции был передан
                                     недействительный дескриптор
STATUS_INVALID_PARAMETER             Неверное значение параметра
STATUS_INVALID_DEVICE_REQUEST        Запрос недействителен для данного
                                     устройства
STATUS_EBD_OF_FILE                   Достигнут конец файла
STATUS_DELETE_PENDING                Устройство находится в процессе
                                     отключения
STATUS_INSUFFICIENT_RESOURCES        Недостаточно    системных    ресурсов
                                     (обычно памяти)


      Завершение запроса в диспетчерской функции встречается наиболее часто.
Соответствующая функция может выглядеть следующим образом:
NTSTATUS CompleteRequest(PIRP Irp, NTSTATUS Status,
  ULONG_PTR Information)
  {
  Irp->IoStatus.Status = status;
  Irp->IoStatus.Information = Information;
  IoCompleteRequest(Irp, IO_NO_INCREMENT)
  return status;
  }
      При вызове функции IoCompleteRequest аргументом передается величина
приращения приоритета, относящаяся ко всем потокам, ожидающим завершения
этого запроса.
      Перед вызовом функции IoCompleteRequest необходимо удалить все
функции отмены, которые могли бы быть связаны с IRP. Эта функция решает
несколько задач:
                                     50