4639|3

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

SYS驱动程序 ZwQueryInformationFile 如何得到文件盘符? [复制链接]

在 SYS 驱动程序中,我用 ZwQueryInformationFile 能得到文件的路径部分,但是无法得到盘符。请问该如何获取盘符?
谢谢!

最新回复

把你用ZwQueryInformationFile得到的文件名传入我给你写好的这个函数,就能得到你想要的东西。  详情 回复 发表于 2008-4-9 17:50
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
ZwQueryInformationFile得到的是文件设备名称,转换一下前面的部分就可以了。
  1. NTSTATUS FileDeviceNameToDosName(
  2.     IN  PUNICODE_STRING pusDeviceFileName,
  3.     OUT PWSTR           buf OPTIONAL,
  4.     IN  ULONG           ulBufSize OPTIONAL,
  5.     OUT PULONG          pulSize OPTIONAL)
  6. {
  7.     NTSTATUS            s          = STATUS_SUCCESS;

  8.     UNICODE_STRING      usDrive;
  9.     WCHAR               szDrive[] = L"\\DosDevices\\A:";

  10.     OBJECT_ATTRIBUTES   oa;
  11.     HANDLE              hLink      = NULL;
  12.     BOOLEAN             bSucceeded = FALSE;

  13.     RtlInitUnicodeString(&usDrive, szDrive);

  14.     for (szDrive[12] = L'A'; szDrive[12] <= L'Z'; ++szDrive[12])
  15.     {
  16.         WCHAR           szName[MAX_PATH];
  17.         UNICODE_STRING  usName;
  18.         ULONG           cbSize;

  19.         // 获取DOS盘符的符号链接对象
  20.         InitializeObjectAttributes(&oa, &usDrive, OBJ_CASE_INSENSITIVE, NULL, NULL);
  21.         s = ZwOpenSymbolicLinkObject(&hLink, SYMBOLIC_LINK_QUERY, &oa);
  22.         if (!NT_SUCCESS(s))
  23.             continue;

  24.         // 查询符号链接对象对应的名称
  25.         usName.Buffer        = szName;
  26.         usName.Length        = 0;
  27.         usName.MaximumLength = sizeof(szName);
  28.         s = ZwQuerySymbolicLinkObject(hLink, &usName, &cbSize);
  29.         if (NT_SUCCESS(s))
  30.         {
  31.             ULONG ulCnt = usName.Length / sizeof (WCHAR);
  32.             if (0 == _wcsnicmp(pusDeviceFileName->Buffer, usName.Buffer, ulCnt)
  33.                 && L'\\' == pusDeviceFileName->Buffer[ulCnt])
  34.             {
  35.                 // 找到!
  36.                 ULONG ulSizeNeeded = 2 + pusDeviceFileName->Length / sizeof(WCHAR) - ulCnt;
  37.                 if (ARGUMENT_PRESENT(pulSize))
  38.                     *pulSize = ulSizeNeeded;

  39.                 bSucceeded = TRUE;
  40.                 if (NULL == buf || 0 == ulBufSize)
  41.                 {
  42.                     s = STATUS_BUFFER_TOO_SMALL;
  43.                 }
  44.                 else
  45.                 {
  46.                     wcscpy(buf, &usDrive.Buffer[12]);
  47.                     wcsncat(buf, pusDeviceFileName->Buffer + ulCnt,
  48.                         ulBufSize / sizeof(WCHAR) - 2);
  49.                 }
  50.             }
  51.         }

  52.         NtClose(hLink);
  53.         hLink = NULL;
  54.         if (bSucceeded)
  55.             break;
  56.     }

  57.     if (!bSucceeded)
  58.         s = STATUS_UNSUCCESSFUL;
  59.     return s;
  60. }
复制代码
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
啊,要这么麻烦吗?有简单的办法吗?
我的代码如下,我就想获取完整的路径。
谢谢各位。


  1. /**
  2. *        New process function
  3. *        Hook API NewZwSetInformationFile
  4. */
  5. NTSTATUS NewZwSetInformationFile
  6. (
  7.         IN HANDLE FileHandle,
  8.         OUT PIO_STATUS_BLOCK IoStatusBlock,
  9.         IN PVOID FileInformation,
  10.         IN ULONG Length,
  11.         IN FILE_INFORMATION_CLASS FileInformationClass
  12. )
  13. {
  14.         KdPrint(("NewZwSetInformationFile:: start\n"));
  15.        
  16.         if ( ExGetPreviousMode() != KernelMode )
  17.         {
  18.                 //        ..
  19.                 KdPrint(("NewZwSetInformationFile:: not Kernel mode.\n"));
  20.         }

  21.         NTSTATUS Status;
  22.         PWCHAR pBuffer;
  23.         IO_STATUS_BLOCK IoStatus;
  24.         PFILE_NAME_INFORMATION pstNameInfo;
  25.         PCHAR pFileName;

  26.         if ( FileRenameInformation == FileInformationClass )
  27.         {
  28.                 //        ???????ü??
  29.                 pBuffer = (PWCHAR)ExAllocatePool( NonPagedPool, 1024 );
  30.                 if( pBuffer )
  31.                 {
  32.                         RtlZeroMemory( pBuffer, 1024 );
  33.                         pstNameInfo = (PFILE_NAME_INFORMATION)pBuffer;
  34.                        
  35.                         Status = ZwQueryInformationFile( FileHandle, &IoStatus, pstNameInfo, 512, FileNameInformation );
  36.                         if ( NT_SUCCESS(Status) )
  37.                         {
  38.                                 pFileName        = (PCHAR)pstNameInfo->FileName;
  39.                                 Status                = W2A( pstNameInfo->FileName, pFileName, MAX_PATH );
  40.                         }
  41.                 }
  42.         }

  43.         return g_pfnOrgZwSetInformationFile
  44.         (
  45.                 FileHandle,
  46.                 IoStatusBlock,
  47.                 FileInformation,
  48.                 Length,
  49.                 FileInformationClass
  50.         );
  51. }
复制代码
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 xingworld 的回复:
啊,要这么麻烦吗?有简单的办法吗?
我的代码如下,我就想获取完整的路径。
谢谢各位。

把你用ZwQueryInformationFile得到的文件名传入我给你写好的这个函数,就能得到你想要的东西。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 2/10 下一条
有奖直播 | TI 助力机器人电机控制系统设计
直播时间:2月27日(周四)上午10:00
活动奖励:家具壶、保温杯、充电线

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表