From 7b87ca19eca8b92a48a146ecd15cc4017fafaf67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sun, 24 Jul 2011 13:22:15 +0000 Subject: [PATCH] [MSVCRT20] - being a full blown crt dll, msvcrt20 needs a correct dllmain entry point svn path=/trunk/; revision=52834 --- reactos/dll/win32/msvcrt20/CMakeLists.txt | 16 ++- reactos/dll/win32/msvcrt20/msvcrt20.c | 134 ++++++++++++++++++++- reactos/dll/win32/msvcrt20/msvcrt20.rbuild | 24 ++-- 3 files changed, 160 insertions(+), 14 deletions(-) diff --git a/reactos/dll/win32/msvcrt20/CMakeLists.txt b/reactos/dll/win32/msvcrt20/CMakeLists.txt index da738da0969..db4d235d7df 100644 --- a/reactos/dll/win32/msvcrt20/CMakeLists.txt +++ b/reactos/dll/win32/msvcrt20/CMakeLists.txt @@ -1,8 +1,15 @@ -include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +add_definitions( + -DUSE_MSVCRT_PREFIX + -D_MSVCRT_ + -D_MSVCRT_LIB_ + -D_MT + -D_CTYPE_DISABLE_MACROS + -D_NO_INLINING + -DCRTDLL + -D__MINGW_IMPORT="") -add_definitions(-D__WINESRC__) -add_definitions(-DCRTDLL) +include_directories(${REACTOS_SOURCE_DIR}/lib/sdk/crt/include) spec2def(msvcrt20.dll msvcrt20.spec) @@ -13,7 +20,8 @@ list(APPEND SOURCE ${CMAKE_CURRENT_BINARY_DIR}/msvcrt20.def) add_library(msvcrt20 SHARED ${SOURCE}) -set_entrypoint(msvcrt20 0) +set_entrypoint(msvcrt20 DllMain@12) +set_image_base(msvcrt20 ${baseaddress_msvcrt20}) target_link_libraries(msvcrt20 crt wine) diff --git a/reactos/dll/win32/msvcrt20/msvcrt20.c b/reactos/dll/win32/msvcrt20/msvcrt20.c index e8d2b3cd378..23875143e09 100644 --- a/reactos/dll/win32/msvcrt20/msvcrt20.c +++ b/reactos/dll/win32/msvcrt20/msvcrt20.c @@ -18,15 +18,143 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#include +#define _CRT_PRECOMP_H +#include +#include +#include +#include +#include +#include -#include "windef.h" +#include "wine/debug.h" +WINE_DEFAULT_DEBUG_CHANNEL(msvcrt); + +/* EXTERNAL PROTOTYPES ********************************************************/ + +extern int BlockEnvToEnvironA(void); +extern int BlockEnvToEnvironW(void); +extern void FreeEnvironment(char **environment); +extern void _atexit_cleanup(void); + +extern unsigned int _osplatform; +extern unsigned int _osver; +extern unsigned int _winminor; +extern unsigned int _winmajor; +extern unsigned int _winver; + +extern char* _acmdln; /* pointer to ascii command line */ +extern wchar_t* _wcmdln; /* pointer to wide character command line */ +#undef _environ +extern char** _environ; /* pointer to environment block */ +extern char** __initenv; /* pointer to initial environment block */ +extern wchar_t** _wenviron; /* pointer to environment block */ +extern wchar_t** __winitenv; /* pointer to initial environment block */ extern void CDECL __getmainargs(int *argc, char** *argv, char** *envp, int expand_wildcards, int *new_mode); extern void CDECL __wgetmainargs(int *argc, WCHAR** *wargv, WCHAR** *wenvp, int expand_wildcards, int *new_mode); +/* LIBRARY GLOBAL VARIABLES ***************************************************/ + +HANDLE hHeap = NULL; /* handle for heap */ + + +/* LIBRARY ENTRY POINT ********************************************************/ + +BOOL +WINAPI +DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved) +{ + OSVERSIONINFOW osvi; + switch (dwReason) + { + case DLL_PROCESS_ATTACH://1 + /* initialize version info */ + //DPRINT1("Process Attach %d\n", nAttachCount); + //DPRINT1("Process Attach\n"); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); + GetVersionExW( &osvi ); + _winver = (osvi.dwMajorVersion << 8) | osvi.dwMinorVersion; + _winmajor = osvi.dwMajorVersion; + _winminor = osvi.dwMinorVersion; + _osplatform = osvi.dwPlatformId; + _osver = osvi.dwBuildNumber; + hHeap = HeapCreate(0, 100000, 0); + if (hHeap == NULL) + return FALSE; + + /* create tls stuff */ + if (!CreateThreadData()) + return FALSE; + + if (BlockEnvToEnvironA() < 0) + return FALSE; + + if (BlockEnvToEnvironW() < 0) + { + FreeEnvironment(_environ); + return FALSE; + } + + _acmdln = _strdup(GetCommandLineA()); + _wcmdln = _wcsdup(GetCommandLineW()); + + /* FIXME: more initializations... */ + + /* Initialization of the WINE code */ + msvcrt_init_mt_locks(); + msvcrt_init_io(); + setlocale(0, "C"); + //_setmbcp(_MB_CP_LOCALE); + + TRACE("Attach done\n"); + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_THREAD_DETACH: + FreeThreadData(NULL); + break; + + case DLL_PROCESS_DETACH: + //DPRINT1("Detach %d\n", nAttachCount); + //DPRINT("Detach\n"); + /* FIXME: more cleanup... */ + /* Deinit of the WINE code */ + msvcrt_free_io(); + msvcrt_free_mt_locks(); + + _atexit_cleanup(); + + + /* destroy tls stuff */ + DestroyThreadData(); + + if (__winitenv && __winitenv != _wenviron) + FreeEnvironment((char**)__winitenv); + if (_wenviron) + FreeEnvironment((char**)_wenviron); + + if (__initenv && __initenv != _environ) + FreeEnvironment(__initenv); + if (_environ) + FreeEnvironment(_environ); + + /* destroy heap */ + HeapDestroy(hHeap); + + TRACE("Detach done\n"); + break; + } + + return TRUE; +} + +/* LIBRARY EXPORTS ************************************************************/ + /********************************************************************* * __getmainargs (MSVCRT20.@) * @@ -48,3 +176,5 @@ void CDECL MSVCRT20__wgetmainargs( int *argc, WCHAR** *wargv, WCHAR** *wenvp, { __wgetmainargs( argc, wargv, wenvp, expand_wildcards, &new_mode ); } + +/* EOF */ \ No newline at end of file diff --git a/reactos/dll/win32/msvcrt20/msvcrt20.rbuild b/reactos/dll/win32/msvcrt20/msvcrt20.rbuild index 73aabd43b3c..519c7b956d2 100644 --- a/reactos/dll/win32/msvcrt20/msvcrt20.rbuild +++ b/reactos/dll/win32/msvcrt20/msvcrt20.rbuild @@ -1,16 +1,24 @@ - - - . - include/reactos/wine - + + + . + include + + + + + + - msvcrt20.c + msvcrt20.c stubs.c - wine + wine crt pseh - +