unk*_*656 0 windows winapi file short-filenames
我目前正在使用以下P/Invoke签名来获取常规Windows文件的简短文件名:
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetShortPathName([MarshalAs(UnmanagedType.LPTStr)] string path,
[MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath,
int shortPathLength);
Run Code Online (Sandbox Code Playgroud)
目前 - 它没有任何问题,但我注意到一些特别的东西:
我知道Windows使用以下短文件名约定:
将名称剪切为6个字符(不带扩展名)
追加代字号(~)
附加无符号整数,表示匹配索引(从1开始)
附加原始文件扩展名
因此,文件名C:\abcdefghijklmn.txt应该可以在短名称下访问C:\abcdefg~1.txt.(哪个工作得很好.)
现在奇怪的部分:我最近在我的音乐目录中对特定的音频文件进行了一次小搜索.这是结果:
.\Rammstein & Tatu - Moscow.mp3
.\Rammstein - Asche zu Asche.mp3
.\Rammstein - Der Meister.mp3
.\Rammstein - Du Hast.mp3
.\Rammstein - Eifersucht.mp3
.\Rammstein - Feuer Frei.mp3
.\Rammstein - Führe Mich.mp3
.\Rammstein - Haifisch.mp3
...
Run Code Online (Sandbox Code Playgroud)
用简短的表示法进行相同的搜索:
.\RA8E17~1.MP3
.\RA23A6~1.MP3
.\RAMMST~1.MP3
.\RA0CAE~1.MP3
.\RAMMST~2.MP3
.\RAMMST~3.MP3
.\RAMMST~4.MP3
.\RA6BAA~1.MP3
...
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么Windows在波浪号之前生成这样的"随机"前缀(如RA23A6或RA0CAE)?
微软没有记录这个,但维基百科做了:
虽然没有从LFN创建8.3名称的强制算法,但Windows使用以下约定:
1.如果LFN是8.3大写,则根本不会在磁盘上存储LFN.
- 例:
TEXTFILE.TXT2.如果LFN是8.3混合大小写,则LFN将存储混合大小写的名称,而8.3名称将是大写的版本.
- 示例:
TextFile.Txt变成TEXTFILE.TXT.3.如果文件名包含8.3名称中不允许的字符(包括不按惯例禁止的空间,但不包括API)或者任何一部分太长,则该名称将被删除无效字符,例如空格和额外句点.其他字符如
+更改为下划线_和大写字母.然后将剥离的名称截断为其基本名称的前6个字母,后跟一个代字号,后跟一个数字,后跟一个句点.,后跟该分机的前3个字符.
- 示例:
TextFile1.Mine.txt变为TEXTFI~1.TXT(或者TEXTFI~2.TXT应该TEXTFI~1.TXT已经存在).ver +1.2.text成为VER_12~1.TEX.4. 从Windows 2000开始,如果已经存在至少4个文件或文件夹,其短名称中包含相同的初始6个字符,则剥离的LFN将被截断为基本名称的前2个字母(如果基本名称只有1,则为1)字母),后跟4个十六进制数字,从文件名的未记录的散列派生,后跟一个代字号,后跟一个数字,后跟一个句点
.,后跟扩展名的前3个字符.
- 示例:
TextFile.Mine.txt变成TE021F~1.TXT.
正如Joey所提到的,文件名的无证散列已被逆向工程化.
| 归档时间: |
|
| 查看次数: |
1491 次 |
| 最近记录: |