Recently, we came across a very interesting issue. A purely native application written in C++ was failing with “Not a valid win32 application” error at the startup on Windows XP machine.
There are a few basic checks that we do to troubleshoot this error. We did the following checks:
1) Checked if all the modules are built for the same platform. (no mixing of modules intended for x86 and x64 platforms)
2) Checked the Event Log entry. Sometimes EventLog gives very good clues to move towards resolution. There was no information available for this error.
3) Tried spawning the exe from a debugger. It didn’t break inside the application but crashed even before it. Had enabled Loader snaps using gflags that come with “Debugging Tools for Windows” to check which DLL fails to load. But the application was crashing before any dependent DLL got loaded.
4) For the first time even Process Monitor failed to give any clues.
Then we thought of getting the dumpbin header output (dumpbin /headers test.exe > DumpBinTest.txt). Analyzing the output file showed that target Operating System was 5.02. It means that the exe was intended for Windows Server 2003 and higher version of Operating Systems and not for XP. We tried running the exe on Windows Server 2003 machine and it worked fine. So that was the root cause. Changing the winver from 502 to 501 resolved the issue. J
Here is a part of the DumpBin header that confirmed the issue:
Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file TestWin32.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (x86)
7 number of sections
48CFDFAC time date stamp Tue Sep 16 22:02:44 2008
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
32 bit word machine
OPTIONAL HEADER VALUES
10B magic # (PE32)
9.00 linker version
3200 size of code
4200 size of initialized data
0 size of uninitialized data
11073 entry point (00411073) @ILT+110(_wmainCRTStartup)
1000 base of code
1000 base of data
400000 image base (00400000 to 0041AFFF)
1000 section alignment
200 file alignment
5.02 operating system version
0.00 image version
Here are a few links for your information:
1) For more information on Minimum value for _WIN32_WINNT and WINVER, please check this MSDN Link.
2) The /SUBSYSTEM option specifies the environment for the executable. Here is the link which describes it more.
3) This blog discusses different windows version symbols. It is a nice read.
4) This link describes how to modify the WINVER and _WIN32_WINNT and also describes what change happened in Visual Studio 2008.
Microsoft Developer Support – VC++ & C#