首页
社区
课程
招聘
[求助]由Handle得到文件完整路径的问题
发表于: 2008-11-24 23:39 6649

[求助]由Handle得到文件完整路径的问题

2008-11-24 23:39
6649
我的做法是:
先由ObReferenceObjectByHandle得到FileObject
然后:
文件名(不带盘符):FileObject->FileName
盘符:RtlVolumeDeviceToDosName(FileObject->DeviceObject, ...)

这个方法我发现,
RtlVolumeDeviceToDosName的使用有两个问题:
1。 有时静态加载驱动时在Windows登陆前系统卡死
2。 有时运行在别的驱动中bsod,具体如下

KERNEL_MODE_EXCEPTION_NOT_HANDLED_M

TRAP_FRAME:  ba593778 -- (.trap 0xffffffffba593778)
ErrCode = 00000000
eax=8a395898 ebx=00000000 ecx=00000000 edx=8a395828 esi=89c4f2b8 edi=8a395828
eip=a6a2c93a esp=ba5937ec ebp=ba593860 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010246
vmnetuserif+0x93a:
a6a2c93a 8b510c          mov     edx,dword ptr [ecx+0Ch] ds:0023:0000000c=????????

TACK_TEXT:  
WARNING: Stack unwind information not available. Following frames may be wrong.
ba593860 804f018f 89d92ed8 8a395828 00000200 vmnetuserif+0x93a
ba593ac0 b84bdcb0 89d92ed8 ba593af0 ba593d30 nt!IoBuildPartialMdl+0xed
ba593b18 b84be4f0 0000006c ba593b30 00000000 flprtct+0xcb0
ba593d38 8054261c 0000006c 00000000 00000000 flprtct+0x14f0
ba593ddc 805470de 80627dc4 00000003 00000000 nt!KeReleaseInStackQueuedSpinLockFromDpcLevel+0xb74
ba593de0 80627dc4 00000003 00000000 0000027f nt!KiDispatchInterrupt+0x72e
ba593de4 00000000 00000000 0000027f 00000000 nt!LsaDeregisterLogonProcess+0xe756

错误在vmnetuserif.sys
flprtct是我的驱动

怎样解决?或是改用其他方法 ?
谨请高手赐教, 不胜感激。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
"Handle得到文件完整路径的问题"
感觉在ring3下也没啥思路……
2008-11-25 10:04
0
雪    币: 395
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
试试 ZwQueryInformationFile API
2008-11-25 16:11
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
4
ZwQueryObject
2008-11-25 20:37
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
在Ring3下 :
   GetWindowThreadProcessID(Handle,@ProcessID);
     通过ProcessID,遍历下进程,很容易就知道文件完整路径了。
2008-11-25 21:11
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
只能得到没有盘符的路径
2008-11-25 21:52
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
Ring3下
MSDN上有个完整的例子,用CreateFileMapping……实现的
2008-11-25 22:25
0
雪    币: 395
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
其实google可以解决很多问题。

NTSTATUS 
FileDeviceNameToDosName( 
                 IN PUNICODE_STRING pusDeviceFileName, 
                 OUT PWSTR buf OPTIONAL, 
                 IN ULONG ulBufSize OPTIONAL, 
                 OUT PULONG pulSize OPTIONAL
                 ) 
{ 
  NTSTATUS s = STATUS_SUCCESS; 
  UNICODE_STRING usDrive; 
  WCHAR szDrive[] = L"\\DosDevices\\A:"; 
  OBJECT_ATTRIBUTES oa; 
  HANDLE hLink = NULL; 
  BOOLEAN bSucceeded = FALSE; 
  
  RtlInitUnicodeString(&usDrive, szDrive); 
  for (szDrive[12] = L'A'; szDrive[12] <= L'Z'; ++szDrive[12]) 
  { 
    WCHAR szName[MAX_PATH]; 
    UNICODE_STRING usName; 
    ULONG cbSize; 
    
    // 获取DOS盘符的符号链接对象  
    InitializeObjectAttributes(&oa, &usDrive, OBJ_CASE_INSENSITIVE, NULL, NULL); 
    s = ZwOpenSymbolicLinkObject(&hLink, SYMBOLIC_LINK_QUERY, &oa); 
    
    if (!NT_SUCCESS(s)) 
      continue; 
    
    // 查询符号链接对象对应的名称  
    usName.Buffer = szName; 
    usName.Length = 0; 
    usName.MaximumLength = sizeof(szName); 
    
    s = ZwQuerySymbolicLinkObject(hLink, &usName, &cbSize); 
    
    if (NT_SUCCESS(s)) 
    { 
      ULONG ulCnt = usName.Length / sizeof (WCHAR); 
      
      if (0 == _wcsnicmp(pusDeviceFileName->Buffer, usName.Buffer, ulCnt)
        && L'\\' == pusDeviceFileName->Buffer[ulCnt]) 
      { 
        
        // 找到!  
        ULONG ulSizeNeeded = 2 + pusDeviceFileName->Length / sizeof(WCHAR) - ulCnt; 
        
        if (ARGUMENT_PRESENT(pulSize)) 
          *pulSize = ulSizeNeeded; bSucceeded = TRUE; 
        
        if (NULL == buf || 0 == ulBufSize) 
        { 
          s = STATUS_BUFFER_TOO_SMALL;

        } else  { 
          wcscpy(buf, &usDrive.Buffer[12]); 
          wcsncat(buf, pusDeviceFileName->Buffer + ulCnt, ulBufSize / sizeof(WCHAR) - 2); 
        } 
      } 
    } 
    
    NtClose(hLink); 
    
    hLink = NULL; 
    
    if (bSucceeded) 
      break; 
  } 
  
  if (!bSucceeded) 
    s = STATUS_UNSUCCESSFUL; 
  return s; 
}
2008-11-26 10:39
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
thanks all,
我最后还是用了楚狂人的办法,基本没问题,不过在我的一个有raid0动态卷的虚拟机上,结果从盘符查到的设备名都与Query的不同
2008-11-29 21:44
0
游客
登录 | 注册 方可回帖
返回
//