heroperseus
驱动牛犊
驱动牛犊
  • 注册日期2007-11-04
  • 最后登录2008-07-04
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望7点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2207回复:5

【求助】 磁盘设备的枚举问题

楼主#
更多 发布于:2008-07-02 20:02
请教各位大侠一个硬盘挂载分区的问题:
1.主分区表中有两个主分区表项,还有一个扩展分区表项
2.删掉一个非活动主分区表项,重启机器
3.相应的主分区在资源管理器中消失
4.重新向分区表的相应位置写入被删除的主分区表项(使用WinHex)

此时......
如何才能在不重新启动机器的情况下挂载这个主分区(在过滤驱动中实现)???
可以用IoInvalidateDeviceRelations(
    IN PDEVICE_OBJECT  DeviceObject,
    IN DEVICE_RELATION_TYPE  Type
    );
重新枚举吗?
DeviceObject对象是什么设备的物理设备对象,如何获得?
希望各位高手,大侠赐教!!!
heroperseus
驱动牛犊
驱动牛犊
  • 注册日期2007-11-04
  • 最后登录2008-07-04
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望7点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-02 20:09
我在磁盘(disk)设备上做了一个上层过滤驱动,并且使用过滤驱动的 AddDevice例程中传入的PhysicalDevObj(这个应该是disk的物理设备对象吧?)作为IoInvalidateDeviceRelations函数的DeviceObject参数,并且在应用程序中出发过滤驱动调用IoInvalidateDeviceRelations,但是仍然无法挂载那个主分区,这是为什么???

别人也做个类似的驱动,并且可以挂载,但是我的为什么不行呢?
heroperseus
驱动牛犊
驱动牛犊
  • 注册日期2007-11-04
  • 最后登录2008-07-04
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望7点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-07-02 20:34
附上我的部分代码,请各位高手指教!

......
typedef struct
{
    PDEVICE_OBJECT  TargetDevObj;
    PDEVICE_OBJECT  PhysicalDevObj;
    KEVENT          pagingPathCountEvent;
    ULONG           pagingPathCount;
}DISK_DEVICE_EXT, *PDISK_DEVICE_EXT;

......
PDEVICE_OBJECT  gDiskCdo;
PDEVICE_OBJECT  gDevObj; //全局性的过滤设备对象,此过滤设备对象是disk的上层过滤, 在AddDevice例程中创建

......

NTSTATUS
DiskFltIoControl(
    IN PDEVICE_OBJECT DevObj,
    IN PIRP Irp
    )
{
    NTSTATUS  status = STATUS_NOT_SUPPORTED;
    PIO_STACK_LOCATION  CurIrpStack = IoGetCurrentIrpStackLocation(Irp);
    PDISK_DEVICE_EXT     devExt;

    devExt = gDevObj->DeviceExtension;


    if (! IS_DISK_CDO(DevObj)) //向命名的控制设备对象发送控制代码
        return DiskFltPassThrough(DevObj, Irp);


    switch(CurIrpStack->Parameters.DeviceIoControl.IoControlCode)
    {
    case IOCTL_DISKFLT_MOUNT:
        IoInvalidateDeviceRelations(devExt->PhysicalDevObj,BusRelations);
        Irp->IoStatus.Status = STATUS_SUCCESS;
        Irp->IoStatus.Information = 0;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);

        status = Irp->IoStatus.Status;
        break;
    default:
        break;
    }



    return status;
}
petsatan
驱动牛犊
驱动牛犊
  • 注册日期2007-09-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望133点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-07-04 07:29
////  别人也做个类似的驱动,并且可以挂载,但是我的为什么不行呢?  ////
你在哪看到的呢??/

有没有跟踪看一下啊,iocontrol执行了没有啊??
heroperseus
驱动牛犊
驱动牛犊
  • 注册日期2007-11-04
  • 最后登录2008-07-04
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望7点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-07-04 15:26
回楼上的

在Windbg中跟踪了,iocontrol也执行了,而且IoInvalidateDeviceRelations函数也执行了,也促使了PNP管理器发送了IRP_MN_QUERY_DEVICE_RELATIONS控制命令了,但是好像也没能挂载,不知道为什么
petsatan
驱动牛犊
驱动牛犊
  • 注册日期2007-09-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望133点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-07-15 11:42
BusRelations  为什么用这个呢?
磁盘只是bus上的一个设备,磁盘没有增加啊,只是分区变了啊?
游客

返回顶部