于从文件句柄获得全路径

从文件句柄获得全路径这个问题,似乎是个“老大难”问题。
很久以前我就在水木清华见到过。最近又不断有人提到。
其实问题并不难,只是解决办法有点绕,不是调用一个API就能解决的。

问题的关键在于,形如”X:”的Dos设备名都是符号链接(SymblicLink),而文件打开后文件对象中保存的是逻辑卷设备名(如”\Device\HarddiskVolumeX”)。前者可以转换成后者,而后者却不能简单地转换成前者。以至于从句柄得到的路径总是“缺少”盘符这一部分。实际上,把所有的”X:”都变成设备名去匹配路径就可以了。

下面是演示代码,很简单,所以就不加注释啦 ^_^

#include <windows.h>
#include <ntsecapi.h>

#pragma comment (lib,"ntdll.lib")       // Copy From DDK

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryObject(
    IN HANDLE ObjectHandle,
    IN ULONG ObjectInformationClass,
    OUT PVOID ObjectInformation,
    IN ULONG ObjectInformationLength,
    OUT PULONG ReturnLength OPTIONAL
    );

BOOL GetPathByHandle(HANDLE hFile, LPWSTR lpBuf, DWORD nBuf)
{
    ULONG m, n;
    WCHAR lpPath[MAX_PATH+4];
    WCHAR lpDrive[MAX_PATH];
    WCHAR lpDevName[MAX_PATH];
    if (ZwQueryObject(hFile, 1, lpPath, MAX_PATH+4, &m) >= 0 &&
        (m = GetLogicalDriveStringsW(MAX_PATH, lpDrive)) && m < MAX_PATH)
    {
        WCHAR *p = lpDrive;
        while (m = wcslen(p))
        {
            p&#91;m-1&#93; = L'\0';
            n = QueryDosDeviceW(p, lpDevName, MAX_PATH);
            if (n && n < MAX_PATH)
            {
                n = wcslen(lpDevName);
                if (!wcsnicmp(lpPath+4, lpDevName, n))
                {
                    wcsncpy(lpBuf, p, nBuf);
                    if (nBuf > 2) wcsncpy(lpBuf+2, lpPath+4+n, nBuf-2);
                    return TRUE;
                }
            }
            p += m + 1;
        }
    }
    return FALSE;
}

void main()
{
    WCHAR buf[MAX_PATH];
    HANDLE hFile = cr&#101;ateFile("C:\\boot.ini", 0, 0, 0, OPEN_EXISTING, 0, 0);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        GetPathByHandle(hFile, buf, MAX_PATH);
        printf("%ws\n", buf);
        CloseHandle(hFile);
    }
    else
    {
        printf("cr&#101;ateFile Failed: %d\n", GetLastError());
    }
}

关注微信公众号,手机阅读更方便: 程序员的阅微草堂

知识共享许可协议莿鸟栖草堂CFC4N 创作,采用 知识共享 署名-非商业性使用-相同方式共享(3.0未本地化版本)许可协议进行许可。基于http://www.cnxct.com上的作品创作。转载请注明转自:于从文件句柄获得全路径

One thought on “于从文件句柄获得全路径

  1. <strong>[转载] 从文件句柄获得全路径…</strong>

    今天搞某File Protecter, 遇到两个麻烦的问题, 其中一个就是这个, 居然Search了我15分钟才找到比较好的方案。。。转来以供参考和以后用。
    ————————————————————————….

  2. &lt;strong&gt;[转载] 从文件句柄获得全路径…&lt;/strong&gt;

    今天搞某File Protecter, 遇到两个麻烦的问题, 其中一个就是这个, 居然Search了我15分钟才找到比较好的方案。。。转来以供参考和以后用。
    ————————————————————————….

发表评论

电子邮件地址不会被公开。 必填项已用*标注