[PATCH] cmd: Allow starting native executables
Fabian Maurer
dark.shadow4 at web.de
Sun Mar 3 06:11:32 CST 2019
Note that this is obviously different from what windows cmd
does, but Wine has a different situation.
Running native binaries without 'start' is pretty useful, IMHO.
We check for a magic signature to avoid regressions in case
there is a file without the extension that's not a native
executable.
Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
programs/cmd/wcmdmain.c | 33 ++++++++++++++++++++++++++++-----
1 file changed, 28 insertions(+), 5 deletions(-)
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index 637c0e94bd..26910ee4c8 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -1009,6 +1009,29 @@ static void init_msvcrt_io_block(STARTUPINFOW* st)
}
}
+static BOOL is_native_executable(WCHAR *path)
+{
+ HANDLE file;
+ char buffer[4];
+ static const char magic_elf[] = {0x7f, 'E', 'L', 'F'};
+ DWORD bytes_read;
+
+ file = CreateFileW(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
+ ReadFile(file, buffer, ARRAY_SIZE(buffer), &bytes_read, NULL);
+ CloseHandle(file);
+
+ if (bytes_read < ARRAY_SIZE(buffer))
+ return FALSE;
+
+ if (memcmp(buffer, magic_elf, 4) == 0)
+ return TRUE;
+
+ if (memcmp(buffer, "#!/", 3) == 0)
+ return TRUE;
+
+ return FALSE;
+}
+
/******************************************************************************
* WCMD_run_program
*
@@ -1141,11 +1164,11 @@ void WCMD_run_program (WCHAR *command, BOOL called)
strcatW(thisDir, stemofsearch);
pos = &thisDir[strlenW(thisDir)]; /* Pos = end of name */
- /* 1. If extension supplied, see if that file exists */
- if (extensionsupplied) {
- if (GetFileAttributesW(thisDir) != INVALID_FILE_ATTRIBUTES) {
- found = TRUE;
- }
+ /* 1. If extension supplied, see if that file exists - also check if we got a path to a native executable */
+ if (GetFileAttributesW(thisDir) != INVALID_FILE_ATTRIBUTES) {
+ if (extensionsupplied || is_native_executable(thisDir)) {
+ found = TRUE;
+ }
}
/* 2. Any .* matches? */
--
2.21.0
More information about the wine-devel
mailing list