¿Almacenamiento local de subprocesos en modo kernel?

Existe un equivalente de almacenamiento local de subprocesos (TLS) para los controladores en modo kernel en Windows (Win32 para ser exactos)?

Lo que trato de lograr:

Finalmente, desde la rutina de envío de mi controlador, puede llamar a muchas otras funciones (puede haber una pila de llamadas profunda). Quiero proporcionar información de contexto específica para la solicitud que se procesa. Es decir, tengo una estructura, un puntero al cual debería ser visible en todas las funciones llamadas, sin pasarlo explícitamente como parámetro a cada función.

El uso de static / global no es una opción perfecta (subprocesamiento múltiple, sincronización de objetos, etc.).

Si ese fuera un código de modo de usuario, obviamente se usaría TLS en tal situación. Pero AFAIK no hay funciones en modo kernel comoTlsGetValue/TlsSetValue. Y esto tiene sentido: para que esas funciones funcionen, primero se debe asignar un índice TLS de todo el proceso. El código del controlador OTOH puede invocarse en un hilo arbitrario, no limitado a un proceso específico.

in embargo, en realidad no necesito unapersistent almacenamiento específico de hilo. Solo necesito un almacenamiento específico para subprocesos para mi invocación de funciones de nivel superior.

Creo que sé cómo "implementar" el TLS, aunque de una manera hack. En lugar de asignar el índice TLS, siempre usaré un índice predefinido (por ejemplo, índice = 0). En la función de nivel superior, guardaré el valor TLS almacenado y lo sobrescribiré con el valor necesario. Al finalizar, el valor guardado se restaurará.

Por suerte sé cómo se implementa el TLS en Win32. Hay unaTIB estructura (bloque de información de hilo) para cada hilo. En cada hilo se puede acceder usandoFS:[18h] selector. LosTIB contiene (entre otras cosas) una matriz utilizada por TLS. El resto es bastante sencillo

Sin embargo, preferiría usar una API oficial para lograr algo similar.

Existe una API oficial en modo kernel para lograr lo que necesito? ¿Hay razones para evitar lo que planeo hacer? Sé que potencialmente puede haber un problema con el reingreso (es decir, algunos códigos me invocan, sobrescribo el valor de TLS y finalmente llamo al código de origen, que puede depender de TLS). ¿Pero esto no es posible en mi caso específico? ¿Hay formas menos sucias de resolver esto?

Gracias por adelantado

PD. Teóricamente, se puede usar SEH (que también tiene información por hilo almacenada). Es decir, envuelva el código de nivel superior con__try/__except, luego, donde se necesita la información de contexto: aumente la continuable excepción con algún parámetro, en el__except block llena el parámetro con la información de contexto y luego reanuda la ejecución. Y este es un flujo de programa 100% válido, sin el uso de las características no documentadas. Sin embargo, esto me parece un truco feo, sin mencionar las complicaciones de rendimiento.

Respuestas a la pregunta(6)

Su respuesta a la pregunta