Sysinternals Handle 打印问号“?”而不是非 ASCII 符号

Sysinternals Handle 打印问号“?”而不是非 ASCII 符号

对于包含非 ASCII 符号的文件,Sysinternals 句柄实用程序用 打印文件名?。以下位置也报告了类似的问题:

再现场景

  • 在 Adob​​e Acrobat Reader 中打开一个文件C:\test\fileфайлファイル文件.pdf即可锁定它。
  • 执行以下命令将cmd.exe导致打印的文件名为C:\test\file??????????.pdf
C:\> handle64 -nobanner C:\test\fileфайлファイル文件.pdf
Acrobat.exe        pid: 10616  type: File           440: C:\test\file??????????.pdf
  • 如果我使用命令将输出重定向到文件,也会发生同样的情况handle64 -nobanner C:\test\fileфайлファイル文件.pdf > 1.txt。文件内容将与控制台中的内容相同。在十六进制编辑器中打开文件会显示?符号实际上是带有代码的问号x3F。因此,我认为这不是我机器上的编码问题。

问题

如何修复或解决这个问题?

目前最好的解决方法。

二进制补丁来自@NewcomerAl 的回答修复了这个问题。修补后的二进制文件可以从具有 Unicode 支持的 Sysinternals 控制台实用程序GitHub 存储库。

答案1

可以通过应用以下二进制补丁来解决此问题HANDLE64.EXE V5.0_setmode(_fileno(stdout), _O_U8TEXT)在函数开头注入main。此函数使 Handle 工具以支持非 ASCII 符号的 UTF8 格式打印其输出。

修补

# Description
# injects `_setmode(_fileno(stdout), _O_U8TEXT)` at the beginning of the `main` function. Only works for "HANDLE64.EXE v5.0"
handle64.exe
00008510: 48 E9
00008511: 33 FF
00008512: C4 DF
00008513: 48 02
00008514: 89 00
00036514: 00 50
00036515: 00 51
00036516: 00 52
00036517: 00 41
00036518: 00 50
00036519: 00 41
0003651A: 00 51
0003651B: 00 48
0003651C: 00 83
0003651D: 00 EC
0003651E: 00 30
0003651F: 00 BA
00036522: 00 04
00036524: 00 B9
00036525: 00 01
00036529: 00 E8
0003652A: 00 7A
0003652B: 00 FD
0003652C: 00 FD
0003652D: 00 FF
0003652E: 00 48
0003652F: 00 83
00036530: 00 C4
00036531: 00 30
00036532: 00 41
00036533: 00 59
00036534: 00 41
00036535: 00 58
00036536: 00 5A
00036537: 00 59
00036538: 00 58
00036539: 00 48
0003653A: 00 33
0003653B: 00 C4
0003653C: 00 48
0003653D: 00 89
0003653E: 00 84
0003653F: 00 24
00036540: 00 50
00036541: 00 01
00036544: 00 E9
00036545: 00 D2
00036546: 00 1F
00036547: 00 FD
00036548: 00 FF

如何申请

  1. 将上述补丁保存到文件中patch.txt并将其放在可执行文件旁边handle64.exe
  2. 从此处下载 powershell 脚本@DitherSky 的回答并将脚本放在handle64.exe可执行文件旁边。
  3. 使用以下命令创建一个批处理脚本文件runme.cmd并将其放在可执行文件旁边handle64.exe
@cd /d "%~dp0"
@powershell -executionpolicy bypass -File fc2bin.ps1 -Apply patch.txt
@pause
  1. 运行批处理脚本runme.cmd以将修复程序应用到handle64.exe可执行文件。

答案2


这是一个已知的限制,他们无意修复。学习微软回避了这一事实。


关于如何处理它的建议是使用上面链接提供的几个链接之一来构建您自己的副本。

与寻找变通方法相比,您可以节省一些时间寻找解决方案。

相关内容