У меня есть следующая структура:
typedef struct _KERNEL_MODULE_REQUEST
{
BOOLEAN success;
ULONG64 processID;
ULONG64 module;
} _KERNEL_MODULE_REQUEST, *PKERNEL_MODULE_REQUEST;
Я заполняю эту структуру из моего пользовательского процесса и отправляю ее в мой драйвер ядра со следующим кодом:
ULONG64 GetMainModule()
{
DWORD bytes = 0;
if (handle == INVALID_HANDLE_VALUE || processID == 0)
{
return false;
}
request.processID = this->processID;
if (DeviceIoControl(handle, IO_GET_MODULE_REQUEST, &request, sizeof(request), &request, sizeof(request), &bytes, NULL))
{
if (request.success)
{
return (ULONG64)request.module;
}
else
{
return false;
}
}
}
Кодполучают следующие инструкции:
case IO_GET_MODULE_REQUEST:
{
PEPROCESS process;
PKAPC_STATE state = NULL;
PKERNEL_MODULE_REQUEST request = (PKERNEL_MODULE_REQUEST)irp->AssociatedIrp.SystemBuffer;
PsLookupProcessByProcessId(request->processID, &process);
// Attach to the process and get it's base
KeStackAttachProcess((PKPROCESS)process, &state);
request->module = (DWORD64)PsGetProcessSectionBaseAddress(process);
KeUnstackDetachProcess(&state);
irp->IoStatus.Status = STATUS_SUCCESS;
irp->IoStatus.Information = sizeof(_KERNEL_MODULE_REQUEST);
}
break;
При отладке с использованием windbg структура правильно распаковывается на стороне ядра, и я получаю правильный PID.Я также печатаю адрес модуля, и он возвращает правильное значение (подтверждено через ProcessHacker).Однако, когда я пытаюсь распечатать модуль на стороне пользователя, он не возвращает правильный адрес.
Может кто-нибудь объяснить, что я делаю не так?