鸟叔叔不吃菜 2023-06-05 15:51 采纳率: 25%
浏览 35

一个关于WDF驱动开打的问题

有个关于WDF的问题,因为之前玩游戏,我买了一个游戏外设,我在尝试给它写个过滤驱动,我使用的是WDF框架,驱动中创建了一个并行队列,并实现了其EvtIoRead例程。在该例程中,我想对原始Read请求执行完成操作,然后创建一个新的Read请求,我根据书上所示,通过 WdfRequestCreate,WdfMemoryCreate以及WdfIoTargetFormatRequestForRead等创建并格式化了一个新请求,但是我在使用WdfIoTargetFormatRequestForRead格式化请求后,通过调用WdfRequestGetParameters获取请求的参数信息,但是我发现 ,其类型却是WdfRequestTypeCreate,这种是什么什么原因呢 ?

  • 写回答

1条回答 默认 最新

  • IT论之程序员 2023-06-05 22:11
    关注

    这是因为在WDF中,当你调用WdfIoTargetFormatRequestForRead格式化一个请求以后,WDF实际上会重新创建一个新的请求,原来的请求会被释放。所以当你调用WdfRequestGetParameters获取请求的参数时,得到的请求类型是WDFRequestTypeCreate,而不是WDFRequestTypeRead。
    解决方法是,在格式化新请求前,你需要先保存原始读请求的参数信息,然后在格式化新请求时传入保存的参数信息。具体可以这样做:

    1. 在EvtIoRead中,首先调用WdfRequestGetParameters获取原始读请求的参数,保存下来:
      c
      WDF_REQUEST_PARAMETERS params;
      WDF_REQUEST_REUSE_PARAMS reuseParams;
      WDF_REQUEST_REUSE_PARAMS_INIT(&reuseParams);
      status = WdfRequestGetParameters(Request, &params);
    2. 然后创建新请求,并且传入reuseParams来重用原始请求的参数:
      c
      WDF_OBJECT_ATTRIBUTES attributes;
      WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
      attributes.EvtCleanupCallback = EvtChildCleanupCb;
      WDFREQUEST newRequest;
      status = WdfRequestCreate(&attributes, Request, &newRequest);
      status = WdfIoTargetFormatRequestForRead(Target, newRequest, &reuseParams);
    3. 这时,新请求的类型将仍然是WDFRequestTypeRead,你调用WdfRequestGetParameters获取的参数也和原始读请求一致。
    评论

报告相同问题?

问题事件

  • 创建了问题 6月5日

悬赏问题

  • ¥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固件#的问题,请各位专家解答!