sdyxz123 2023-08-01 06:02 采纳率: 36.4%
浏览 5
已结题

WDM 设备栈 处理IRP 疑问

在一个驱动创建多个设备对象 都是用的同一个派遣函数,IRP传递到设备栈,那到派遣函数里时候怎么区分是哪个目标设备请求的呢?,比如我应用程序是操作A设备,但是A的设备栈顶是B设备,在B派遣函数中(A和B实际是同一个派遣函数)怎么知道我是发给A的呢?就是在派遣函数里还要实现 多个设备的判断呢?

在同一派遣函数里判断不同设备对象,当一个应用程序发往A的IRP到达 B的设备栈时,那此时派遺函数是B的设备对象的extation区域就是B的name,但是我要在派遺函数中处理A设备的响应,那不是处理不了吗? 即使向下传递到A的设备栈,那此时派遣函数的传入参数是A的设备对象,对应上A的extation的name。

如下图片所描述:

img

  • 写回答

3条回答 默认 最新

  • 技术宅program 2023-08-01 07:44
    关注
    评论
  • 2301_79233340 2023-08-02 01:03
    关注

    引用chatgpt内容作答:
    在一个驱动中创建多个设备对象并且使用相同的派遣函数的情况下,确实需要在派遣函数中区分不同的目标设备请求。这个问题可以通过在每个设备对象的设备扩展(Device Extension)中添加标识来解决,从而在派遣函数中识别是哪个设备对象的请求。

    设备扩展是一个结构体,它可以在驱动中为每个设备对象单独分配,并且用于存储设备特定的信息。在创建设备对象时,可以在设备扩展中设置一些标识,以便在派遣函数中根据这些标识来区分设备对象。一种常见的做法是在设备扩展中添加一个设备类型标识,将其设置为与设备相关的唯一值。然后在派遣函数中,可以通过读取设备扩展中的标识来判断是哪个设备对象的请求。

    以下是一个示例,说明如何在派遣函数中区分不同的设备对象:

    typedef struct _DEVICE_EXTENSION {
        // 添加设备类型标识
        ULONG DeviceType;
        // 其他设备特定的信息可以在这里添加
    } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    
    NTSTATUS DispatchRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp) {
        PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
        
        // 根据设备类型标识来判断是哪个设备对象的请求
        if (pDevExt->DeviceType == DEVICE_TYPE_A) {
            // 处理设备A的请求
            // ...
        } else if (pDevExt->DeviceType == DEVICE_TYPE_B) {
            // 处理设备B的请求
            // ...
        } else {
            // 未知设备类型,可能是错误情况
            // ...
        }
        
        // 最后,确保将IRP传递给下一级设备栈,保持派遣函数的链式调用
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DeviceObject->NextDevice, Irp);
    }
    

    在创建设备对象时,可以根据设备类型将相应的标识添加到设备扩展中。然后在派遣函数中,可以根据这些标识来区分不同的设备对象。

    请注意,设备类型标识必须在创建设备对象时设置,并且必须在所有的派遣函数中正确地设置设备类型标识,以确保正确处理请求。

    最后,需要注意的是,派遣函数应该始终负责处理特定设备对象的请求,而不是将请求传递给错误的设备对象。在处理IRP时,派遣函数应该仅处理与设备对象相关的操作,并且对于无关的设备对象,应该将IRP传递给下一级设备栈,直到找到正确的设备对象为止。

    展开全部

    评论
编辑
预览

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月2日
  • 修改了问题 8月1日
  • 创建了问题 8月1日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部