Как получить доступ к моим пользовательским переменным thread_local в моем драйвере ядра Windows?

#c #windows #kernel #driver

#c #Windows #ядро #драйвер

Вопрос:

Я хочу создать общую память для обмена данными между моим .exe и моим драйвером. Мой текущий план состоит в том, чтобы иметь thread_local переменные в пользовательском режиме, а затем использовать их для связи.

.exe

 typedef struct blabla {
int a = 10;
int b = 20;
int c = 30;
int d = 40;

}blabla, * pblabla;

volatile thread_local blabla dd;
  

.драйвер

 PEPROCESS process = FunctionToGetProcess();
auto next_entry = process->ThreadListHead.Flink;

while (next_entry != amp;process->ThreadListHead)
{
    PETHREAD thread = (PETHREAD)CONTAINING_RECORD(next_entry, _KTHREAD, ThreadListEntry);

    
    auto teb = (PTEB)thread->Teb;

    
    for (int i = 0; i <= 63;   i) {
        if (teb->TlsSlots[i] != NULL) {
            Log("Values :  %d n", test);
        }
        else {
            Log("NULLn");
        }
    }
    
    
    next_entry = next_entry->Flink;


}
  

TEB MSDN:https://learn.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-teb

Локальное хранилище потоков:https://learn.microsoft.com/en-us/windows/win32/procthread/thread-local-storage

Документация не предоставляет достаточно информации, чтобы я знал, как получить к ним доступ. В настоящее время я нахожу свой EPROCESS, а затем перебираю все ETHREAD -> TEB-> TLS.

Я знаю, что смещение полей для СТРУКТУР WIN является неофициальным и будет (возможно) отличаться в разных ОС и пакете обновления, и они могут исчезнуть в будущей версии. Поскольку я всегда буду использовать только ту же версию ОС, не обновляя ее, это не проблема. Я также знаю, что существуют вызовы WINAPI для создания общей памяти и что основным средством связи является IOCTL. Моя цель — сделать это без использования вызовов WINAPI внутри пользовательского режима.