每个应用程序的长路径行为是否可以通过清单启用?

2024-01-03

尽管 MSDN 文档是什么say https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx#maxpath :

您还可以通过以下方式启用每个应用程序的新长路径行为 显现:

在测试中我发现这不是真的。所有测试均在 win10 1607.14393.447(和 14393.0) x64 上完成

当我测试有或没有清单的exe时,我发现清单对CreateFileW, CreateDirectoryW,(没有意义测试更多功能 - 为什么我稍后解释) 真的当LongPathsEnabled在注册表中为 1 - 长路径有效(without \\?\ prefix)。当它为 0 时 - 不起作用,即使longPathAware true在清单中。 (代码如下)

接下来需要了解:

  • 内核中的所有文件函数只能与NT-paths

  • 所以在调用内核之前我们需要转换Win32-path no NT-path

  • 对于路径变换存在一些封闭函数RtlDosPathNameTo*NtPathName* in ntdll

  • 所有的转变Win32->NT在此功能中集中完成的路径, 但不直接进入CreateFileW, FindFirstFileW, GetCompressedFileSizeW...(其他行为将是极其 不合逻辑)

  • 所以确实足够测试 1,2 函数,但不是文章中的全部(但如果 有人不相信并且想要 - 让我们测试一下:))

  • 所有这些kernel32 (and kernelbase) api 采取Win32-path和 将其转换为NT在这里 - 所以没有任何不同 - 是说GetFileAttributesW直接从本机 c/c++ 代码或从 托管运行时或应用程序容器 - 结果将是相同的
  • 全部依赖仅来自RtlDosPathNameTo*NtPathName*内部的 执行

ntdll现在实施并导出 2 个新 API

BOOLEAN NTAPI RtlIsLongPathAwareProcessByManifest();
BOOLEAN NTAPI RtlAreLongPathsEnabled();

RtlAreLongPathsEnabled- 仅在注册表中查找(第一次调用时)HKLM\SYSTEM\CurrentControlSet\Control\FileSystem @ LongPathsEnabled将结果缓存在 static var 中并在以下情况下返回 trueLongPathsEnabled != 0。这个函数调用自RtlDosPathNameTo*NtPathName*当Win32路径超过MAX_PATH并且仅当启用长路径时 - 路径才会被转换,否则STATUS_NAME_TOO_LONG

RtlIsLongPathAwareProcessByManifest- 仅在应用程序清单中查找(通过调用RtlQueryActivationContextApplicationSettings(0, 0, L"http://schemas.microsoft.com/SMI/2016/WindowsSettings", L"longPathAware");)当第一次调用时,再次缓存结果为本地静态 BOOLEAN。 如果我不跳过某些东西 - 这个函数从未被调用过ntdll并从kernebase.dll只从一个地方——GetTempPathW。所以真的结果RtlIsLongPathAwareProcessByManifest只能对GetTempPathW结果。

但当测试这个时 - 我完全认为当前 Windows 版本中的错误这里 - 如果长度为TMP环境变量(或TEMP等..但是TMP先查询)超出MAX_PATH询问RtlAreLongPathsEnabled and RtlIsLongPathAwareProcessByManifest如果两者都返回 true (所以这里AND逻辑) - 系统尝试了这么长TMP路径,但其中一个缓冲区大小错误WCHAR- 结果我们陷入无限循环 - [ *- >RtlAllocateHeap -> STATUS_BUFFER_TOO_SMALL -> RtlFreeHeap -> RtlAllocateHeap-> *]

有人可以测试并确认或反驳这一点吗?不传递文档链接,而是真正测试.

我用于测试的代码(有或没有正确的清单 - 由RtlIsLongPathAwareProcessByManifest result)

BOOL CreateFolder(LPCWSTR lpPathName)
{
    return CreateDirectoryW(lpPathName, 0) || GetLastError() == ERROR_ALREADY_EXISTS;
}

void LPT()
{
    // check manifest and registry

    BOOLEAN bByManifest = 0, bLongPathsEnabled = 0;

    if (HMODULE hmod = GetModuleHandle(L"ntdll"))
    {
        BOOLEAN (NTAPI * RtlIsLongPathAwareProcessByManifest)();
        BOOLEAN (NTAPI * RtlAreLongPathsEnabled)();

        if (*(FARPROC*)&RtlIsLongPathAwareProcessByManifest = GetProcAddress(hmod, "RtlIsLongPathAwareProcessByManifest"))
        {
            bByManifest = RtlIsLongPathAwareProcessByManifest();
        }

        if (*(FARPROC*)&RtlAreLongPathsEnabled = GetProcAddress(hmod, "RtlAreLongPathsEnabled"))
        {
            bLongPathsEnabled = RtlAreLongPathsEnabled();
        }
    }

    WCHAR name[128], path[0x8000], *c;

    if (bLongPathsEnabled && bByManifest)
    {
        // hung test in GetTempPathW

        __stosw((PUSHORT)path, 'x', MAX_PATH + 1);
        path[MAX_PATH + 1] = 0;

        if (SetEnvironmentVariable(L"TMP", path))
        {
            // hung here in infinite loop by windows error

            // ---> buffer allocated on sizeof(WCHAR) less than required, 
            // |    got STATUS_BUFFER_TOO_SMALL
            // | -< free buffer
            GetTempPathW(RTL_NUMBER_OF(path), path);// never return :)
        }
    }

    if (!SHGetFolderPath(0, CSIDL_PROFILE , 0, 0, path))
    {
        *name = '\\';
        __stosw((PUSHORT)name + 1, '3', RTL_NUMBER_OF(name) - 2);
        name[RTL_NUMBER_OF(name) - 1] = 0;

        c = path + wcslen(path);

        int n = 4;
        do 
        {
            memcpy(c, name, sizeof(name));
            c += RTL_NUMBER_OF(name) - 1;

            if (!CreateFolder(path))
            {
                break;
            }

        } while (--n);

        if (!n)
        {

            wcscpy(c, L"\\1.txt");

            HANDLE hFile = CreateFileW(path, FILE_GENERIC_WRITE, FILE_SHARE_VALID_FLAGS, 0, OPEN_ALWAYS, 0, 0);

            if (hFile != INVALID_HANDLE_VALUE)
            {
                CloseHandle(hFile);
                return ;
            }
        }
    }

    GetLastError();
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每个应用程序的长路径行为是否可以通过清单启用? 的相关文章

  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR
  • 尝试使用 C++ 创建一个计划任务运行一次,win7 上的任务计划程序 1.0

    我正在尝试创建一个非常简单的程序 它将在两分钟后运行记事本 这些都经过简化以提出更清晰的问题 我尝试合并一些MSDN 的例子 http msdn microsoft com en us library windows desktop aa3
  • 在结构内创建结构

    我正在努力将在 Visual c 6 0 中创建的旧 C windows 驱动程序项目导入到 Visual Studio 2012 中 定义结构的方式导致 vs2012 中出现错误 typedef struct LINK Link HAND
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • win32 Python - pythoncom 错误 - ImportError: 没有名为 pywintypes 的模块

    我正在尝试导入 pythoncom 但它给了我这个错误 Traceback 最近一次调用最后 文件 F Documents and Settings Emery Desktop Python 27 Try 第 2 行 位于 导入python
  • 读取 .ini 文件 vb.net?

    我有一个具有读取 ini 文件功能的项目 我无法显示我想要的 ini 文件的内容 我的代码读取 ini 文件 Public Function GetSettingItem ByVal File As String ByVal Identif
  • 使用 FILE_FLAG_NO_BUFFERING 会带来明显的速度增益吗?

    最近在MSDN中注意到FILE FLAG NO BUFFERING标志的详细描述 并阅读了几条关于Windows中无缓冲I O的Google搜索结果 http msdn microsoft com en us library aa36385
  • 如何获取在记事本中打开的文件的文件名和路径?

    是否可以获取在记事本中打开的文件的名称和路径 我已经有了 Notepad exe 的 ProcessId 谢谢 纳夫尼特 它是标题栏的一部分 所以需要获取窗口句柄 然后调用Win API函数GetWindowText 这可能就是您想要的 使
  • 设置透明背景Win32

    我想做的事情非常简单 但似乎没有太多信息 基本上我有一个普通的不透明父窗口 我想在该父窗口内放置一个子窗口 有自己的不透明控件 所以我唯一要做的就是将子窗口的背景画笔设置为透明 但它仍然绘制白色背景 尝试使用 WS EX LAYERED 样
  • 将第二个显示器显示设置更改为复制

    我正在尝试以编程方式使第二个监视器具有重复的显示 我的下面的功能应该将第二个显示器的显示更改为 重复显示 即使第二个显示器显示第一个 主显示器上的所有内容 我的问题 当我运行我的函数时 它成功找到第二个监视器 并通过更改 DEVMODE d
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • 如何获取重定向路径的实际路径?

    在 64 位上运行的 32 位进程会得到广义的由于文件重定向 指向重定向路径的路径 致电GetCurrentDirectory 例如 如果进程正在运行 Windows SysWOW64会得到结果 Windows System32 不过 很有
  • 如何使用 COMMTIMEOUTS 等待字节可用但读取多个字节?

    我有一个 C 串行端口类 它具有用于读取操作的非阻塞和阻塞模式 对于阻塞模式 COMMTIMEOUTS cto GetCommTimeouts m hFile cto Set the new timeouts cto ReadInterva
  • 在 win32 API 应用程序中实现全球化/多语言功能

    我用 Visual C 开发了一个窗口应用程序 Win32 API 我必须在此应用程序中添加多语言功能 任何人都可以指导我如何完成这项任务 Windows 上多语言应用程序的基础是 资源 的使用 资源是附加在可执行文件末尾的块 它仅包含数据
  • 如何在 Win32 中获取特定的 TIME_ZONE_INFORMATION 结构?

    Win32 GetTimeZoneInformation 函数返回控制面板中设置的系统本地时区 如何获取另一个特定时区 有没有一个电话可以做到这一点 Tony 根据this http msdn microsoft com en us lib
  • 如何将CString转换为整数和浮点数? [复制]

    这个问题在这里已经有答案了 我正在尝试转换CStringint 和 float 但无法找到任何 C 库函数来完成此操作 请帮忙 正确的UNICODE 符合规定的方式MFC如下 CString sInt T 10 int n ttoi sIn
  • 32 位 OpenFileDialog --> 64 位 System32?

    在 32 位程序中 如何让打开 保存文件对话框显示 64 位系统的 System32 文件夹中的文件 Wow64DisableWow64FsRedirection不起作用 因为由于某种原因它不适用于对话框 我猜是因为它位于不同的线程上 当然
  • NtDll 真的导出 C 运行时函数吗?我可以在我的应用程序中使用这些函数吗?

    我在查看 Windows 10 计算机上的 NtDll 导出表 发现它导出标准 C 运行时函数 例如memcpy sprintf strlen etc 这是否意味着我可以在运行时动态调用它们LoadLibrary and GetProcAd
  • WinApi:获取 COM 表单的控件名称

    我想用 Net 框架替换我当前的 UI 自动化工具 QTP 我需要测试 VB6 COM 应用程序 框架的基础之一是使用表单名称 到目前为止 我未能找到使用 Win API 获取这些数据的方法 该解决方案只有一个约束 即该解决方案必须依赖 N

随机推荐

  • Web服务拒绝接收参数并以JSON格式回复

    我正在尝试从 C 应用程序以 json 格式调用 Web 服务 asmx 当我将请求方法指定为 GET 并且不指定 contentType 时 req 是 HttpWebRequest req Method GET 一切正常 但我收到 XM
  • 如何从系统日期中减去年份

    在不硬编码日期的情况下检查某人是否已满 20 岁的表达式是什么 在 SQL 中 SELECT student fname FROM students WHERE dob lt 05 MAR 1995 我正在考虑使用SYSDATE但我不知道减
  • 用于获取某个位置的营业时间的 API?

    是否有任何 API 可以提供特定地点的企业营业时间 Google Places SimpleGeo 和 Yelp 似乎没有公开它 如果没有 是否存在一些可以用来创建这样一个 API 的数据集 同样 我在 data gov 或其他任何地方都找
  • read.table 函数和 stdin

    我有一个制表符分隔的文本文件 我正在尝试使用以下命令将其加载到 R 中 read table功能 脚本的前几行看起来像这样 usr bin env Rscript args lt commandArgs trailingOnly TRUE
  • 在同一域下混合 PHP 和 ASP.NET

    PHP 如何与 ASP NET 混合 假设我在根域下有一个 asp net 应用程序 然后我创建一个文件夹来放置 PHP PHP 可以在 ASP NET 下正常运行吗 我是否有必要将PHP目录转换为IIS7下的应用程序 PHP 已安装 我的
  • 如果 Swing 模型的 getter 不是线程安全的,您如何处理它们?

    众所周知 更新 Swing GUI 必须专门在 EDT 中完成 广告上说的比较少readingGUI 中的操作也必须 应该在 EDT 中完成 例如 我们以ButtonModel 的 isSelected http java sun com
  • 如何为 VR 准备我的游戏? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设我们有一些 C OpenGL 游戏 它使用我们自己的渲染引擎 也不是 Unity UE 等 让我们简化我们的问题 例如 我们需要在
  • ASP.NET 页面上的倒计时器

    您能给我推荐一种在 ASP NET 页面上放置倒计时器的方法吗 现在我使用这段代码 默认 aspx
  • URL转义MFC字符串

    如何对 MFC CString 进行 URL 转义 InternetCanonicalizeUrl http msdn microsoft com en us library aa384342 28VS 85 29 aspx
  • 即时 (JIT) 编译器有什么作用?

    与非 JIT 编译器相比 JIT 编译器具体做了什么 有人可以给出一个简洁易懂的描述吗 JIT 编译器运行after程序已启动 并将代码 通常是字节码或某种 VM 指令 即时 或称为即时 编译为通常更快的形式 通常是主机 CPU 的本机指令
  • 从 Cocoa 中的文件中仅读取“N”个字节

    如何从指定文件中只读取 N 个字节 如果您希望以类似于通过 NSData 加载文件的方式随机访问文件内容 但不实际将所有内容读取到内存中 则可以使用内存映射 这样做意味着磁盘上的文件被视为虚拟内存的一部分 并且将像常规虚拟内存一样进行页面调
  • C# 获取嵌入资源的完整路径? [复制]

    这个问题在这里已经有答案了 我正在使用一个 NET 组件 该组件使用一种需要具有完整路径名的字符串的方法来读取特定的二进制文件 如下所示 Read c somefile ext 我已将 somefile ext 作为嵌入式资源放入我的项目中
  • 动态应用内设置

    我有一个应用程序 位置很重要 目前 我在设置包中有一个多值设置 其中定义了 5 个位置 这种方法的问题在于设置包是静态的 也就是说 据我所知 我无法从服务器上的 JSON 列表更新它 我想从服务器上的动态列表更新位置列表 我看过 InApp
  • 共享 SwiftUI 视图的屏幕截图导致崩溃

    我正在抓取 SwiftUI 视图中子视图的屏幕截图 立即传递到共享表以共享图像 该视图是来自呈现为一堆卡片的文本数组的一组问题 我正在尝试获取问题的屏幕截图 并将其与应用程序的链接一起共享 使用愤怒的小鸟的链接进行测试 我基本上可以使用 A
  • 读取实例导致解析错误

    我想实现一个 read 实例 使我能够读取字符串 例如 8 3 并构造一个包含这些值的列表 data Value a Nul Val a showsValue Show a gt Value a gt ShowS showsValue Va
  • 在 Azure 数据工厂中引用 JSON 有效负载值作为 If 条件

    我有一个像这样的 Json 文件作为从 API 调用返回的有效负载 这是数据工厂中的 http 数据集类型 count 2 name DatasetABC columnNames Column 1 Column 2 rows 1234 56
  • AWS CLI 上传失败:未知编码:idna

    我尝试使用 AWS CLI 将一些文件推送到 s3 但遇到错误 upload failed An HTTP Client raised and unhandled exception unknown encoding idna 我相信这是一
  • Python 包及其对应的 PyPi 项目可以有不同的名称吗?

    例如 我想知道怎么可能scikit learn是 PyPi 包的名称 而实际的 Python 模块的名称是sklearn 我问的原因是我有一个本地Python包packageA我无法上传到 PyPi 因为该名称恰好已被占用 因此我想知道我是
  • 如何在Delphi中实现一套标准的超链接检测规则

    我目前在程序中自动检测文本内的超链接 我把它做得非常简单 只需要寻找http or www 然而 一位用户建议我将其扩展到其他形式 例如 https or com 然后我意识到它可能不止于此 因为还有 ftp mailto 和 file 所
  • 每个应用程序的长路径行为是否可以通过清单启用?

    尽管 MSDN 文档是什么say https msdn microsoft com en us library windows desktop aa365247 aspx maxpath 您还可以通过以下方式启用每个应用程序的新长路径行为