GetFileExInfoStandard,
GetFileExMaxInfoLevel
} GET_FILEEX_INFO_LEVELS;
+typedef struct _STARTUPINFOA {
+ DWORD cb;
+ char * lpReserved;
+ char * lpDesktop;
+ char * lpTitle;
+ DWORD dwX;
+ DWORD dwY;
+ DWORD dwXSize;
+ DWORD dwYSize;
+ DWORD dwXCountChars;
+ DWORD dwYCountChars;
+ DWORD dwFillAttribute;
+ DWORD dwFlags;
+ WORD wShowWindow;
+ WORD cbReserved2;
+ char * lpReserved2;
+ HANDLE hStdInput;
+ HANDLE hStdOutput;
+ HANDLE hStdError;
+} STARTUPINFOA, *LPSTARTUPINFOA;
+typedef struct _PROCESS_INFORMATION {
+ HANDLE hProcess;
+ HANDLE hThread;
+ DWORD dwProcessId;
+ DWORD dwThreadId;
+} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
#define INFINITE 0xffffffffl
#define INVALID_HANDLE_VALUE ((void *)(intptr_t)(-1))
GB_DLL_IMPORT DWORD WINAPI GetThreadId (HANDLE handle);
GB_DLL_IMPORT void WINAPI RaiseException (DWORD, DWORD, DWORD, ULONG_PTR const *);
GB_DLL_IMPORT BOOL WINAPI TerminateThread (HANDLE hThread, DWORD dwExitCode);
-
+GB_DLL_IMPORT BOOL WINAPI CreateProcessA (char const * lpApplicationName, char * lpCommandLine,
+ SECURITY_ATTRIBUTES* lpProcessAttrs, SECURITY_ATTRIBUTES* lpThreadAttributes,
+ BOOL bInheritHandles, DWORD dwCreationFlags, void* lpEnvironment,
+ char const * lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo,
+ LPPROCESS_INFORMATION lpProcessInformation);
GB_DLL_IMPORT BOOL WINAPI GetLogicalProcessorInformation(SYSTEM_LOGICAL_PROCESSOR_INFORMATION *buffer, DWORD *return_length);
GB_DLL_IMPORT DWORD_PTR WINAPI SetThreadAffinityMask(HANDLE thread, DWORD_PTR check_mask);
memcpy(process_path, process_str, process_len);
process_path[process_len] = '\0';
- char **process_args = bh_alloc_array(global_scratch_allocator, char *, args_len + 2);
- byte_t* data = wasm_memory_data(wasm_memory);
- byte_t* array_loc = data + args_ptr;
- fori (i, 1, args_len + 1) {
- char *arg_str = data + *(i32 *) (array_loc + (i - 1) * 8);
- i32 arg_len = *(i32 *) (array_loc + (i - 1) * 8 + 4);
-
- char *arg = bh_alloc_array(global_scratch_allocator, char, arg_len + 1);
- memcpy(arg, arg_str, arg_len);
- arg[arg_len] = '\0';
- process_args[i] = arg;
- }
- process_args[0] = process_path;
- process_args[args_len + 1] = NULL;
+ // CLEANUP: Make the return value from the Windows and Linux version mean the same thing!!!
#ifdef _BH_LINUX
+ char **process_args = bh_alloc_array(global_scratch_allocator, char *, args_len + 2);
+ byte_t* data = wasm_memory_data(wasm_memory);
+ byte_t* array_loc = data + args_ptr;
+ fori (i, 0, args_len) {
+ char *arg_str = data + *(i32 *) (array_loc + i * 2 * POINTER_SIZE);
+ i32 arg_len = *(i32 *) (array_loc + i * 2 * POINTER_SIZE + 4);
+
+ char *arg = bh_alloc_array(global_scratch_allocator, char, arg_len + 1);
+ memcpy(arg, arg_str, arg_len);
+ arg[arg_len] = '\0';
+ process_args[i - 1] = arg;
+ }
+ process_args[0] = process_path;
+ process_args[args_len + 1] = NULL;
+
if (fork() == 0) {
execv(process_path, process_args);
}
results->data[0] = WASM_I32_VAL(WEXITSTATUS(status));
#endif
+ #ifdef _BH_WINDOWS
+ // CLEANUP CLEANUP CLEANUP: This is so freaking bad...
+ char cmdLine[2048];
+ memset(cmdLine, 0, 2048);
+ strncat(cmdLine, process_path, 2047);
+
+ byte_t* data = wasm_memory_data(wasm_memory);
+ byte_t* array_loc = data + args_ptr;
+ fori (i, 0, args_len) {
+ char *arg_str = data + *(i32 *) (array_loc + i * 2 * POINTER_SIZE);
+ i32 arg_len = *(i32 *) (array_loc + i * 2 * POINTER_SIZE + 4);
+
+ strncat(cmdLine, " ", 2047);
+ strncat(cmdLine, arg_str, arg_len);
+ }
+
+ STARTUPINFOA startup;
+ memset(&startup, 0, sizeof startup);
+ startup.cb = sizeof(startup);
+
+ PROCESS_INFORMATION proc_info;
+ BOOL success = CreateProcessA(process_path, cmdLine, NULL, NULL, 1, 0, NULL, NULL, &startup, &proc_info);
+ DWORD result = WaitForSingleObject(proc_info.hProcess, INFINITE);
+ results->data[0] = WASM_I32_VAL(result);
+ #endif
+
return NULL;
}