zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1231回复:5

如何根据HANDLE获得一个对象

楼主#
更多 发布于:2004-12-06 16:05
根据一个文件(注册表键)HANDLE的值,我怎么获得它所对应的文件(注册表键)
---内核开发合作或提供基础技术服务QQ:22863668 ---
liwashington
驱动小牛
驱动小牛
  • 注册日期2004-04-30
  • 最后登录2010-10-21
  • 粉丝0
  • 关注0
  • 积分-11分
  • 威望98点
  • 贡献值1点
  • 好评度12点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-06 16:33
用ObReferenceObjectByHandle获得相对应的对象指针,然后...
我只想有个好老婆,每天有几顿好饭吃……
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-12-06 17:28
那注册表键怎么获得?
 ObjectType 只有两种类型 IoFileObjectType or ExEventObjectType
---内核开发合作或提供基础技术服务QQ:22863668 ---
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2004-12-08 15:16
还是不行,如果HANDLE是一个文件的句柄我具体该怎么操作??
---内核开发合作或提供基础技术服务QQ:22863668 ---
AK-47
驱动牛犊
驱动牛犊
  • 注册日期2007-02-22
  • 最后登录2008-08-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-27 00:22
文件不还是用这个函数么?ObReferenceObjectByHandle
可以获得文件对象
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
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 );
人总在矛盾中徘徊。。。
游客

返回顶部