问题应该出现r0层,一跑就蓝屏
我想把这个mk返回给r3层,应该怎么改
r0代码
void IRP_IO_通过PID读取模块基址(PIRP pirp)
{
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(pirp); //获取应用层传来的参数
UINT64* 缓冲区 = (UINT64*)(pirp->AssociatedIrp.SystemBuffer);
KdPrint(("yjx:%s 行号%d\n", __FUNCDNAME__, __LINE__));
if (缓冲区)
{
//
//int*p = (int*)缓冲区;
UINT32 PID = (UINT32)(UINT64)缓冲区[0]; //传入数据
//PVOID pBase = (PVOID)((UINT64)缓冲区[1]); //传入数据
UINT64 nSize = (UINT64)缓冲区[3]; //传入数据
UINT64* mk = GetModuleR3(PID, "NOTEPAD.EXE", NULL);//UnityPlayer.dll 、 SCUM.exe
RtlCopyMemory(缓冲区, mk, nSize);
pirp->IoStatus.Status = STATUS_SUCCESS;
pirp->IoStatus.Information = nSize;//返回给DeviceIoControl中的 倒数第二个参数lpBytesReturned
IoCompleteRequest(pirp, IO_NO_INCREMENT);//调用方已完成所有I/O请求处理操作 并且不增加优先级
}
irpStack;
}
r3代码
UINT64 读模块基址(INT pid)
{
DWORD dwRetSize = 0;//返回字节数
ULONG64 tmp = 0;//存放读取的数据
UINT64 输入缓冲区[4] = { pid,0,tmp,8 };
DeviceIoControl(
DeviceHandle,//CreateFile打开驱动设备 返回的句柄
通讯码,//控制码 CTL_CODE
&输入缓冲区,//输入缓冲区指针
8*4,//输入缓冲区大小
&tmp,//返回缓冲区
sizeof(tmp),//返回缓冲区大小
&dwRetSize, //返回字节数
NULL);
return tmp;
}
如果 GetModuleR3 直接返回的是模块的地址, 那么他的下一句应该改成 RtlCopyMemory(缓冲区, &mk, nSize);
R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。R是统计领域广泛使用的诞生于1980年左右的S语言的一个分支。
根据提供的参考资料,我们可以得出如下解决方案:
在r0层的代码中,我们需要捕获并记录蓝屏错误的信息,然后将该信息传递给r3层进行处理。为了实现这个目标,我们可以在r0层的代码中添加异常处理机制,捕获蓝屏错误异常,并将错误信息保存至一个共享的数据结构中。然后,我们可以通过操作系统的API函数将该错误信息传递给r3层。
以下是r0层的伪代码示例:
#include <exception>
#include <string>
// 定义一个共享的数据结构来保存错误信息
struct ErrorData {
std::string errorMessage;
};
// 使用异常处理机制捕获蓝屏错误异常
void r0LayerFunction() {
try {
// IO驱动通讯缓冲区返回操作
// 如果发生蓝屏错误,抛出一个异常
throw std::exception("蓝屏错误");
} catch (const std::exception& e) {
// 创建共享的ErrorData实例并保存错误信息
ErrorData* errorData = new ErrorData();
errorData->errorMessage = e.what();
// 调用操作系统的API函数将错误信息传递给r3层
callSystemApi(errorData);
}
}
在r3层的代码中,我们可以使用操作系统的API函数来接收并处理r0层传递过来的错误信息。具体实现方式根据操作系统和编程语言的不同可能有所不同。以下是一个示例代码:
#include <iostream>
#include <string>
// 定义一个共享的数据结构来保存错误信息
struct ErrorData {
std::string errorMessage;
};
// 使用操作系统的API函数接收错误信息并进行处理
void r3LayerFunction() {
ErrorData* errorData = receiveErrorDataFromR0();
// 处理错误信息
std::cout << "收到错误信息:" << errorData->errorMessage << std::endl;
// 释放共享的ErrorData实例的内存
delete errorData;
}
需要注意的是,以上代码只是示例,具体的实现方式可能会因操作系统和编程语言的不同而有所不同。请在实际开发中根据具体的环境和需求进行相应的修改和调整。
Linux——深度解析IO文件流缓冲区问题(原理详解+代码手撕)
可以参考这个例子