Armazenamento local de threads no modo kernel?

Existe um TLS (Thread-Local Storage) equivalente para drivers no modo kernel no Windows (Win32 para ser exato

O que eu tento alcançar:

Eventualmente, dentro da rotina de expedição do meu motorista, ele pode chamar muitas outras funções (pode haver uma pilha de chamadas profunda). Desejo fornecer algumas informações de contexto específicas para a solicitação que está sendo processada. Ou seja, eu tenho alguma estrutura, ponteiro para o qual deve estar visível em todas as funções chamadas, sem explicitamente passá-lo como parâmetro para todas as funçõe

Usar estático / global não é uma opção perfeita (multithreading, sincronizar objetos e etc.

Se esse fosse um código no modo de usuário - obviamente, o TLS seria usado nessa situação. Mas o AFAIK não possui funções no modo kernel comoTlsGetValue/TlsSetValue. E isso faz sentido - para que essas funções funcionem, é necessário alocar um índice TLS para todo o processo primeiro. O código do driver OTOH pode ser chamado em thread arbitrário, não limitado a um processo específic

No entanto, eu realmente não preciso de umpersistent armazenamento específico do encadeamento. Eu só preciso de um armazenamento específico de segmento para minha chamada de função de nível superio

Eu acho que sei como "implementar" o TLS, embora de uma maneira imprudente. Em vez de alocar o índice TLS, sempre utilizarei um índice predefinido (por exemplo, índice = 0). Na função de nível superior, salvarei o valor TLS armazenado e o substituirei pelo valor necessário. Após a conclusão, o valor salvo será restaurad

Felizmente, sei como o TLS é implementado no Win32. Há umTIB estrutura (bloco de informações do encadeamento) para cada encadeamento. Em cada thread, ele pode ser acessado usandoFS:[18h] seletor. OTIB contém (entre outras coisas) uma matriz usada pelo TLS. O resto é bem direto.

Como preferiria usar uma API oficial para obter algo semelhant

xiste uma API oficial do modo kernel para alcançar o que eu precis Existem razões para evitar o que pretendo fazer? Sei que pode haver um problema com a reentrada (ou seja, algum código me chama, sobrescrevo o valor TLS e, eventualmente, chamo o código de origem, que pode depender do TLS). Mas isso não é possível no meu caso específico?Existem maneiras menos sujas de resolver isso?

Desde já, obrigado

P.S. Pode-se teoricamente usar o SEH (que também possui informações por thread armazenadas). Ou seja, envolva o código de nível superior com__try/__except, onde as informações de contexto são necessárias - aumente o continuável exceção com algum parâmetro, no__except block preencha o parâmetro com as informações de contexto e, em seguida, retome a execução. E esse é um fluxo de programa 100% válido, sem o uso dos recursos não documentados. Mas, no entanto, isso parece um truque feio para mim, sem mencionar as complicações de desempenh

questionAnswers(6)

yourAnswerToTheQuestion