Kernel mode - PsGetCurrentProcessId && PsGetCurrentProcess bad docs
в ходе написания драйвера столкнулся с необходимостью скрыть импорты. начал писать импретацию функций PsGetCurrentProcessId и PsGetProcessId(PsGetCurrentProcess()). обнаружил ошибку вроде как две функции по названию имеют один и тот же смысл но нет обратный реверс инженеринг показал обратное.
PsGetCurrentProcessId имеет следующий asm код
mov rax, gs:188
mov rax, [rax+4C8h] //ETHREAD::Cid
ret
проблема в данной функции что она берет process id из cid а точнее из какого процесс был создан поток.
PsGetCurrentProcess функция имеет правильный код тем самым она берет Process структуру из apc state вот asm code
mov rax, gs:188h
mov rax, [rax+0B8h] //KTHREAD::ApcState.Process
ret
получается что функция PsGetCurrentProcess берет текущий процесс из apc state который меняется зависимо переключения контекста. получается что если наш ядерный поток подключен к адресному пространству процесса то у него apcState будет указывать на процесс к которому подключен получается что абсолютно два разных вызова получение текущего proc id будут возвращать разные id.