Функция обратного вызова 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) |