7339|18

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

通过PFILE_OBJECT的DeviceObject如何修改盘符??十万火急! [复制链接]

如题:

UNICODE_STRING usDosName;
PFILE_OBJECT pFileObject = IrpSp->fileObject;

使用RtlVolumeDeviceToDosName(pFileObject->DeviceObject,&usDosName)
可以得到usDosName的盘符,如C:

问题是如何修改C:为 J:,实现文件的跨盘存储?

最新回复

做IO重定向参考 http://support.microsoft.com/kb/319447/en-us  详情 回复 发表于 2010-4-20 14:52
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
自己项下。。

mark
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
友情帮顶下


MARK 、 、 、 、
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
搜索一下MSDN的HELP看看都有哪些相关函数
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
楼上所有是修改usDosName的字符串了,并不是对pFileObject->DeviceObject进行了修改,在IRP下发时,pFileObject->DeviceObject还是没变!!
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

6
 
DeviceObject 应该是不可能去改变的,它只是代表了一个设备,关键的是文件对象!只要是访问文件,无论哪个设备最终他访问的均会到达该文件对象,而更改了文件对象的信息,也就能达到这种转移效果! 我之前只是改过 FILE_OBJECT里的权限位置,OBJECT_HEADER_NAME_INFO 没试过!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
liuyu历害啊,我今天也在找FILE_OBJECT下有关盘符的信息,没找到!
你写的_OBJECT_HEADER 817927c8,由FILE_OBJECT如何关联到_OBJECT_HEADER的呢??
FILE_OBJECT下没这个结构啊!!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
1kd>!object 817927e0  //这个对象是设备对象
Object: 817927e0  Type: (817a9ca0) Device ObjectHeader: 817927c8 (old version) //设备头对象
    HandleCount: 0  PointerCount: 9
    Directory Object: e1006948  Name: HarddiskVolume1

//对象头大小是固定的! 0x18, 可通过OBJECT_HEADER的Body字段进行定位! 也可以使用微软的OBJECT_TO_OBJECT_HEADER 宏来定位! 实际上也就是对象减去0x18 就是对象头了
lkd> dt _OBJECT_HEADER 817927c8
nt!_OBJECT_HEADER
    +0x018 Body             : _QUAD
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

9
 
我觉得这样改应该不行,而是应该将该文件对象上的设备对象更改为另一个设备对象,类似如把卷C这个设备对象替换成你需要的卷J设备对象! 这样那个路径就不需要更改,因为那个卷名如HarddiskVolume1的设备你一更改HarddiskVolumeX ,别的文件对象如果是本身是这个卷的,是不是就会出问题!
lkd> dt _FILE_OBJECT 815775c0
ntdll!_FILE_OBJECT
   +0x004 DeviceObject     : 0x817927e0 _DEVICE_OBJECT // 我觉得应该是替换这,因为这样替换只会影响当前这个文件对象,但我不知道这样替换了是不是会出问题!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 
!object 0x815d6e78 // 这个是文件对象地址
Object: 815d6e78  Type: (817a9730) File
    ObjectHeader: 815d6e60 (old version)
    HandleCount: 0  PointerCount: 1
    Directory Object: 00000000  Name: \XueTr.exe {HarddiskVolume1}

问题:我调试设备对象没东西出来,调试文件对象时如上,有没有那个结构是!object,和Direcotry Object 的???
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

11
 
别的文件对象如果是本身是这个卷的,不会出问题,我试过了!
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

12
 
呵呵,我现在就是想改文件对象本身,而不是更改上边的设备对象。
现在的问题是如何对PFILE_OBJECT地址结构化!PFILE_OBJECT   ----> !object   ---- >Directory Object..???
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

13
 
lkd> dt _FILE_OBJECT fed5fba0
nt!_FILE_OBJECT
   +0x000 Type             : 5
   +0x002 Size             : 112
   +0x004 DeviceObject     : 0x80e4a8d0 _DEVICE_OBJECT
   +0x008 Vpb              : 0x80dc41d8 _VPB
   +0x00c FsContext        : 0xe128fd20
   +0x010 FsContext2       : 0xe128feb8
   +0x014 SectionObjectPointer : (null)
   +0x018 PrivateCacheMap  : (null)
   +0x01c FinalStatus      : 0
   +0x020 RelatedFileObject : (null)
   +0x024 LockOperation    : 0 ''
   +0x025 DeletePending    : 0 ''
   +0x026 ReadAccess       : 0x1 ''
   +0x027 WriteAccess      : 0 ''
   +0x028 DeleteAccess     : 0 ''
   +0x029 SharedRead       : 0x1 ''
   +0x02a SharedWrite      : 0x1 ''
   +0x02b SharedDelete     : 0 ''
   +0x02c Flags            : 0x40002
   +0x030 FileName         : _UNICODE_STRING "\Documents and Settings\Administrator\My Documents"
   +0x038 CurrentByteOffset : _LARGE_INTEGER 0x0
   +0x040 Waiters          : 0
   +0x044 Busy             : 0
   +0x048 LastLock         : (null)
   +0x04c Lock             : _KEVENT
   +0x05c Event            : _KEVENT
   +0x06c CompletionContext : (null)
lkd> !object fed5fba0
Object: fed5fba0  Type: (80f2eca0) File
    ObjectHeader: fed5fb88 (old version)
    HandleCount: 1  PointerCount: 1
    Directory Object: 00000000  Name: \Documents and Settings\Administrator\My Documents {HarddiskVolume1}
lkd> !object 0x80e4a8d0 //这个就是设备对象,是从文件对象的DeviceObject
Object: 80e4a8d0  Type: (80ee91c8) Device
    ObjectHeader: 80e4a8b8 (old version)
    HandleCount: 0  PointerCount: 9
    Directory Object: e1006948  Name: HarddiskVolume1
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

14
 
Directory Object //这个是与你这个程序无关的,它是系统内核对象类型! 如Key ,File, Event ...; 在XueTr中第一列可以看到
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

15
 
嗯,pFileObject->DeviceObject已经可以得到,如何编程用一个结构接收这个地址,使之求出 "HarddiskVolume1"字符串地址???
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

16
 
kd> dt _object_header_name_info 817d0d80-0x10
nt!_OBJECT_HEADER_NAME_INFO
   +0x000 Directory        : 0xe1006948 _OBJECT_DIRECTORY
   +0x004 Name             : _UNICODE_STRING "HarddiskVolume1"
   +0x00c QueryReferences  : 1
呵呵!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
由 FILE_OBJECT -> DeviceObject -> OBJECT_HEADER(DeviceObject - 0x18) -> OBJECT_HEADER_NAME_INFO(OBJECT_HEADER + 0x00c) -> UNICODE_STRING(OBJECT_HEADER_NAME_INFO + 0x004) 就完了,这里就是"HarddiskVolume1"

lkd> dt _FILE_OBJECT 815775c0
ntdll!_FILE_OBJECT
   +0x004 DeviceObject     : 0x817927e0 _DEVICE_OBJECT //拿到设备对象
lkd> dt _OBJECT_HEADER 817927c8  //0x817927e0 - 0x18 得来的, 这就是设备头
nt!_OBJECT_HEADER
   +0x008 Type             : 0x817a9ca0 _OBJECT_TYPE
   +0x00c NameInfoOffset   : 0x10 '' //这里就是OBJECT_HEADER_NAME_INFO结构(该地址在头的前面,OBJECT_HEADER - 0x10 才能得到

lkd> dt _OBJECT_HEADER_NAME_INFO 817927b8 //0x817a9ca0 - 0x10 得来的,这就是对象头名称信息
nt!_OBJECT_HEADER_NAME_INFO
   +0x000 Directory        : 0xe1006948 _OBJECT_DIRECTORY
   +0x004 Name             : _UNICODE_STRING "HarddiskVolume1" //这里就保持了字符串
   +0x00c QueryReferences  : 1
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

18
 
谢谢liuyu,不过修改
HarddiskVolume1还是不行,应该是还有别的地方没改!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

19
 
做IO重定向参考
http://support.microsoft.com/kb/319447/en-us
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表