#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 внутри пользовательского режима.