阅读:3065回复:11
请教如何通过目录句柄获得目录的路径
我挂钩了函数NtQueryDirectoryFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,FileInformation,Length,FileInformationClass,ReturnSingleEntry,FileMask,RestartScan);想通过参数FileHandle获得这个目录的路径,用什么方法啊?
|
|
沙发#
发布于:2005-03-09 09:12
先用ObReferenceObjectByHandle将句柄转换为对象指针,再在这里四处找找,或者把这里的当作字符串指针再找找
|
|
|
板凳#
发布于:2005-03-09 09:32
先用ObReferenceObjectByHandle将句柄转换为对象指针,再在这里四处找找,或者把这里的当作字符串指针再找找 在这里四处找找--是说让我在论坛里找找吗?把这里的当作字符串指针---这里是什么意思啊? 我是第一次在论坛发帖子提问,不要见笑啊? |
|
地板#
发布于:2005-03-09 10:17
[quote]先用ObReferenceObjectByHandle将句柄转换为对象指针,再在这里四处找找,或者把这里的当作字符串指针再找找 在这里四处找找--是说让我在论坛里找找吗?把这里的当作字符串指针---这里是什么意思啊? 我是第一次在论坛发帖子提问,不要见笑啊? [/quote] ObReferenceObjectByHandle返回的指针指向这个对象的对象体,这个数据结构中有对象的各种属性,在这里找找,其中一些是指针。ObReferenceObjectByHandle返回的指针上面是对象头Header及几个相关可选的Section |
|
|
地下室#
发布于: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 ); |
|
|
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时程序就异常退出了 请帮我分析一下原因? |
|
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的。 |
|
|
7楼#
发布于:2005-03-10 10:26
我参照楼上改了一下程序,看了一下变量值,第一次调用NtQueryObject时,isok返回为C0000004,lenth返回为0,这两个返回值都不应该吧,我看了FileHandle的值应该是对的;第二次调用NtQueryObject时,返回为C0000005;
如果把调用方式改为2,则第一次调用lenth返回为108,其他返回值都一样,第二次调用也是返回C0000005,lpBuffer的内容还是不能操作,一操作就退出整个程序 |
|
8楼#
发布于:2005-03-10 10:57
我查了一下,是我调试时用的一个数组给小了,
造成了越界,所以第二次调用返回为c0000005; 现在我在方式2下调试通了,lpBuffer里读出内容 为“File”,(因为我打开的是目录句柄),但是 在方式1下还是没有调通,lenth总是返回0,怎么 回事呢? |
|
9楼#
发布于:2005-03-10 13:55
我查了一下,是我调试时用的一个数组给小了, 这个也不清楚,有时候是这样的了,如果等于0,你就给他赋一个值,也就是缓冲区的大小,够用就行了,千万不要太大了。 |
|
|
10楼#
发布于:2005-03-11 12:38
总算进入自己的帖子了,有将近一天的时间不能打开我得帖子,真是奇怪!
我按照楼上的建议,在lenth返回为0的时候也给它赋了值,果然成功了。 非常感谢楼上的耐心帮助!同时也感谢bmyyyud的帮助!都给分了,呵呵。 |
|
11楼#
发布于:2008-10-17 14:29
0xC0000005 表示长度错误,调用NtQueryObject要确保存缓存最小不能小于你想要申请的信息的结构体大小,你这里要申请的信息是OBJECT_NAME_INFORMATION,那么传进去的长度就必须要大于等于sizeof(OBJECT_NAME_INFORMATION)。否则结果不正确。
|
|