Поделиться через


Функция обратного вызова PFNKSHANDLER (ks.h)

Подпрограмма, предоставляемая мини-хранилищем, вызывается, когда потоковая передача ядра получает запрос на IOCTL_KS_METHOD, get/set свойства. Укажите указатель на этот обработчик в соответствующей KSMETHOD_ITEMKSPROPERTY_ITEM структуре.

Синтаксис

PFNKSHANDLER Pfnkshandler;

NTSTATUS Pfnkshandler(
  [in]      PIRP Irp,
  [in]      PKSIDENTIFIER Request,
  [in, out] PVOID Data
)
{...}

Параметры

[in] Irp

Указывает IRP, содержащий запрос метода или свойства.

[in] Request

Указывает выровненную копию параметра метода. Обычно это указатель на структуру KSMETHOD или KSPROPERTY .

[in, out] Data

Указывает выровненную копию параметра данных метода или системный адрес исходного параметра данных в зависимости от флага, указанного в структуре KSMETHOD_ITEM метода.

Возвращаемое значение

Возвращается STATUS_SUCCESS, если метод обрабатывается и буфер данных заполнен в соответствии с флагом, указанным в KSMETHOD_ITEM. При возврате данных драйвер должен задать поле Irp-IoStatus.Information>, но не должен задавать поле Irp-IoStatus.Status> и не должен завершать IRP. Пометьте ожидающий IRP, если он должен быть завершен асинхронно.

Кроме того, возвращается STATUS_SOME_NOT_MAPPED, если метод был обработан, но конкретный запрос не был выполнен и должен быть завершен вызывающей вспомогательной функцией. Возвращает любое другое сообщение об ошибке, указывающее, что метод не поддерживается или произошла ошибка параметра.

Комментарии

Мини-driver указывает адрес этой подпрограммы в элементе MethodHandler структуры KSMETHOD_ITEM .

Объявление обработчика, используемое для KStrMethodHandler и KStrSupportHandler , также используется для обработчиков свойств и наборов событий с теми же параметрами и возвращаемыми значениями.

Когда вспомогательная функция, такая как KsMethodHandler , вызывает обработчик метода, буфер данных которого определен как буфер записи или изменения, обработчик метода должен задать для элемента Information структуры IO_STATUS_BLOCK для элемента IoStatus в IRP (параметрЕ Irp ) размер этого буфера данных. Мини-диск задает элемент Flagsструктуры KSMETHOD_ITEM для метода, чтобы KSMETHOD_TYPE_WRITE или KSMETHOD_TYPE_MODIFY, чтобы определить буфер данных обработчика метода как запись или изменение соответственно.

В следующем фрагменте кода показан пример реализации обработчика метода, который задает размер возвращаемого буфера данных в IRP:

NTSTATUS
  MethodHandler(PIRP pIrp, PKSIDENTIFIER Request, PVOID Data) {
    NTSTATUS Status = STATUS_UNSUCCESSFUL;
    // Pointer to hold the position on the Irp stack
    PIO_STACK_LOCATION  pIrpStack  = NULL;
    ASSERT(pIrp);
    if(Data) {
        // Modify data here
    }
    // Find the current Irp stack.
    pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
    if(pIrpStack) {
        // Set the size of the returning Irp data.
        pIrp->IoStatus.Information =
          pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
        Status = STATUS_SUCCESS;
    }
    return(Status);
}

Мини-driver указывает адрес этой подпрограммы в элементе GetPropertyHandler структуры KSPROPERTY_ITEM .

Мини-driver указывает адрес этой подпрограммы в элементе SetPropertyHandler структуры KSPROPERTY_ITEM .

Мини-диск указывает адрес этой подпрограммы в элементе SupportHandler структуры KSMETHOD_ITEM .

Объявление обработчика, используемое для KStrMethodHandler и KStrSupportHandler , также используется для обработчиков свойств и наборов событий с теми же параметрами и возвращаемыми значениями.

Требования

Требование Значение
Целевая платформа Персональный компьютер
Верхняя часть ks.h (включая Ks.h)

См. также раздел

KSMETHOD

KSMETHOD_ITEM

KSMETHOD_SET

KsMethodHandler