ZwQueryInformationFile取全路径的问题

fayshaw   2009-4-3 11:41 楼主
我想获取一个文件的全路径,比如:
C:\123\abc.txt,
但是使用ZwQueryInformationFile得到的是\123\abc.txt,
网上查了一些资料都没实现,
可能自己功力不够,
不知谁有这方面的代码,
我想学习一下,非常感谢。

回复评论 (4)

在本论坛搜到一个帖子,有如下的回答,但是我这里没试验成功,也请指点:

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;
}
点赞  2009-4-3 11:42
盘符要单独处理。
点赞  2009-4-3 12:34
我看到网上有一些说要单独处理的
好像有三种情况
因为刚开始接触这方面的知识
所以很笨的想麻烦能给贴段代码看一下
这样更容易理解一些
点赞  2009-4-3 13:45
我有个例子发你看一下,或许有帮助
点赞  2009-4-8 15:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复