/********************************************************************** * main */ int main( int argc, char *argv[] ) { char error[1024]; int i; init_thread_hook(); if (!getenv( "WINELOADERNOEXEC" )) /* first time around */ { static char noexec[] = "WINELOADERNOEXEC=1"; putenv( noexec ); check_command_line( argc, argv ); if (pre_exec()) { wine_init_argv0_path( argv[0] ); wine_exec_wine_binary( NULL, argv, getenv( "WINELOADER" )); fprintf( stderr, "wine: could not exec the wine loader\n" ); exit(1); } } #ifndef __APPLE__ if (wine_main_preload_info) #endif { for (i = 0; wine_main_preload_info[i].size; i++) reserve_area( wine_main_preload_info[i].addr, wine_main_preload_info[i].size ); } wine_init( argc, argv, error, sizeof(error) ); fprintf( stderr, "wine: failed to initialize: %s\n", error ); exit(1); }
/*********************************************************************** * wine_init * * Main Wine initialisation. */ void wine_init( int argc, char *argv[], char *error, int error_size ) { struct dll_path_context context; char *path; void *ntdll = NULL; void (*init_func)(void); /* force a few limits that are set too low on some platforms */ #ifdef RLIMIT_NOFILE set_max_limit( RLIMIT_NOFILE ); #endif #ifdef RLIMIT_AS set_max_limit( RLIMIT_AS ); #endif wine_init_argv0_path( argv[0] ); build_dll_path(); __wine_main_argc = argc; __wine_main_argv = argv; __wine_main_environ = environ; mmap_init(); for (path = first_dll_path( "ntdll.dll", 0, &context ); path; path = next_dll_path( &context )) { if ((ntdll = wine_dlopen( path, RTLD_NOW, error, error_size ))) { /* if we didn't use the default dll dir, remove it from the search path */ if (default_dlldir[0] && context.index < nb_dll_paths + 2) nb_dll_paths--; break; } } free_dll_path( &context ); if (!ntdll) return; if (!(init_func = wine_dlsym( ntdll, "__wine_process_init", error, error_size ))) return; init_func(); }