我想获取一个文件的全路径,比如:
C:\123\abc.txt,
但是使用ZwQueryInformationFile得到的是\123\abc.txt,
网上查了一些资料都没实现,
可能自己功力不够,
不知谁有这方面的代码,
我想学习一下,非常感谢。
在本论坛搜到一个帖子,有如下的回答,但是我这里没试验成功,也请指点:
ZwQueryInformationFile得到的是文件设备名称,转换一下前面的部分就可以了。
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;
}
我看到网上有一些说要单独处理的
好像有三种情况
因为刚开始接触这方面的知识
所以很笨的想麻烦能给贴段代码看一下
这样更容易理解一些