sdyxz123 2023-07-17 11:29 采纳率: 36.4%
浏览 65
已结题

Windows驱动设备栈疑问

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

  • 写回答

4条回答 默认 最新

  • 「已注销」 2023-07-17 12:36
    关注

    DEVICE_OBJECT 结构体中有个成员是 DeviceExtension, 这个成员就是给你自定义用的, 你在用 IoCreateDevice 创建设备时指定创建DeviceExtension的大小, 系统会自动给你创建内存,然后你自己初始化,并设置用于区分不同设备的字段, 然后在执行IRP请求时取出用来区分

    typedef struct {
        char name;
    }MY_DEVICE_EXTENSION ;
    
    // 添加时
    status = IoCreateDevice(DriverObject, sizeof(MY_DEVICE_EXTENSION),
                               &deviceObjName, device_type,
                               device_characteristics, TRUE, &deviceObject);
    
       MY_DEVICE_EXTENSION*  pDevExt = deviceObject->DeviceExtension;
       RtlZeroMemory(pDevExt, sizeof(MY_DEVICE_EXTENSION ));
    pDevExt->name = 'A'; 
    
    // 处理时
    MY_DEVICE_EXTENSION*  pDevExt = deviceObject->DeviceExtension;
    if( pDevExt->name == 'A' ){
        .....
    }else if( ... ) ...
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月17日
  • 已采纳回答 7月17日
  • 创建了问题 7月17日