我有一个.exe
文件无法在 Windows 10 上运行。我怀疑这是因为二进制文件是 16 位。有没有简单的方法可以检查?比如Alexander Revo 的回答会很好。
答案1
Windows 多次扩展了旧的 DOS 可执行文件格式,因此如果你查看“现代”的 Windows 可执行文件,在开头附近会有一个MZ
(或者ZM
如果可执行文件适用于使用相反位顺序的系统)。这指定了第二DOS 可执行格式,简称为 MZ 格式。
除此之外,您还会看到一些明显的乱码,后面跟着类似“该程序无法在 DOS 模式下运行”的内容。这些乱码实际上是一个非常简单的 DOS 程序,它会打印出一条消息来告诉用户该程序无法在 DOS 模式下运行。
之后,您将获得实际可执行文件的标头,它可能以四对字母中的一对开头,NE
、LX
、LE
或PE
。如果您没有看到其中一个和上述消息,则它是一个 16 位 DOS 应用程序。
NE
可执行文件(称为“新可执行文件”)目前已弃用。它们是第一个从 MZ 扩展而来的“新”格式,最初是为 Windows 1.0 开发的。它们始终是 16 位 Windows 可执行文件,并正式用于 Windows 1.0-3.x、MS-DOS 4.0(但不是更高版本)、OS/2 1.x 和 OS/2 版本的 Windows,直至 NT 5.0(Windows 2000)。它们无法在 64 位 Windows 上本机运行,并且自 Vista 以来无法在 32 位版本的 Windows 上正确显示应用程序图标。
LX
可执行文件(两种“线性可执行文件”之一)是 32 位可执行文件,其格式由 OS/2 2.x 及更新版本以及某些 DOS 扩展器使用。任何现代版本的 Windows 都不支持这些文件(我认为它们可能从未得到支持,但我不确定)。
LE
可执行文件(另一种“线性可执行文件”)是一种奇怪的情况,甚至可能在技术上包含 64 位代码。它们也是在 OS/2 2.0 中引入的(就像LX
可执行文件一样),但设计用于硬件驱动程序。Windows 3.x 和 9x 中使用的 VxD 驱动程序模型采用了这种格式。它们从未用于用户应用程序,因此在较新版本的 Windows 上根本不受支持。
PE
可执行文件,通常称为“可移植可执行文件”,是现代 Windows 系统使用的格式,专为 32 位代码而设计(因此从不支持 16 位代码)。还有一个名为“PE32+”的扩展,用于 64 位 Windows 二进制文件、.NET CIL 二进制文件(与位宽无关)以及使用不同扩展的许多其他内容(例如,使用扩展的 UEFI 驱动程序和应用程序.efi
是 PE32+ 格式)。
使用此信息,您可以使用问题中链接的答案中建议的相同常规检查。如果您在文件MZ
的前 4kB 中只看到和而不是短消息,后面跟着一些乱码,然后是上述四个字母对之一,则它只是一个 DOS 可执行文件,否则,它就是这四种格式之一。这些格式中唯一可以在 Windows 10 上原生运行的是 PE 格式。
举个例子,下面是 64 位 Windows 可执行文件(具体来说,是 BOINC 客户端软件的组件之一)的前 512 个字节的十六进制转储:
00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000 MZ..............
00000010: b800 0000 0000 0000 4000 0000 0000 0000 ........@.......
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 1801 0000 ................
00000040: 0e1f ba0e 00b4 09cd 21b8 014c cd21 5468 ........!..L.!Th
00000050: 6973 2070 726f 6772 616d 2063 616e 6e6f is program canno
00000060: 7420 6265 2072 756e 2069 6e20 444f 5320 t be run in DOS
00000070: 6d6f 6465 2e0d 0d0a 2400 0000 0000 0000 mode....$.......
00000080: c88d b31c 8cec dd4f 8cec dd4f 8cec dd4f .......O...O...O
00000090: 8594 4e4f 9aec dd4f e39a 414f 88ec dd4f ..NO...O..AO...O
000000a0: 1fa2 454f 8eec dd4f e39a 434f 8eec dd4f ..EO...O..CO...O
000000b0: e39a 774f 9fec dd4f e39a 764f 89ec dd4f ..wO...O..vO...O
000000c0: 8594 5e4f 8dec dd4f 8594 594f 8dec dd4f ..^O...O..YO...O
000000d0: 9771 414f 85ec dd4f 8cec dc4f 14ed dd4f .qAO...O...O...O
000000e0: 9771 764f d0ec dd4f 9771 474f 8dec dd4f .qvO...O.qGO...O
000000f0: 9771 404f 8dec dd4f 5269 6368 8cec dd4f [email protected]
00000100: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000110: 0000 0000 0000 0000 5045 0000 6486 0600 ........PE..d...
00000120: 4c88 ea5a 0000 0000 0000 0000 f000 2200 L..Z..........".
00000130: 0b02 0a00 00fe 0a00 0092 0b00 0000 0000 ................
00000140: c0e4 0800 0010 0000 0000 0040 0100 0000 ...........@....
00000150: 0010 0000 0002 0000 0500 0200 0000 0000 ................
00000160: 0500 0200 0000 0000 0020 1b00 0004 0000 ......... ......
00000170: 489f 1700 0300 4081 0000 1000 0000 0000 H.....@.........
00000180: 0010 0000 0000 0000 0000 1000 0000 0000 ................
00000190: 0010 0000 0000 0000 0000 0000 1000 0000 ................
000001a0: 0000 0000 0000 0000 8cc6 0e00 6801 0000 ............h...
000001b0: 0030 1400 9cd6 0600 00a0 1300 a884 0000 .0..............
000001c0: 0094 1600 2019 0000 0010 1b00 2001 0000 .... ....... ...
000001d0: e01c 0b00 1c00 0000 0000 0000 0000 0000 ................
000001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
首先注意MZ
前两个字节,然后是 DOS 程序的数据,告诉您如果尝试在 DOS 下运行该程序,则无法在 DOS 下运行,然后是PE
字节 280 和 281 中的签名。您还可以在文本编辑器中看到这些特定元素,尽管阅读起来要困难得多。
但请注意,也有可能它根本不是 Windows 可执行文件,只是有人给它起了错误的名字。Windows 通常会将某个文件识别为 16 位可执行文件,并说这就是它无法运行它的原因。
答案2
如果 Windows 无法运行您的应用程序(因为它是 16 位),它会明确地告诉您。无需猜测。
Windows 10 保留了以前版本的兼容性策略;64 位版本无法运行 16 位软件。32 位版本可以运行 16 位软件,但与以前的版本不同,您需要通过 Windows 功能添加 NTVDM 支持。