отправка структуры с MapViewOfFile и чтение неизвестного значения - PullRequest
0 голосов
/ 10 марта 2019

Я в основном пытаюсь преобразовать или скопировать мою структуру в другое представление раздела процесса, но получаю сообщение об ошибке

C2760: синтаксическая ошибка: неожиданный идентификатор идентификатора токена, ожидаемое объявление1004 *

Вот что я делаю:

type RPM(UINT_PTR ReadAddress)
{
    if (hDriver == INVALID_HANDLE_VALUE) {
        return {};
    }

    DWORD64 Bytes;
    KM_READ_REQUEST ReadRequest{};

    type response{};

    ReadRequest.ProcessId = PID;
    ReadRequest.Address = ReadAddress;
    ReadRequest.Size = sizeof(type);
    ReadRequest.Output = &response;

Проблема здесь:

auto pBuf = (ReadRequest)MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, 4096);
if (!pBuf)
{
    printf("OpenFileMappingA(write) fail! Error: %u\n", GetLastError());
    system("pause");
}

printf("MapViewOfFile(write) created ! \n");

У меня возникла другая проблема при попытке прочитать неизвестное значение измой драйвер ядра.Он в основном читает память, а затем изменяет это значение на другое, основываясь на том, что я читаю, если его int, float и т. Д.

PKM_READ_REQUEST ReadInput = (PKM_READ_REQUEST)SharedSection; // cast readRequest to our struct which is in SharedSection.
void* ReadOutput = ReadInput->Output;

Status = ReadKernelMemory(Process, ReadInput->Address, ReadOutput, ReadInput->Size);

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

memcpy(SharedSection, &ReadOutput, sizeof(ReadOutput));

Вот как я хочу попытаться прочитать это, но приведу это так же, потому что я не хочу читать это как void, я хочу прочитать это как значение, которое было даноиз моего режима ядра.

auto pBuf = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 4096);
if (!pBuf)
{
    printf("OpenFileMappingA(write) fail! Error: %u\n", GetLastError());
    system("pause");
}

printf("MapViewOfFile(write) created ! \n");

Кстати, я использую недокументированную функцию mmcopyvirtualmemory в своем драйвере ядра.

1 Ответ

0 голосов
/ 11 марта 2019

1.

auto pBuf = (ReadRequest)MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, 4096);

ReadRequest не тип, а объект. Если вы хотите записать адрес карты файла в виде структуры KM_READ_REQUEST, вам следуетпреобразовать указатель возврата в тип PKM_READ_REQUEST, а также взять под контроль размер файла карты:

auto pBuf = (PKM_READ_REQUEST)MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, sizeof(KM_READ_REQUEST));

, чтобы можно было установить PID, Address, Sizeи Output для него.

2.

memcpy(SharedSection, &ReadOutput, sizeof(ReadOutput));
  • ReadOutput уже является адресом выходного значения, поэтому вам не нужна операция &.
  • Sizeof (указатель) всегда равен 4 (в 32-битном) и 8 (в 64-битном);
  • Вам лучше использовать новую переменную для хранения скопированных значений,Вместо перезаписи предыдущих данных。

Итак

type new_var;
memcpy(&new_var, ReadOutput, sizeof(KM_READ_REQUEST));

РЕДАКТИРОВАТЬ: ответить на ваши комментарии,

Вы можете установить одно событие для связи между драйвером и единой системой обмена сообщениями.

Приложение:

hDevice = CreateFile(Device);
hEvent = CreateEvent(...);
DeviceIoControl(hDevice, IOCTL_SET_EVENT, &hEvent,...);
WaitForSingleObject(hEvent, INFINITE);

Драйвер:

case IOCTL_SET_EVENT:
{
    HANDLE hUserEvent = *(HANDLE *)pIrp->AssociatedIrp.SystemBuffer;
    status = ObReferenceObjectByHandle(hUserEvent, EVENT_MODIFY_STATE,*ExEventObjectType, KernelMode, (PVOID*)&pDevExt->pEvent, NULL);
    ObDereferenceObject(pDevExt->pEvent);
    break;
}

Затем установите событие:

KeSetEvent(pdx->pEvent,...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...