Función KsProbeStreamIrp (ks.h)

La función KsProbeStreamIrp realiza las modificaciones especificadas en los búferes de entrada y salida del IRP especificado en función de las marcas pasadas y, a continuación, valida el encabezado de secuencia. Esto resulta útil al localizar el control de excepciones o realizar un trabajo asincrónico en un IRP. El IRP resultante está básicamente en el formato METHOD_OUT_DIRECT o METHOD_IN_DIRECT, con la excepción de que el acceso al búfer de datos puede ser IoModifyAccess, según las marcas que se pasan a esta función o las marcas del encabezado de secuencia.

Sintaxis

KSDDKAPI NTSTATUS KsProbeStreamIrp(
  [in, out]      PIRP  Irp,
  [in]           ULONG ProbeFlags,
  [in, optional] ULONG HeaderSize
);

Parámetros

[in, out] Irp

Especifica el IRP cuyos búferes de entrada y salida se van a asignar. El modo de solicitante del IRP se usa al sondear los búferes.

[in] ProbeFlags

Especifica marcas que especifican cómo sondear el IRP de streaming; las marcas se muestran en la tabla siguiente.

[in, optional] HeaderSize

Especifica el tamaño para validar cada encabezado en que se pasa a este cliente, o cero si no se va a realizar ninguna validación. Si se usa, se supone que todo el búfer pasado es un múltiplo de este tamaño de encabezado, a menos que el búfer contenga en su lugar un único encabezado de cambio de formato.

Valor devuelto

La función KsProbeStreamIrp devuelve STATUS_SUCCESS si se ejecuta correctamente o devuelve un error de memoria o acceso.

Comentarios

Si la función solo se usa para asignar MDL y no para sondear y bloquear las direcciones, el autor de la llamada debe tener una rutina de finalización para limpiar la MDL. Por ejemplo, un mecanismo de bloqueo Just-In-Time puede asignar la lista MDL, pero solo bloquear la memoria según sea necesario. El cliente debe proporcionar código de limpieza para quitar la lista MDL bloqueada parcialmente antes de que se complete el IRP, presumiblemente en una rutina de finalización.

Si los encabezados parecen que ya se han copiado en un búfer del sistema, no se vuelve a validar. En general, llamar a la función KsProbeStreamIrp varias veces con un IRP no es perjudicial. Después de llamar a la función, los encabezados de secuencia están disponibles en PIRP. AssociatedIrp.SystemBuffer. Si se han asignado los MDL del búfer de secuencia, están disponibles a través del PIRP. MdlAddress.

Las siguientes define se usan para la variable ProbeFlags :

ProbeFlags Valor Descripción
KSPROBE_READ Indica que la operación es una secuencia leída en el dispositivo. Este es el valor predeterminado.
KSPROBE_WRITE Indica que la operación es una escritura de secuencia en el dispositivo.
KSPROBE_ALLOCATEMDL Indica que se deben asignar MDL para los búferes de secuencia si aún no se han asignado. Si no hay búferes de secuencia presentes, se omite la marca. Si no se especifica KSPROBE_PROBEANDLOCK al mismo tiempo que esta marca, el autor de la llamada debe tener una rutina de finalización para limpiar las MDL si no todas las MDL se sondearon y bloquearon correctamente.
KSPROBE_PROBEANDLOCK Si se establece el KSPROBE_ALLOCATEMDL, indica que se debe sondear y bloquear la memoria a la que hacen referencia las MDL para los búferes de secuencia. Si no se establece la marca de asignación mdl, esta marca se omite incluso si la asignación de MDL se ha realizado anteriormente. El método de sondeo viene determinado por qué tipo de IRP se pasa. Para una operación de escritura, se usa IoReadAccess . Para una operación de lectura, se usa IoWriteAccess . Si el cliente que envió los datos usa el grupo no paginado, se inicializan los MDL adecuados en lugar de sondear y bloquear.
KSPROBE_SYSTEMADDRESS Recupera una dirección del sistema para cada MDL de la cadena, por lo que el autor de la llamada no necesita hacerlo en un paso independiente. Esto se omite si no se ha establecido el sondeo y la marca de bloqueo, incluso si se han sondado previamente las MDL.
KSPROBE_ALLOWFORMATCHANGE Para un Stream Escritura, permite establecer la marca KSSTREAM_HEADER_OPTIONSF_TYPECHANGED en el encabezado de secuencia. Esto implica que el encabezado de secuencia no tiene una longitud extendida, aunque se indique un tamaño de encabezado extendido. Además, solo puede haber un encabezado de secuencia contenido en irP en este caso. El búfer asociado a este encabezado contiene el nuevo formato de datos. En el caso de los flujos de datos de memoria del sistema, el búfer no debe haberse adquirido del asignador negociado, ya que no forma parte del flujo de datos.

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado ks.h (incluye Ks.h)
Library Ks.lib