阅读:2206回复:5
【求助】 磁盘设备的枚举问题
请教各位大侠一个硬盘挂载分区的问题:
1.主分区表中有两个主分区表项,还有一个扩展分区表项 2.删掉一个非活动主分区表项,重启机器 3.相应的主分区在资源管理器中消失 4.重新向分区表的相应位置写入被删除的主分区表项(使用WinHex) 此时...... 如何才能在不重新启动机器的情况下挂载这个主分区(在过滤驱动中实现)??? 可以用IoInvalidateDeviceRelations( IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type ); 重新枚举吗? DeviceObject对象是什么设备的物理设备对象,如何获得? 希望各位高手,大侠赐教!!! |
|
沙发#
发布于:2008-07-02 20:09
我在磁盘(disk)设备上做了一个上层过滤驱动,并且使用过滤驱动的 AddDevice例程中传入的PhysicalDevObj(这个应该是disk的物理设备对象吧?)作为IoInvalidateDeviceRelations函数的DeviceObject参数,并且在应用程序中出发过滤驱动调用IoInvalidateDeviceRelations,但是仍然无法挂载那个主分区,这是为什么???
别人也做个类似的驱动,并且可以挂载,但是我的为什么不行呢? |
|
板凳#
发布于: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; } |
|
地板#
发布于:2008-07-04 07:29
//// 别人也做个类似的驱动,并且可以挂载,但是我的为什么不行呢? ////
你在哪看到的呢??/ 有没有跟踪看一下啊,iocontrol执行了没有啊?? |
|
地下室#
发布于:2008-07-04 15:26
回楼上的
在Windbg中跟踪了,iocontrol也执行了,而且IoInvalidateDeviceRelations函数也执行了,也促使了PNP管理器发送了IRP_MN_QUERY_DEVICE_RELATIONS控制命令了,但是好像也没能挂载,不知道为什么 |
|
5楼#
发布于:2008-07-15 11:42
BusRelations 为什么用这个呢?
磁盘只是bus上的一个设备,磁盘没有增加啊,只是分区变了啊? |
|