From 911e50849a9bc05ab11d896a3b7f7a3b3462fabd Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 9 Sep 2019 13:44:53 +0200 Subject: [PATCH] kernel32: Move process startup information functions to kernelbase. Signed-off-by: Alexandre Julliard --- dlls/kernel32/environ.c | 104 --------------------------- dlls/kernel32/kernel32.spec | 12 ++-- dlls/kernelbase/kernelbase.h | 1 + dlls/kernelbase/kernelbase.spec | 12 ++-- dlls/kernelbase/main.c | 19 ++++- dlls/kernelbase/process.c | 121 ++++++++++++++++++++++++++++++++ 6 files changed, 151 insertions(+), 118 deletions(-) diff --git a/dlls/kernel32/environ.c b/dlls/kernel32/environ.c index 30482b77623..2d80600f78e 100644 --- a/dlls/kernel32/environ.c +++ b/dlls/kernel32/environ.c @@ -46,84 +46,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(environ); * to sort them either. */ -static STARTUPINFOW startup_infoW; static STARTUPINFOA startup_infoA; - -/*********************************************************************** - * GetCommandLineA (KERNEL32.@) - * - * WARNING: there's a Windows incompatibility lurking here ! - * Win32s always includes the full path of the program file, - * whereas Windows NT only returns the full file path plus arguments - * in case the program has been started with a full path. - * Win9x seems to have inherited NT behaviour. - * - * Note that both Start Menu Execute and Explorer start programs with - * fully specified quoted app file paths, which is why probably the only case - * where you'll see single file names is in case of direct launch - * via CreateProcess or WinExec. - * - * Perhaps we should take care of Win3.1 programs here (Win32s "feature"). - * - * References: MS KB article q102762.txt (special Win32s handling) - */ -LPSTR WINAPI GetCommandLineA(void) -{ - static char *cmdlineA; /* ASCII command line */ - - if (!cmdlineA) /* make an ansi version if we don't have it */ - { - ANSI_STRING ansi; - RtlAcquirePebLock(); - - cmdlineA = (RtlUnicodeStringToAnsiString( &ansi, &NtCurrentTeb()->Peb->ProcessParameters->CommandLine, TRUE) == STATUS_SUCCESS) ? - ansi.Buffer : NULL; - RtlReleasePebLock(); - } - return cmdlineA; -} - -/*********************************************************************** - * GetCommandLineW (KERNEL32.@) - */ -LPWSTR WINAPI GetCommandLineW(void) -{ - return NtCurrentTeb()->Peb->ProcessParameters->CommandLine.Buffer; -} - - -/*********************************************************************** - * GetStdHandle (KERNEL32.@) - */ -HANDLE WINAPI GetStdHandle( DWORD std_handle ) -{ - switch (std_handle) - { - case STD_INPUT_HANDLE: return NtCurrentTeb()->Peb->ProcessParameters->hStdInput; - case STD_OUTPUT_HANDLE: return NtCurrentTeb()->Peb->ProcessParameters->hStdOutput; - case STD_ERROR_HANDLE: return NtCurrentTeb()->Peb->ProcessParameters->hStdError; - } - SetLastError( ERROR_INVALID_HANDLE ); - return INVALID_HANDLE_VALUE; -} - - -/*********************************************************************** - * SetStdHandle (KERNEL32.@) - */ -BOOL WINAPI SetStdHandle( DWORD std_handle, HANDLE handle ) -{ - switch (std_handle) - { - case STD_INPUT_HANDLE: NtCurrentTeb()->Peb->ProcessParameters->hStdInput = handle; return TRUE; - case STD_OUTPUT_HANDLE: NtCurrentTeb()->Peb->ProcessParameters->hStdOutput = handle; return TRUE; - case STD_ERROR_HANDLE: NtCurrentTeb()->Peb->ProcessParameters->hStdError = handle; return TRUE; - } - SetLastError( ERROR_INVALID_HANDLE ); - return FALSE; -} - /*********************************************************************** * GetStartupInfoA (KERNEL32.@) */ @@ -132,15 +56,6 @@ VOID WINAPI GetStartupInfoA( LPSTARTUPINFOA info ) *info = startup_infoA; } - -/*********************************************************************** - * GetStartupInfoW (KERNEL32.@) - */ -VOID WINAPI GetStartupInfoW( LPSTARTUPINFOW info ) -{ - *info = startup_infoW; -} - /****************************************************************** * ENV_CopyStartupInformation (internal) * @@ -155,25 +70,6 @@ void ENV_CopyStartupInformation(void) rupp = NtCurrentTeb()->Peb->ProcessParameters; - startup_infoW.cb = sizeof(startup_infoW); - startup_infoW.lpReserved = NULL; - startup_infoW.lpDesktop = rupp->Desktop.Buffer; - startup_infoW.lpTitle = rupp->WindowTitle.Buffer; - startup_infoW.dwX = rupp->dwX; - startup_infoW.dwY = rupp->dwY; - startup_infoW.dwXSize = rupp->dwXSize; - startup_infoW.dwYSize = rupp->dwYSize; - startup_infoW.dwXCountChars = rupp->dwXCountChars; - startup_infoW.dwYCountChars = rupp->dwYCountChars; - startup_infoW.dwFillAttribute = rupp->dwFillAttribute; - startup_infoW.dwFlags = rupp->dwFlags; - startup_infoW.wShowWindow = rupp->wShowWindow; - startup_infoW.cbReserved2 = rupp->RuntimeInfo.MaximumLength; - startup_infoW.lpReserved2 = rupp->RuntimeInfo.MaximumLength ? (void*)rupp->RuntimeInfo.Buffer : NULL; - startup_infoW.hStdInput = rupp->hStdInput ? rupp->hStdInput : INVALID_HANDLE_VALUE; - startup_infoW.hStdOutput = rupp->hStdOutput ? rupp->hStdOutput : INVALID_HANDLE_VALUE; - startup_infoW.hStdError = rupp->hStdError ? rupp->hStdError : INVALID_HANDLE_VALUE; - startup_infoA.cb = sizeof(startup_infoA); startup_infoA.lpReserved = NULL; startup_infoA.lpDesktop = RtlUnicodeStringToAnsiString( &ansi, &rupp->Desktop, TRUE ) == STATUS_SUCCESS ? diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 2b653a370cc..0bb80ae57b8 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -568,8 +568,8 @@ @ stdcall GetCommProperties(long ptr) @ stdcall GetCommState(long ptr) @ stdcall GetCommTimeouts(long ptr) -@ stdcall GetCommandLineA() -@ stdcall GetCommandLineW() +@ stdcall -import GetCommandLineA() +@ stdcall -import GetCommandLineW() @ stdcall -import GetCompressedFileSizeA(long ptr) # @ stub GetCompressedFileSizeTransactedA # @ stub GetCompressedFileSizeTransactedW @@ -810,8 +810,8 @@ @ stdcall GetShortPathNameA(str ptr long) @ stdcall GetShortPathNameW(wstr ptr long) @ stdcall GetStartupInfoA(ptr) -@ stdcall GetStartupInfoW(ptr) -@ stdcall GetStdHandle(long) +@ stdcall -import GetStartupInfoW(ptr) +@ stdcall -import GetStdHandle(long) # @ stub GetStringScripts @ stdcall GetStringTypeA(long long str long ptr) @ stdcall GetStringTypeExA(long long str long ptr) @@ -1436,8 +1436,8 @@ @ stdcall SetProcessWorkingSetSize(long long long) @ stdcall -import SetProcessWorkingSetSizeEx(long long long long) @ stdcall SetSearchPathMode(long) -@ stdcall SetStdHandle(long long) -# @ stub SetStdHandleEx +@ stdcall -import SetStdHandle(long long) +@ stdcall -import SetStdHandleEx(long long ptr) @ stdcall SetSystemFileCacheSize(long long long) @ stdcall SetSystemPowerState(long long) @ stdcall SetSystemTime(ptr) diff --git a/dlls/kernelbase/kernelbase.h b/dlls/kernelbase/kernelbase.h index 36ff079e173..abd33b6f1f8 100644 --- a/dlls/kernelbase/kernelbase.h +++ b/dlls/kernelbase/kernelbase.h @@ -26,6 +26,7 @@ extern WCHAR *file_name_AtoW( LPCSTR name, BOOL alloc ) DECLSPEC_HIDDEN; extern DWORD file_name_WtoA( LPCWSTR src, INT srclen, LPSTR dest, INT destlen ) DECLSPEC_HIDDEN; +extern void init_startup_info( RTL_USER_PROCESS_PARAMETERS *params ) DECLSPEC_HIDDEN; extern const WCHAR windows_dir[] DECLSPEC_HIDDEN; extern const WCHAR system_dir[] DECLSPEC_HIDDEN; diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 0f752302f35..083a15348d5 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -433,8 +433,8 @@ @ stdcall GetCommProperties(long ptr) kernel32.GetCommProperties @ stdcall GetCommState(long ptr) kernel32.GetCommState @ stdcall GetCommTimeouts(long ptr) kernel32.GetCommTimeouts -@ stdcall GetCommandLineA() kernel32.GetCommandLineA -@ stdcall GetCommandLineW() kernel32.GetCommandLineW +@ stdcall GetCommandLineA() +@ stdcall GetCommandLineW() @ stdcall GetCompressedFileSizeA(long ptr) @ stdcall GetCompressedFileSizeW(long ptr) @ stdcall GetComputerNameExA(long ptr ptr) kernel32.GetComputerNameExA @@ -665,14 +665,14 @@ @ stdcall GetSidSubAuthorityCount(ptr) # @ stub GetStagedPackageOrigin # @ stub GetStagedPackagePathByFullName -@ stdcall GetStartupInfoW(ptr) kernel32.GetStartupInfoW +@ stdcall GetStartupInfoW(ptr) # @ stub GetStateContainerDepth # @ stub GetStateFolder # @ stub GetStateRootFolder # @ stub GetStateRootFolderBase # @ stub GetStateSettingsFolder # @ stub GetStateVersion -@ stdcall GetStdHandle(long) kernel32.GetStdHandle +@ stdcall GetStdHandle(long) # @ stub GetStringScripts @ stub GetStringTableEntry @ stdcall GetStringTypeA(long long str long ptr) kernel32.GetStringTypeA @@ -1473,8 +1473,8 @@ @ stub SetSecurityDescriptorRMControl @ stdcall SetSecurityDescriptorSacl(ptr long ptr long) # @ stub SetStateVersion -@ stdcall SetStdHandle(long long) kernel32.SetStdHandle -@ stub SetStdHandleEx +@ stdcall SetStdHandle(long long) +@ stdcall SetStdHandleEx(long long ptr) @ stdcall SetSystemFileCacheSize(long long long) kernel32.SetSystemFileCacheSize @ stdcall SetSystemTime(ptr) kernel32.SetSystemTime @ stdcall SetSystemTimeAdjustment(long long) kernel32.SetSystemTimeAdjustment diff --git a/dlls/kernelbase/main.c b/dlls/kernelbase/main.c index e00f9d19bba..74937263cf1 100644 --- a/dlls/kernelbase/main.c +++ b/dlls/kernelbase/main.c @@ -25,20 +25,35 @@ #include "appmodel.h" #include "shlwapi.h" #include "perflib.h" +#include "winternl.h" #include "wine/debug.h" #include "wine/heap.h" -#include "winternl.h" +#include "kernelbase.h" WINE_DEFAULT_DEBUG_CHANNEL(kernelbase); +/*********************************************************************** + * DllMain + */ +BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) +{ + if (reason == DLL_PROCESS_ATTACH) + { + DisableThreadLibraryCalls( hinst ); + init_startup_info( NtCurrentTeb()->Peb->ProcessParameters ); + } + return TRUE; +} + + /************************************************************* * DllMainCRTStartup */ BOOL WINAPI DllMainCRTStartup( HANDLE inst, DWORD reason, LPVOID reserved ) { - return TRUE; + return DllMain( inst, reason, reserved ); } diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c index 72dc5464e9f..7204420e25a 100644 --- a/dlls/kernelbase/process.c +++ b/dlls/kernelbase/process.c @@ -346,6 +346,127 @@ BOOL WINAPI DECLSPEC_HOTPATCH TerminateProcess( HANDLE handle, DWORD exit_code ) } +/*********************************************************************** + * Process startup information + ***********************************************************************/ + + +static STARTUPINFOW startup_infoW; +static char *command_lineA; +static WCHAR *command_lineW; + +/****************************************************************** + * init_startup_info + */ +void init_startup_info( RTL_USER_PROCESS_PARAMETERS *params ) +{ + ANSI_STRING ansi; + + startup_infoW.cb = sizeof(startup_infoW); + startup_infoW.lpReserved = NULL; + startup_infoW.lpDesktop = params->Desktop.Buffer; + startup_infoW.lpTitle = params->WindowTitle.Buffer; + startup_infoW.dwX = params->dwX; + startup_infoW.dwY = params->dwY; + startup_infoW.dwXSize = params->dwXSize; + startup_infoW.dwYSize = params->dwYSize; + startup_infoW.dwXCountChars = params->dwXCountChars; + startup_infoW.dwYCountChars = params->dwYCountChars; + startup_infoW.dwFillAttribute = params->dwFillAttribute; + startup_infoW.dwFlags = params->dwFlags; + startup_infoW.wShowWindow = params->wShowWindow; + startup_infoW.cbReserved2 = params->RuntimeInfo.MaximumLength; + startup_infoW.lpReserved2 = params->RuntimeInfo.MaximumLength ? (void *)params->RuntimeInfo.Buffer : NULL; + startup_infoW.hStdInput = params->hStdInput ? params->hStdInput : INVALID_HANDLE_VALUE; + startup_infoW.hStdOutput = params->hStdOutput ? params->hStdOutput : INVALID_HANDLE_VALUE; + startup_infoW.hStdError = params->hStdError ? params->hStdError : INVALID_HANDLE_VALUE; + + command_lineW = params->CommandLine.Buffer; + if (!RtlUnicodeStringToAnsiString( &ansi, ¶ms->CommandLine, TRUE )) command_lineA = ansi.Buffer; +} + + +/*********************************************************************** + * GetCommandLineA (kernelbase.@) + */ +LPSTR WINAPI DECLSPEC_HOTPATCH GetCommandLineA(void) +{ + return command_lineA; +} + + +/*********************************************************************** + * GetCommandLineW (kernelbase.@) + */ +LPWSTR WINAPI DECLSPEC_HOTPATCH GetCommandLineW(void) +{ + return NtCurrentTeb()->Peb->ProcessParameters->CommandLine.Buffer; +} + + +/*********************************************************************** + * GetStartupInfoW (kernelbase.@) + */ +void WINAPI DECLSPEC_HOTPATCH GetStartupInfoW( STARTUPINFOW *info ) +{ + *info = startup_infoW; +} + + +/*********************************************************************** + * GetStdHandle (kernelbase.@) + */ +HANDLE WINAPI DECLSPEC_HOTPATCH GetStdHandle( DWORD std_handle ) +{ + switch (std_handle) + { + case STD_INPUT_HANDLE: return NtCurrentTeb()->Peb->ProcessParameters->hStdInput; + case STD_OUTPUT_HANDLE: return NtCurrentTeb()->Peb->ProcessParameters->hStdOutput; + case STD_ERROR_HANDLE: return NtCurrentTeb()->Peb->ProcessParameters->hStdError; + } + SetLastError( ERROR_INVALID_HANDLE ); + return INVALID_HANDLE_VALUE; +} + + +/*********************************************************************** + * SetStdHandle (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH SetStdHandle( DWORD std_handle, HANDLE handle ) +{ + switch (std_handle) + { + case STD_INPUT_HANDLE: NtCurrentTeb()->Peb->ProcessParameters->hStdInput = handle; return TRUE; + case STD_OUTPUT_HANDLE: NtCurrentTeb()->Peb->ProcessParameters->hStdOutput = handle; return TRUE; + case STD_ERROR_HANDLE: NtCurrentTeb()->Peb->ProcessParameters->hStdError = handle; return TRUE; + } + SetLastError( ERROR_INVALID_HANDLE ); + return FALSE; +} + + +/*********************************************************************** + * SetStdHandleEx (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH SetStdHandleEx( DWORD std_handle, HANDLE handle, HANDLE *prev ) +{ + HANDLE *ptr; + + switch (std_handle) + { + case STD_INPUT_HANDLE: ptr = &NtCurrentTeb()->Peb->ProcessParameters->hStdInput; break; + case STD_OUTPUT_HANDLE: ptr = &NtCurrentTeb()->Peb->ProcessParameters->hStdOutput; break; + case STD_ERROR_HANDLE: ptr = &NtCurrentTeb()->Peb->ProcessParameters->hStdError; break; + default: + SetLastError( ERROR_INVALID_HANDLE ); + return FALSE; + } + if (prev) *prev = *ptr; + *ptr = handle; + return TRUE; +} + + /*********************************************************************** * Process environment ***********************************************************************/