我基本上是在尝试将结构转换或复制到其他进程截面视图,但是我一直遇到错误
C2760:语法错误:意外的令牌'identifier',预期的'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
。
答案 0 :(得分:0)
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
已经是输出值的地址,所以您不必
需要操作&
。所以
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,...);