gpt4 book ai didi

c++ - 使用 MapViewOfFile 发送结构并读取未知值

转载 作者:行者123 更新时间:2023-11-30 19:27:57 25 4
gpt4 key购买 nike

我基本上试图将我的结构转换或复制到我的其他进程部分 View ,但我不断收到错误

C2760: syntax error: unexpected token 'identifier', expected 'declaration'

这就是我正在做的事情:

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.

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

ReadRequest不是类型而是对象,如果要将文件映射地址写入struct KM_READ_REQUEST,则应将返回指针转换为该类型PKM_READ_REQUEST,并控制文件映射的大小:

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

这样你就可以为其设置PID地址大小输出

2.

memcpy(SharedSection, &ReadOutput, sizeof(ReadOutput));
  • ReadOutput 已经是输出值的地址,所以你不需要需要操作&
  • Sizeof(指针)始终等于 4(在 32 位中)和 8(在64 位);
  • 你最好使用一个新变量来存储复制的值,而不是覆盖以前的数据。

所以

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

编辑:回答您的评论,

您可以设置单个事件来在驱动程序和 UM 之间进行通信。

应用程序:

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,...);

关于c++ - 使用 MapViewOfFile 发送结构并读取未知值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55090976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com