Я пытаюсь выполнить IOCTL (связь между KM и UM)
Дело здесь в том, чтобы получить базовый адрес процесса.
Вот моя функция в моем драйвере:
PVOID ioBuffer = NULL;
PUCHAR UserBuffer;
PIO_STACK_LOCATION io;
io = IoGetCurrentIrpStackLocation(irp);
ULONG inputBufferLength = NULL;
ULONG outputBufferLength = NULL;
ULONG ioControlCode = NULL;
PIO_STACK_LOCATION irpStack;
BASE_ADDRESS2 info = { 0 };
BASE_ADDRESS pOutput = { 0 };
irpStack = IoGetCurrentIrpStackLocation(irp);
ioBuffer = (*irp).AssociatedIrp.SystemBuffer;
inputBufferLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
if (inputBufferLength >= sizeof(BASE_ADDRESS2) &&
outputBufferLength >= sizeof(PBASE_ADDRESS) && ioBuffer) {
irp->IoStatus.Status = GetModuleBaseAddress((PBASE_ADDRESS)ioBuffer, &pOutput);
memcpy(ioBuffer, &pOutput, sizeof(pOutput));
irp->IoStatus.Information = sizeof(pOutput);
DbgPrintEx(0, 0, "pOutput.baseaddress :%p\n", pOutput.baseAddress);
DbgPrintEx(0, 0, "IoStatus.Information :%p\n", irp->IoStatus.Information);
IoCompleteRequest(irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
Моя отладочная печать показывает, что я правильно получаю базовый адрес: Возврат из dbgview
Однако, когда я возвращаю это значение в свое приложение единой системы обмена сообщениями, я получаю 0:
typedef struct _BASEADDRESS
{
ULONGLONG baseAddress;
} BASE_ADDRESS, * PBASE_ADDRESS;
typedef struct _BASEADDRESS2
{
LONG pid;
} BASE_ADDRESS2, * PBASE_ADDRESS2;
DWORD bytes = 0;
HANDLE DriverHdl;
BASE_ADDRESS2 info = { 0 };
BASE_ADDRESS pResult = { 0 };
info.pid = pID;
HANDLE hDevice = INVALID_HANDLE_VALUE;
hDevice = CreateFileW(DRIVER_NAME, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (!hDevice)
return 0;
if (DeviceIoControl(hDevice, IOCTL_BASEADDR, &info, sizeof(info), &pResult, sizeof(pResult), &bytes, nullptr))
printf("%08p", pResult.baseAddress);
return pResult.baseAddress;
Здесь pResult всегда равен 0.
Есть идеи, что я делаю неправильно? Честно говоря, новинка в C.