创建文件和长设备名称

CreateFile and long device name

本文关键字:设备名 文件 创建      更新时间:2023-10-16

我使用CreateFile打开设备。一切正常,直到设备名称太长。

在文档中说:

在该函数的ANSI版本中,名称被限制为MAX_PATH字符。要将此限制扩展到32,767个宽字符,请调用该函数的Unicode版本并在前面加上"\? "到小路上。有关详细信息,请参见命名文件、路径和命名空间。

我试图使用CreateFileW和前置"\?"到路径,但得到无效句柄和

系统找不到指定的路径。

在每个盘().

那么,这个技巧只对文件名有效,对设备名无效吗?还有其他方法可以避免这个问题吗?

UPD1: 不带前缀的设备名看起来像:

设备名称 EndsBy: name1.exe | EndsBy: name2.exe。

代码:

CreateFileW(path.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0),

\?前缀直接将路径发送到文件系统,不进行任何预处理。

\.前缀绕过文件命名空间,使用Win32设备命名空间。

它们有各自的用途,不能混合在一起。

你可以自己试试。例如,这将打开null设备:

HANDLE hDevice = ::CreateFileW(L"\\.\NUL", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);

但是如果您将路径更改为L"\\?\\.\NUL",则会失败。

回答你的问题,是的,用\?前缀路径只对文件系统路径有效。

尝试一下:

  • 通常可以 \.替换为\?;这是我的理解,这并不总是有效的,但我不知道规则是什么。

  • 如果你在Windows 8上尝试使用CreateFile2\.格式;文档中没有提到路径长度限制。

  • 尝试联系设备驱动程序的供应商,他们应该已经意识到这将是一个问题,并希望有一个解决方案。

  • 尝试使用DefineDosDevice为您的长路径创建别名,并使用CreateFile打开\.myalias。我不确定您要混叠的路径的正确语法,但您可以使用QueryDosDevice查看现有的别名以获得指导。我相信你会想使用DDD_RAW_TARGET_PATH标志。

  • 如果这些都失败了,你可能需要求助于NtCreateFile。您应该能够使用CreateFile打开\.devicename,然后使用该句柄作为对NtCreateFile调用的根目录。这里的缺点是API不能保证在未来版本的Windows中保持兼容。