驱动老牛
![]() |
阅读:1231回复:5
如何根据HANDLE获得一个对象
根据一个文件(注册表键)HANDLE的值,我怎么获得它所对应的文件(注册表键)
|
|
沙发#
发布于:2004-12-06 16:33
用ObReferenceObjectByHandle获得相对应的对象指针,然后...
|
|
|
驱动老牛
![]() |
板凳#
发布于:2004-12-06 17:28
那注册表键怎么获得?
ObjectType 只有两种类型 IoFileObjectType or ExEventObjectType |
|
驱动老牛
![]() |
地板#
发布于:2004-12-08 15:16
还是不行,如果HANDLE是一个文件的句柄我具体该怎么操作??
|
|
地下室#
发布于:2007-04-27 00:22
文件不还是用这个函数么?ObReferenceObjectByHandle
可以获得文件对象 |
|
5楼#
发布于:2007-04-27 08:17
问题一:
方法1. ZwQueryInformationFile - FileNameInformation A FILE_NAME_INFORMATION structure. The structure can contain the file's full path or only a portion of it. 这种方法获取到的路径中可能会没有盘符信息,不过你可以再通过发送 IOCTL_MOUNTMGR_QUERY_POINTS控制码来获取其文件对应的设备的符号连接名, 然后再和盘符对应起来。(希望没绕晕,^_^) 方法2. FileMon的方法,请参阅FileMon的FilemonGetFullPath函数; 问题二: 要获取注册表键的全路径可以通过ObQueryNameString来获取,方法如下; GetPointer( HANDLE KeyOrHandle ) { POBJECT pKey = NULL; // // Ignore null handles. // if( !KeyOrHandle ) return NULL; // // Get the pointer the handle refers to. // #ifdef WNET pKey = KeyOrHandle; #else // // Make sure that we're not going to access // the kernel handle table from a non-system process // if( (LONG)(ULONG_PTR) KeyOrHandle < 0 && ExGetPreviousMode() != KernelMode ) { return NULL; } if( !NT_SUCCESS( ObReferenceObjectByHandle( KeyOrHandle, 0, NULL, KernelMode, &pKey, NULL ))) { KdPrint(("Error %x getting key pointer\n")); pKey = NULL; } #endif return pKey; } //////////////////////////////////////////////////////////////////////////////////////////// VOID Test() { POBJECT pKey = NULL; PUNICODE_STRING fullUniName; if( pKey = GetPointer( hKey )) { ReleasePointer( pKey ); fullUniName = ExAllocatePool( PagedPool, MAXPATHLEN*sizeof(WCHAR)+2*sizeof(ULONG) ); } if( NT_SUCCESS( ObQueryNameString( pKey, fullUniName, MAXPATHLEN, &actualLen ) )) { // 成功获取。。。 } ExFreePool(fullUniName ); |
|
|