io驱动通讯缓冲区返回问题

问题应该出现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);

  • 这篇博客: 简单整理一下以英文字母命名或者开头的语言中的 3、R语言 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。R是统计领域广泛使用的诞生于1980年左右的S语言的一个分支。

  • 以下回答由chatgpt基于相关博客总结生成:

    根据提供的参考资料,我们可以得出如下解决方案:

    在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文件流缓冲区问题(原理详解+代码手撕)
可以参考这个例子


IO流读取缓冲区问题_发量旺盛的博客-CSDN博客 使用read读取纯中文/英文数据时完全可以的,但当读取中英文混的数据,就会产生问题(存在刚好读取到截断某个中文字符), https://blog.csdn.net/weixin_43568226/article/details/126150087