鸟叔叔不吃菜 2023-06-01 14:42 采纳率: 25%
浏览 22
已结题

一段在WDF的默认队列的EvtIoRead例程中创建READ请求并转发的代码,每当运行至 ”发送请求“这里 就会崩溃

一段在WDF的默认队列的EvtIoRead例程中创建READ请求并转发的代码,我在调试的时候,每当运行至 ”发送请求“这里 就会崩溃,但是实在是不知道什么原因

VOID EvtIoRead(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t Length) {
    NTSTATUS                            status;
    WDF_REQUEST_SEND_OPTIONS            options;
    PQUEUE_CONTEXT    pQueueContext = NULL;
    PAGED_CODE();

    pQueueContext = GetQueueContext(Queue);
    PVOID buffer = NULL;
    WDFMEMORY  memory = NULL;
    WDFREQUEST  newRequest = NULL;
    WDF_OBJECT_ATTRIBUTES  attributes;
    WDFIOTARGET ioTarget = WdfDeviceGetIoTarget(WdfIoQueueGetDevice(Queue));

    // 将缓冲区中的数据复制到原始请求的输出缓冲区
    status = WdfRequestRetrieveOutputBuffer(Request, Length, &buffer, NULL);
    if (!NT_SUCCESS(status)) {
        WdfRequestCompleteWithInformation(Request, status, Length);
        return;
    }
    strncpy(buffer, pQueueContext->ReadBuffer, Length);
    
    //
    // ******************* 创建一个新的请求 *************************************************
    //
    //初始化I/O请求对象环境变量结构
    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, REQUEST_CONTEXT);
   
    // 创建IO请求
    status = WdfRequestCreate(&attributes, ioTarget, &newRequest);
    if (NT_SUCCESS(status)) {
        PREQUEST_CONTEXT pReaquestContext = GetRequestContext(newRequest);
        pReaquestContext->IsCreateManual = TRUE;
        // 创建内存对象用于存储读取的数据
        status = WdfMemoryCreate(&attributes, NonPagedPool, 0, Length, &memory, NULL);
        if (NT_SUCCESS(status)) {
            // 将内存对象关联到请求
            status = WdfIoTargetFormatRequestForRead(ioTarget, newRequest, memory, NULL, NULL);
            if (NT_SUCCESS(status)) {
                //WdfRequestFormatRequestUsingCurrentType(newRequest);
                WDF_REQUEST_SEND_OPTIONS_INIT(&options, WDF_REQUEST_SEND_OPTION_SYNCHRONOUS);
                WdfRequestSetCompletionRoutine(newRequest, EvtReadRequestIoctlCompletionRoutine, NULL);
                // 发送请求
                if (WdfRequestSend(newRequest, ioTarget, &options) == FALSE) {
                    WdfObjectDelete(memory);
                    WdfObjectDelete(newRequest);
                }
            }
            else {
                WdfObjectDelete(memory);
                WdfObjectDelete(newRequest);
            } 
        }
        else {
            WdfObjectDelete(newRequest);
        }
    }
    // 完成原始请求
    WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, Length);   

}
  • 写回答

1条回答 默认 最新

  • 赵4老师 2023-06-01 15:23
    关注

    学会使用WinDbg双机调试驱动程序

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月1日
  • 创建了问题 6月1日

悬赏问题

  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!