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


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

Подпрограмма, предоставляемая мини-driver, вызывается при получении потоковой передачи ядра IOCTL_KS_METHODзапроса свойства get/set. Укажите указатель на этот обработчик в соответствующей KSMETHOD_ITEMструктуре KSPROPERTY_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) размер этого буфера данных. Мини-driver задает элемент 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.

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

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

Требования

Требование Ценность
целевая платформа Настольный
заголовка ks.h (include Ks.h)

См. также

KSMETHOD

KSMETHOD_ITEM

KSMETHOD_SET

KsMethodHandler