From c268c87586f9c37d1d657d3ea710d3832af632c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Wed, 28 Aug 2013 13:23:09 +0000 Subject: [PATCH] [KERNEL32] - Add brackets around "case XXX:" so that I'm able to (un)fold regions of code when debugging and reading. - Temporarily skip AppCompat functionality added by Alex, in order to "fix" (read: hack-fix) launch of .bat/.cmd files. Indeed, when .bat/.cmd files get started with the CreateProcess function, a call to NtCreateSection fails with status STATUS_INVALID_IMAGE_NOT_MZ, as expected (line 2952). But the new AppCompat code (lines 3028 and 3031-3033 and following, and 3114), executed whenever the status code from NtCreateSection is STATUS_SUCCESS or STATUS_INVALID_IMAGE_NOT_MZ or something else, overwrites the status code by other values, so that, after we return to the main code path (lines 3174 and following), the status code isn't STATUS_INVALID_IMAGE_NOT_MZ anymore but STATUS_SUCCESS or whatever, and then, we fail to run the .bat/.cmd file (that should be done at lines 3314-3316 and following). To Alex_Ionescu: Have a look at this and fix it properly!! svn path=/trunk/; revision=59855 --- reactos/dll/win32/kernel32/client/proc.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/kernel32/client/proc.c b/reactos/dll/win32/kernel32/client/proc.c index e36dbc9898a..0e99abd0bb2 100644 --- a/reactos/dll/win32/kernel32/client/proc.c +++ b/reactos/dll/win32/kernel32/client/proc.c @@ -2382,7 +2382,7 @@ CreateProcessInternalW(IN HANDLE hUserToken, /* Zero out the initial core variables and handles */ QuerySection = FALSE; InJob = FALSE; - SkipSaferAndAppCompat = FALSE; + SkipSaferAndAppCompat = TRUE; // HACK for making .bat/.cmd launch working again. ParameterFlags = 0; Flags = 0; DebugHandle = NULL; @@ -3174,6 +3174,7 @@ StartScan: switch (Status) { case STATUS_INVALID_IMAGE_WIN_16: + { /* 16-bit binary. Should we use WOW or does the caller force VDM? */ if (!(dwCreationFlags & CREATE_FORCEDOS)) { @@ -3308,9 +3309,12 @@ StartScan: } // There is no break here on purpose, so FORCEDOS drops down! + } + case STATUS_INVALID_IMAGE_PROTECT: case STATUS_INVALID_IMAGE_NOT_MZ: case STATUS_INVALID_IMAGE_NE_FORMAT: + { /* We're launching an executable application */ BinarySubType = BINARY_TYPE_EXE; @@ -3493,21 +3497,27 @@ StartScan: /* We've already done all these checks, don't do them again */ SkipSaferAndAppCompat = TRUE; goto AppNameRetry; + } case STATUS_INVALID_IMAGE_WIN_64: + { /* 64-bit binaries are not allowed to run on 32-bit ReactOS */ DPRINT1("64-bit binary, failing\n"); SetLastError(ERROR_EXE_MACHINE_TYPE_MISMATCH); Result = FALSE; goto Quickie; + } case STATUS_FILE_IS_OFFLINE: + { /* Set the correct last error for this */ DPRINT1("File is offline, failing\n"); SetLastError(ERROR_FILE_OFFLINE); break; + } default: + { /* Any other error, convert it to a generic Win32 error */ if (!NT_SUCCESS(Status)) { @@ -3520,6 +3530,7 @@ StartScan: /* Otherwise, this must be success */ ASSERT(Status == STATUS_SUCCESS); break; + } } /* Is this not a WOW application, but a WOW32 VDM was requested for it? */