Если вы все еще хотите ответить, у меня возникла та же проблема, и я отправил свой вопрос, похожий на ваш:
Потоковое локальное хранилище в режиме ядра?
Мне нужен TLS-эквивалент в драйвере режима ядра. Если быть точным, у меня есть глубокое дерево вызовов функций, которое возникает в какой-то момент (например, процедура диспетчеризации драйверов), и мне нужно передать контекстную информацию.
В моем конкретном случае выгода в том, что мне не нужно постоянное хранилище, мне просто нужен специфичный для потока заполнитель для чего-то для одного вызова функции верхнего уровня. Поэтому я решил использовать произвольную запись в массиве TLS для вызова функции, а после того, как это сделано, - восстановить ее первоначальное значение.
Вы получаете массив TLS следующим образом:
DWORD* get_Tls()
{
return (DWORD*) (__readfsdword(0x18) + 0xe10);
}
Кстати, я понятия не имею, почему к TIB обычно обращаются, читая содержимое fs:[0x18]
. Это просто указывает селектор fs
. Но именно так весь код MS получает к нему доступ, поэтому я решил сделать это тоже.
Далее вы выбираете произвольный индекс TLS, скажем, 0.
const DWORD g_dwMyTlsIndex = 0;
void MyTopLevelFunc()
{
// prolog
DWORD dwOrgVal = get_Tls()[g_dwMyTlsIndex];
get_Tls()[g_dwMyTlsIndex] = dwMyContextValue;
DoSomething();
// epilog
get_Tls()[g_dwMyTlsIndex] = dwOrgVal;
}
void DoSomething()
{
DWORD dwMyContext = get_Tls()[g_dwMyTlsIndex];
}