milkway
驱动牛犊
驱动牛犊
  • 注册日期2005-03-08
  • 最后登录2009-03-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2981回复:11

请教如何通过目录句柄获得目录的路径

楼主#
更多 发布于:2005-03-08 21:44
我挂钩了函数NtQueryDirectoryFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,FileInformation,Length,FileInformationClass,ReturnSingleEntry,FileMask,RestartScan);想通过参数FileHandle获得这个目录的路径,用什么方法啊?
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-09 09:12
先用ObReferenceObjectByHandle将句柄转换为对象指针,再在这里四处找找,或者把这里的当作字符串指针再找找
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
milkway
驱动牛犊
驱动牛犊
  • 注册日期2005-03-08
  • 最后登录2009-03-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-09 09:32
先用ObReferenceObjectByHandle将句柄转换为对象指针,再在这里四处找找,或者把这里的当作字符串指针再找找


在这里四处找找--是说让我在论坛里找找吗?把这里的当作字符串指针---这里是什么意思啊?
我是第一次在论坛发帖子提问,不要见笑啊?
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-09 10:17
[quote]先用ObReferenceObjectByHandle将句柄转换为对象指针,再在这里四处找找,或者把这里的当作字符串指针再找找


在这里四处找找--是说让我在论坛里找找吗?把这里的当作字符串指针---这里是什么意思啊?
我是第一次在论坛发帖子提问,不要见笑啊? [/quote]
ObReferenceObjectByHandle返回的指针指向这个对象的对象体,这个数据结构中有对象的各种属性,在这里找找,其中一些是指针。ObReferenceObjectByHandle返回的指针上面是对象头Header及几个相关可选的Section
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-09 10:43
使用NtQueryObject获得对象对应的名称。NtQueryObject是ntdll.dll导出的一个kernel函数,你可以用GetProcAddress来引用它。

OBJECT_INFORMATION_CLASS:1 (ObjectNameInformation)

NTSYSAPI
NTSTATUS
NTAPI
NtQueryObject(

  IN HANDLE               ObjectHandle OPTIONAL,
  IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
  OUT PVOID               ObjectInformation,
  IN ULONG                Length,
  OUT PULONG              ResultLength );
在交流中学习。。。
milkway
驱动牛犊
驱动牛犊
  • 注册日期2005-03-08
  • 最后登录2009-03-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-03-09 21:21
NtQueryObject总是调不对啊,我把代码写下来,帮我看看错在哪里吧:
char objectname[0x4000];
DWORD lenth=0;
HMODULE hNtDll;
int isok;
char j[20];

hNtDll=GetModuleHandle(\"ntdll.dll\");
NtQueryObject=(NtQueryObject1)GetProcAddress(hNtDll,\"NtQueryObject\");
isok=NtQueryObject(FileHandle,1,NULL,NULL,&lenth);
isok=NtQueryObject(FileHandle,1,objectname,lenth,NULL);
char printfbuf[0x4000];
DWORD tmp2=*((WORD*)((DWORD)objectname));//namelength
DWORD tmp3=*(DWORD*)((DWORD)objectname+4);        
                    //这里就是对象类型的UNICODE名字
int js;
for(js=1;js<((tmp2>>1)+1);js++)            
    printfbuf[js-1]=*(char *)(tmp3+2*js-2);
printfbuf[js-1]=0;  

这里两次调用ntqueryobject都是返回值为c0000004
tmp2应为objectname中buffer的长度,但是返回的是0xcccc,
输出printfbuf时程序就异常退出了
请帮我分析一下原因?
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-03-10 09:11
c0000004说明buffer的长度不匹配:
isok=NtQueryObject(FileHandle,1,NULL,NULL,&lenth);
lpBuffer = new UCHAR[lenth];
isok=NtQueryObject(FileHandle,1,lpBuffer,lenth,NULL);

应该没有什么问题,lpBuffer的输出是Unicode的。
在交流中学习。。。
milkway
驱动牛犊
驱动牛犊
  • 注册日期2005-03-08
  • 最后登录2009-03-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-03-10 10:26
我参照楼上改了一下程序,看了一下变量值,第一次调用NtQueryObject时,isok返回为C0000004,lenth返回为0,这两个返回值都不应该吧,我看了FileHandle的值应该是对的;第二次调用NtQueryObject时,返回为C0000005;
如果把调用方式改为2,则第一次调用lenth返回为108,其他返回值都一样,第二次调用也是返回C0000005,lpBuffer的内容还是不能操作,一操作就退出整个程序
milkway
驱动牛犊
驱动牛犊
  • 注册日期2005-03-08
  • 最后登录2009-03-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-03-10 10:57
我查了一下,是我调试时用的一个数组给小了,
造成了越界,所以第二次调用返回为c0000005;
现在我在方式2下调试通了,lpBuffer里读出内容
为“File”,(因为我打开的是目录句柄),但是
在方式1下还是没有调通,lenth总是返回0,怎么
回事呢?
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-03-10 13:55
我查了一下,是我调试时用的一个数组给小了,
造成了越界,所以第二次调用返回为c0000005;
现在我在方式2下调试通了,lpBuffer里读出内容
为“File”,(因为我打开的是目录句柄),但是
在方式1下还是没有调通,lenth总是返回0,怎么
回事呢?

这个也不清楚,有时候是这样的了,如果等于0,你就给他赋一个值,也就是缓冲区的大小,够用就行了,千万不要太大了。
在交流中学习。。。
milkway
驱动牛犊
驱动牛犊
  • 注册日期2005-03-08
  • 最后登录2009-03-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-03-11 12:38
总算进入自己的帖子了,有将近一天的时间不能打开我得帖子,真是奇怪!
我按照楼上的建议,在lenth返回为0的时候也给它赋了值,果然成功了。
非常感谢楼上的耐心帮助!同时也感谢bmyyyud的帮助!都给分了,呵呵。
goyejin
驱动牛犊
驱动牛犊
  • 注册日期2007-03-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望100点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-10-17 14:29
0xC0000005  表示长度错误,调用NtQueryObject要确保存缓存最小不能小于你想要申请的信息的结构体大小,你这里要申请的信息是OBJECT_NAME_INFORMATION,那么传进去的长度就必须要大于等于sizeof(OBJECT_NAME_INFORMATION)。否则结果不正确。
游客

返回顶部