Maarten Lankhorst : kernel32: CreateProcessA should not call CreateProcessW directly.
Alexandre Julliard
julliard at winehq.org
Thu Apr 7 07:36:57 CDT 2011
Module: wine
Branch: stable
Commit: eb82a451df81edf0d6b30a68bb26bf101ceec4c2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=eb82a451df81edf0d6b30a68bb26bf101ceec4c2
Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Wed Mar 16 19:38:08 2011 +0100
kernel32: CreateProcessA should not call CreateProcessW directly.
(cherry picked from commit 8b163d6fb600b62c4995b0c92f48316d9821b7ee)
---
dlls/kernel32/process.c | 109 ++++++++++++++++++++++++++---------------------
1 files changed, 60 insertions(+), 49 deletions(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index a56889e..c392d3e 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -2106,55 +2106,11 @@ static LPWSTR get_file_name( LPCWSTR appname, LPWSTR cmdline, LPWSTR buffer,
}
-/**********************************************************************
- * CreateProcessA (KERNEL32.@)
- */
-BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessA( LPCSTR app_name, LPSTR cmd_line, LPSECURITY_ATTRIBUTES process_attr,
- LPSECURITY_ATTRIBUTES thread_attr, BOOL inherit,
- DWORD flags, LPVOID env, LPCSTR cur_dir,
- LPSTARTUPINFOA startup_info, LPPROCESS_INFORMATION info )
-{
- BOOL ret = FALSE;
- WCHAR *app_nameW = NULL, *cmd_lineW = NULL, *cur_dirW = NULL;
- UNICODE_STRING desktopW, titleW;
- STARTUPINFOW infoW;
-
- desktopW.Buffer = NULL;
- titleW.Buffer = NULL;
- if (app_name && !(app_nameW = FILE_name_AtoW( app_name, TRUE ))) goto done;
- if (cmd_line && !(cmd_lineW = FILE_name_AtoW( cmd_line, TRUE ))) goto done;
- if (cur_dir && !(cur_dirW = FILE_name_AtoW( cur_dir, TRUE ))) goto done;
-
- if (startup_info->lpDesktop) RtlCreateUnicodeStringFromAsciiz( &desktopW, startup_info->lpDesktop );
- if (startup_info->lpTitle) RtlCreateUnicodeStringFromAsciiz( &titleW, startup_info->lpTitle );
-
- memcpy( &infoW, startup_info, sizeof(infoW) );
- infoW.lpDesktop = desktopW.Buffer;
- infoW.lpTitle = titleW.Buffer;
-
- if (startup_info->lpReserved)
- FIXME("StartupInfo.lpReserved is used, please report (%s)\n",
- debugstr_a(startup_info->lpReserved));
-
- ret = CreateProcessW( app_nameW, cmd_lineW, process_attr, thread_attr,
- inherit, flags, env, cur_dirW, &infoW, info );
-done:
- HeapFree( GetProcessHeap(), 0, app_nameW );
- HeapFree( GetProcessHeap(), 0, cmd_lineW );
- HeapFree( GetProcessHeap(), 0, cur_dirW );
- RtlFreeUnicodeString( &desktopW );
- RtlFreeUnicodeString( &titleW );
- return ret;
-}
-
-
-/**********************************************************************
- * CreateProcessW (KERNEL32.@)
- */
-BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIBUTES process_attr,
- LPSECURITY_ATTRIBUTES thread_attr, BOOL inherit, DWORD flags,
- LPVOID env, LPCWSTR cur_dir, LPSTARTUPINFOW startup_info,
- LPPROCESS_INFORMATION info )
+/* Steam hotpatches CreateProcessA and W, so to prevent it from crashing use an internal function */
+static BOOL create_process_impl( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIBUTES process_attr,
+ LPSECURITY_ATTRIBUTES thread_attr, BOOL inherit, DWORD flags,
+ LPVOID env, LPCWSTR cur_dir, LPSTARTUPINFOW startup_info,
+ LPPROCESS_INFORMATION info )
{
BOOL retv = FALSE;
HANDLE hFile = 0;
@@ -2286,6 +2242,61 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line,
/**********************************************************************
+ * CreateProcessA (KERNEL32.@)
+ */
+BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessA( LPCSTR app_name, LPSTR cmd_line, LPSECURITY_ATTRIBUTES process_attr,
+ LPSECURITY_ATTRIBUTES thread_attr, BOOL inherit,
+ DWORD flags, LPVOID env, LPCSTR cur_dir,
+ LPSTARTUPINFOA startup_info, LPPROCESS_INFORMATION info )
+{
+ BOOL ret = FALSE;
+ WCHAR *app_nameW = NULL, *cmd_lineW = NULL, *cur_dirW = NULL;
+ UNICODE_STRING desktopW, titleW;
+ STARTUPINFOW infoW;
+
+ desktopW.Buffer = NULL;
+ titleW.Buffer = NULL;
+ if (app_name && !(app_nameW = FILE_name_AtoW( app_name, TRUE ))) goto done;
+ if (cmd_line && !(cmd_lineW = FILE_name_AtoW( cmd_line, TRUE ))) goto done;
+ if (cur_dir && !(cur_dirW = FILE_name_AtoW( cur_dir, TRUE ))) goto done;
+
+ if (startup_info->lpDesktop) RtlCreateUnicodeStringFromAsciiz( &desktopW, startup_info->lpDesktop );
+ if (startup_info->lpTitle) RtlCreateUnicodeStringFromAsciiz( &titleW, startup_info->lpTitle );
+
+ memcpy( &infoW, startup_info, sizeof(infoW) );
+ infoW.lpDesktop = desktopW.Buffer;
+ infoW.lpTitle = titleW.Buffer;
+
+ if (startup_info->lpReserved)
+ FIXME("StartupInfo.lpReserved is used, please report (%s)\n",
+ debugstr_a(startup_info->lpReserved));
+
+ ret = create_process_impl( app_nameW, cmd_lineW, process_attr, thread_attr,
+ inherit, flags, env, cur_dirW, &infoW, info );
+done:
+ HeapFree( GetProcessHeap(), 0, app_nameW );
+ HeapFree( GetProcessHeap(), 0, cmd_lineW );
+ HeapFree( GetProcessHeap(), 0, cur_dirW );
+ RtlFreeUnicodeString( &desktopW );
+ RtlFreeUnicodeString( &titleW );
+ return ret;
+}
+
+
+/**********************************************************************
+ * CreateProcessW (KERNEL32.@)
+ */
+BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIBUTES process_attr,
+ LPSECURITY_ATTRIBUTES thread_attr, BOOL inherit, DWORD flags,
+ LPVOID env, LPCWSTR cur_dir, LPSTARTUPINFOW startup_info,
+ LPPROCESS_INFORMATION info )
+{
+ return create_process_impl( app_name, cmd_line, process_attr, thread_attr,
+ inherit, flags, env, cur_dir, startup_info, info);
+}
+
+
+/**********************************************************************
* exec_process
*/
static void exec_process( LPCWSTR name )
More information about the wine-cvs
mailing list