3609|4

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ZwQueryInformationFile取全路径的问题 [复制链接]

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

最新回复

我有个例子发你看一下,或许有帮助  详情 回复 发表于 2009-4-8 15:41
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

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

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;
}
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
盘符要单独处理。
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(初级)

4
 
我看到网上有一些说要单独处理的
好像有三种情况
因为刚开始接触这方面的知识
所以很笨的想麻烦能给贴段代码看一下
这样更容易理解一些
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
我有个例子发你看一下,或许有帮助
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午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
快速回复 返回顶部 返回列表