Función ProbeForWrite (wdm.h)
Advertencia
La función ProbeForWrite no se recomienda para su uso en el software actual y solo se incluye por compatibilidad histórica. Use ProbeForRead en su lugar al validar los búferes de usuario. Consulta Comentarios para obtener más información.
La rutina ProbeForWrite comprueba que un búfer en modo de usuario reside realmente en la parte del modo de usuario del espacio de direcciones, se puede escribir y se alinea correctamente.
Sintaxis
void ProbeForWrite(
[in, out] volatile VOID *Address,
[in] SIZE_T Length,
[in] ULONG Alignment
);
Parámetros
[in, out] Address
Especifica el principio del búfer en modo de usuario.
[in] Length
Especifica la longitud, en bytes, del búfer en modo de usuario. Consulte información adicional en la sección Comentarios.
[in] Alignment
Especifica la alineación necesaria, en bytes, del principio del búfer en modo de usuario.
Valor devuelto
None
Observaciones
Normalmente, esta función no proporciona ninguna ventaja sustancial sobre ProbeForRead porque un controlador sólido siempre debe estar preparado para controlar los cambios de protección en el espacio de direcciones virtuales del modo de usuario, incluidos los cambios de protección que quitan el permiso de escritura en un búfer pasado a un controlador después de que se haya ejecutado una llamada a ProbeForWrite . Dado que ProbeForWrite accede a cada página del búfer proporcionado, el rendimiento puede reducirse debido a la sobrecarga de acceder a cada página, especialmente si el búfer proporcionado describe una gran región del espacio de direcciones virtuales. Además, dado que ProbeForWrite escribe en cada página, es posible que el mismo búfer no se use de forma segura con varias solicitudes de controlador simultáneas. Por estos motivos, el nuevo código de controlador siempre debe usar ProbeForRead en su lugar.
En la tabla siguiente se describen las propiedades de cada rutina de sondeo de búfer de modo kernel:
Comportamiento | ProbeForRead | ProbeForWrite |
---|---|---|
Confirma que el búfer describe una región en el espacio de direcciones del modo de usuario, si la longitud no es cero. | x | x |
Confirma que la dirección base del búfer y la longitud no ajustan el valor máximo del puntero pasado. | x | x |
Confirma que el búfer está alineado con el límite de alineación solicitado, si la longitud no es cero. | x | x |
Confirma que el búfer se puede escribir inicialmente (puede cambiar en cualquier momento si la aplicación en modo de usuario vuelve a proteger su espacio de direcciones). | x | |
Accede a cada página del búfer (sobrecarga adicional) | x | |
Modifica cada página del búfer (puede provocar un comportamiento inesperado si se usa el mismo búfer en paralelo con varias solicitudes de controlador). | x |
Históricamente, en determinados procesadores que no respetaban los permisos de solo lectura para el código del modo kernel, había diferencias funcionales significativas entre ProbeForWrite y ProbeForRead. En estos casos, el sistema operativo se basaba anteriormente en ProbeForWrite realizando una comprobación explícita de idoneidad de paginación. Esta distinción ya no es significativa para los procesadores compatibles con Windows NT 4.0 o posterior.
Comentarios heredados
Los controladores en modo kernel pueden usar ProbeForWrite para validar el acceso de escritura a los búferes asignados en el espacio del usuario. Se usa normalmente durante METHOD_NEITHER E/S para validar el búfer de usuario al que apunta Irp-UserBuffer>.
Si el intervalo de memoria especificado no es un intervalo de direcciones en modo de usuario válido o no se puede escribir (sin acceso, solo lectura, etc.), ProbeForWrite genera la excepción STATUS_ACCESS_VIOLATION. Si el principio del intervalo de direcciones no está alineado en el límite de bytes especificado por Alignment, ProbeForWrite genera la excepción STATUS_DATATYPE_MISALIGNMENT.
Los controladores deben llamar a ProbeForWrite dentro de un bloque try/except . Si la rutina genera una excepción, el controlador debe completar el IRP con el error adecuado. Tenga en cuenta que los accesos posteriores del controlador al búfer en modo de usuario también se deben encapsular dentro de un bloque try/except : una aplicación malintencionada podría tener otro subproceso eliminando, sustituyendo o cambiando la protección de los intervalos de direcciones de usuario en cualquier momento (incluso después o durante una llamada a ProbeForRead o ProbeForWrite). Para obtener más información, consulte Control de excepciones.
No utilice esta rutina en direcciones en modo kernel; generará una excepción.
Si Irp-RequestorMode> KernelMode = , los campos Irp-AssociatedIrp.SystemBuffer> e Irp-UserBuffer> no contienen direcciones en modo de usuario y una llamada a ProbeForWrite para sondear un búfer al que apunta cualquiera de los campos generará una excepción.
Si Length = 0, ProbeForWrite no comprueba la dirección. En este caso, la rutina no genera una excepción para una dirección que está mal alineada o está fuera del intervalo de direcciones de usuario válidas.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Disponible a partir de Windows 2000. |
Plataforma de destino | Universal |
Encabezado | wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h) |
Library | NtosKrnl.lib |
Archivo DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
Reglas de cumplimiento de DDI | HwStorPortProhibitedDIs(storport), IrqlExApcLte2(wdm) |