// // D_AddCmdParameterFiles // Add the files specified with -file, do this only when it first loads // void D_AddCmdParameterFiles(void) { modifiedgame = false; DArgs files = Args.GatherFiles ("-file", ".wad", true); if (files.NumArgs() > 0) { // the files gathered are wadfile/lump names modifiedgame = true; // homebrew levels for (size_t i = 0; i < files.NumArgs(); i++) { std::string file = BaseFileSearch (files.GetArg (i), ".WAD"); if (file.length()) wadfiles.push_back(file); } } }
DArgs DArgs::GatherFiles (const char *param, const char *extension, bool acceptNoExt) const { DArgs out; size_t i; unsigned extlen = strlen (extension); for (i = 1; i < args.size() && args[i].length() && args[i][0] != '-' && args[i][0] != '+'; i++) { if (args[i].length() >= extlen && stricmp (args[i].c_str() + args[i].length() - extlen, extension) == 0) out.AppendArg (args[i].c_str()); else if (acceptNoExt && !strrchr (args[i].c_str(), '.')) out.AppendArg (args[i].c_str()); } i = CheckParm (param); if (i) { for (i++; i < args.size() && args[i].length() && args[i][0] != '-' && args[i][0] != '+'; i++) out.AppendArg (args[i].c_str()); } return out; }
int __cdecl main(int argc, char *argv[]) { try { // Handle ctrl-c, close box, shutdown and logoff events if (!SetConsoleCtrlHandler(ConsoleHandlerRoutine, TRUE)) throw CDoomError("Could not set console control handler!\n"); if (!(hEvent = CreateEvent(NULL, FALSE, FALSE, NULL))) throw CDoomError("Could not create console control event!\n"); // [ML] 2007/9/3: From Eternity (originally chocolate Doom) Thanks SoM & fraggle! Args.SetArgs (argc, argv); const char *CON_FILE = Args.CheckValue("-confile"); if(CON_FILE)CON.open(CON_FILE, std::ios::in); // Set the timer to be as accurate as possible TIMECAPS tc; if (timeGetDevCaps (&tc, sizeof(tc) != TIMERR_NOERROR)) TimerPeriod = 1; // Assume minimum resolution of 1 ms else TimerPeriod = tc.wPeriodMin; timeBeginPeriod (TimerPeriod); // Don't call this on windows! //atexit (call_terms); Z_Init(); atterm (I_Quit); atterm (DObject::StaticShutdown); progdir = I_GetBinaryDir(); startdir = I_GetCWD(); C_InitConsole (80*8, 25*8, false); D_DoomMain (); } catch (CDoomError &error) { if (LOG.is_open()) { LOG << error.GetMessage() << std::endl; LOG << std::endl; } else { MessageBox(NULL, error.GetMessage().c_str(), "Odasrv Error", MB_OK); } exit (-1); } catch (...) { call_terms (); throw; } return 0; }
int main (int argc, char **argv) { try { if(!getuid() || !geteuid()) I_FatalError("root user detected, quitting odamex immediately"); seteuid (getuid ()); Args.SetArgs (argc, argv); const char *CON_FILE = Args.CheckValue("-confile"); if(CON_FILE)CON.open(CON_FILE, std::ios::in); /* killough 1/98: This fixes some problems with exit handling during abnormal situations. The old code called I_Quit() to end program, while now I_Quit() is installed as an exit handler and exit() is called to exit, either normally or abnormally. Seg faults are caught and the error handler is used, to prevent being left in graphics mode or having very loud SFX noise because the sound card is left in an unstable state. */ // Don't use this on other platforms either //atexit (call_terms); Z_Init(); // 1/18/98 killough: start up memory stuff first atterm (I_Quit); atterm (DObject::StaticShutdown); signal(SIGSEGV, handler); signal(SIGTERM, handler); signal(SIGILL, handler); signal(SIGFPE, handler); signal(SIGINT, handler); // killough 3/6/98: allow CTRL-BRK during init signal(SIGABRT, handler); progdir = I_GetBinaryDir(); C_InitConsole (80*8, 25*8, false); D_DoomMain (); } catch (CDoomError &error) { fprintf (stderr, "%s\n", error.GetMessage().c_str()); if (LOG.is_open()) { LOG << error.GetMessage() << std::endl; LOG << std::endl; } call_terms(); exit (-1); } catch (...) { call_terms (); throw; } return 0; }
// // D_DoDefDehackedPatch // // [Russell] - Change the meaning, this will load multiple patch files if // specified void D_DoDefDehackedPatch (const std::vector<std::string> patch_files = std::vector<std::string>()) { DArgs files; BOOL noDef = false; QWORD i; if (!patch_files.empty()) { std::string f; std::string ext; // we want the extension of the file for (i = 0; i < patch_files.size(); i++) { if (M_ExtractFileExtension(patch_files[i], ext)) { f = BaseFileSearch (patch_files[i], ext); if (f.length()) { if (DoDehPatch (f.c_str(), false)) { std::string Filename; M_ExtractFileName(f, Filename); patchfiles.push_back(Filename); } noDef = true; } } } } else // [Russell] - Only load if patch_files is empty { // try .deh files on command line files = Args.GatherFiles ("-deh", ".deh", false); if (files.NumArgs()) { for (i = 0; i < files.NumArgs(); i++) { std::string f = BaseFileSearch (files.GetArg (i), ".DEH"); if (f.length()) { if (DoDehPatch (f.c_str(), false)) { std::string Filename; M_ExtractFileName(f, Filename); patchfiles.push_back(Filename); } } } noDef = true; } // remove the old arguments files.FlushArgs(); // try .bex files on command line files = Args.GatherFiles ("-bex", ".bex", false); if (files.NumArgs()) { for (i = 0; i < files.NumArgs(); i++) { std::string f = BaseFileSearch (files.GetArg (i), ".BEX"); if (f.length()) { if (DoDehPatch (f.c_str(), false)) { std::string Filename; M_ExtractFileName(f, Filename); patchfiles.push_back(Filename); } } } noDef = true; } } // try default patches if (!noDef) DoDehPatch (NULL, true); // See if there's a patch in a PWAD }
void D_DoomMain (void) { M_ClearRandom(); gamestate = GS_STARTUP; if (lzo_init () != LZO_E_OK) // [RH] Initialize the minilzo package. I_FatalError ("Could not initialize LZO routines"); C_ExecCmdLineParams (false, true); // [Nes] test for +logfile command I_Init (); D_CheckNetGame (); M_LoadDefaults (); // load before initing other systems M_FindResponseFile(); // [ML] 23/1/07 - Add Response file support back in C_ExecCmdLineParams (true, false); // [RH] do all +set commands on the command line //D_AddDefWads(); //SV_InitMultipleFiles (wadfiles); //wadhashes = W_InitMultipleFiles (wadfiles); // Base systems have been inited; enable cvar callbacks cvar_t::EnableCallbacks (); // [RH] Initialize configurable strings. D_InitStrings (); // [RH] User-configurable startup strings. Because BOOM does. if (STARTUP1[0]) Printf (PRINT_HIGH, "%s\n", STARTUP1); if (STARTUP2[0]) Printf (PRINT_HIGH, "%s\n", STARTUP2); if (STARTUP3[0]) Printf (PRINT_HIGH, "%s\n", STARTUP3); if (STARTUP4[0]) Printf (PRINT_HIGH, "%s\n", STARTUP4); if (STARTUP5[0]) Printf (PRINT_HIGH, "%s\n", STARTUP5); devparm = Args.CheckParm ("-devparm"); // get skill / episode / map from parms strcpy (startmap, (gameinfo.flags & GI_MAPxx) ? "MAP01" : "E1M1"); const char *val = Args.CheckValue ("-skill"); if (val) { skill.Set (val[0]-'0'); } unsigned p = Args.CheckParm ("-warp"); if (p && p < Args.NumArgs() - (1+(gameinfo.flags & GI_MAPxx ? 0 : 1))) { int ep, map; if (gameinfo.flags & GI_MAPxx) { ep = 1; map = atoi (Args.GetArg(p+1)); } else { ep = Args.GetArg(p+1)[0]-'0'; map = Args.GetArg(p+2)[0]-'0'; } strncpy (startmap, CalcMapName (ep, map), 8); autostart = true; } // [RH] Hack to handle +map p = Args.CheckParm ("+map"); if (p && p < Args.NumArgs()-1) { strncpy (startmap, Args.GetArg (p+1), 8); ((char *)Args.GetArg (p))[0] = '-'; autostart = true; } if (devparm) Printf (PRINT_HIGH, "%s", Strings[0].builtin); // D_DEVSTR const char *v = Args.CheckValue ("-timer"); if (v) { double time = atof (v); Printf (PRINT_HIGH, "Levels will end after %g minute%s.\n", time, time > 1 ? "s" : ""); timelimit.Set ((float)time); } const char *w = Args.CheckValue ("-avg"); if (w) { Printf (PRINT_HIGH, "Austin Virtual Gaming: Levels will end after 20 minutes\n"); timelimit.Set (20); } // Check for -file in shareware if (modifiedgame && (gameinfo.flags & GI_SHAREWARE)) I_FatalError ("You cannot -file with the shareware version. Register!"); // [RH] Initialize items. Still only used for the give command. :-( InitItems (); // [RH] Lock any cvars that should be locked now that we're // about to begin the game. cvar_t::EnableNoSet (); Printf(PRINT_HIGH, "========== Odamex Server Initialized ==========\n"); #ifdef UNIX if (Args.CheckParm("-background")) daemon_init(); #endif // Use wads mentioned on the commandline to start with std::vector<std::string> start_wads; std::string custwad; const char *iwadparm = Args.CheckValue ("-iwad"); if (iwadparm) { custwad = iwadparm; FixPathSeparator (custwad); start_wads.push_back(custwad); } DArgs files = Args.GatherFiles ("-file", ".wad", true); if (files.NumArgs() > 0) { modifiedgame = true; for (size_t i = 0; i < files.NumArgs(); i++) { start_wads.push_back(files.GetArg (i)); } } D_DoomWadReboot(start_wads); // [RH] Now that all game subsystems have been initialized, // do all commands on the command line other than +set C_ExecCmdLineParams (false, false); strncpy(level.mapname, startmap, sizeof(level.mapname)); gamestate = GS_STARTUP; G_ChangeMap (); D_DoomLoop (); // never returns }
// // D_DoDefDehackedPatch // // [Russell] - Change the meaning, this will load multiple patch files if // specified void D_DoDefDehackedPatch (const std::vector<std::string> patch_files = std::vector<std::string>()) { DArgs files; BOOL noDef = false; BOOL chexLoaded = false; QWORD i; if (!patch_files.empty()) { std::string f; std::string ext; // we want the extension of the file for (i = 0; i < patch_files.size(); i++) { if (M_ExtractFileExtension(patch_files[i], ext)) { f = BaseFileSearch (patch_files[i], ext); if (f.length()) { DoDehPatch (f.c_str(), false); noDef = true; } } } } else // [Russell] - Only load if patch_files is empty { // try .deh files on command line files = Args.GatherFiles ("-deh", ".deh", false); if (files.NumArgs()) { for (i = 0; i < files.NumArgs(); i++) { std::string f = BaseFileSearch (files.GetArg (i), ".DEH"); if (f.length()) { DoDehPatch (f.c_str(), false); if (!strncmp(files.GetArg (i),"chex.deh",8)) chexLoaded = true; } } noDef = true; } if (gamemode == retail_chex && !multiplayer && !chexLoaded) Printf(PRINT_HIGH,"Warning: chex.deh not loaded, experience may differ from the original!\n"); // remove the old arguments files.FlushArgs(); // try .bex files on command line files = Args.GatherFiles ("-bex", ".bex", false); if (files.NumArgs()) { for (i = 0; i < files.NumArgs(); i++) { std::string f = BaseFileSearch (files.GetArg (i), ".BEX"); if (f.length()) DoDehPatch (f.c_str(), false); } noDef = true; } } // try default patches if (!noDef) DoDehPatch (NULL, true); // See if there's a patch in a PWAD }
int __cdecl main(int argc, char *argv[]) { try { Args.SetArgs (argc, argv); LOG_FILE = Args.CheckValue("-logfile"); if(!LOG_FILE)LOG_FILE = "odamex.log"; LOG.open(LOG_FILE, std::ios::out); if (!LOG.is_open()) cerr << "Unable to create logfile: %s" << endl; const char *CON_FILE = Args.CheckValue("-confile"); if(CON_FILE)CON.open(CON_FILE, std::ios::in); // Set the timer to be as accurate as possible TIMECAPS tc; if (timeGetDevCaps (&tc, sizeof(tc) != TIMERR_NOERROR)) TimerPeriod = 1; // Assume minimum resolution of 1 ms else TimerPeriod = tc.wPeriodMin; timeBeginPeriod (TimerPeriod); atexit (call_terms); Z_Init(); atterm (I_Quit); atterm (DObject::StaticShutdown); progdir = I_GetBinaryDir(); startdir = I_GetCWD(); C_InitConsole (80*8, 25*8, false); Printf (PRINT_HIGH, "Heapsize: %u megabytes\n", got_heapsize); D_DoomMain (); } catch (CDoomError &error) { if (LOG.is_open()) { LOG << error.GetMessage() << std::endl; } else { MessageBox(NULL, error.GetMessage().c_str(), "Odasrv Error", MB_OK); } exit (-1); } catch (...) { call_terms (); throw; } return 0; }
void M_FindResponseFile (void) { const int limit = 100; // avoid infinite recursion int added_stuff = 0; int i = 1; while (i < Args->NumArgs()) { if (Args->GetArg(i)[0] != '@') { i++; } else { char **argv; char *file = NULL; int argc = 0; FILE *handle; int size; long argsize = 0; int index; // Any more response files after the limit will be removed from the // command line. if (added_stuff < limit) { // READ THE RESPONSE FILE INTO MEMORY handle = fopen (Args->GetArg(i) + 1,"rb"); if (!handle) { // [RH] Make this a warning, not an error. Printf ("No such response file (%s)!\n", Args->GetArg(i) + 1); } else { Printf ("Found response file %s!\n", Args->GetArg(i) + 1); fseek (handle, 0, SEEK_END); size = ftell (handle); fseek (handle, 0, SEEK_SET); file = new char[size+1]; fread (file, size, 1, handle); file[size] = 0; fclose (handle); argsize = ParseCommandLine (file, &argc, NULL); } } else { Printf ("Ignored response file %s.\n", Args->GetArg(i) + 1); } if (argc != 0) { argv = (char **)M_Malloc (argc*sizeof(char *) + argsize); argv[0] = (char *)argv + argc*sizeof(char *); ParseCommandLine (file, NULL, argv); // Create a new argument vector DArgs *newargs = new DArgs; // Copy parameters before response file. for (index = 0; index < i; ++index) newargs->AppendArg(Args->GetArg(index)); // Copy parameters from response file. for (index = 0; index < argc; ++index) newargs->AppendArg(argv[index]); // Copy parameters after response file. for (index = i + 1; index < Args->NumArgs(); ++index) newargs->AppendArg(Args->GetArg(index)); // Use the new argument vector as the global Args object. Args = newargs; if (++added_stuff == limit) { Printf("Response file limit of %d hit.\n", limit); } } else { // Remove the response file from the Args object Args->RemoveArg(i); } if (file != NULL) { delete[] file; } } } if (added_stuff > 0) { // DISPLAY ARGS Printf ("Added %d response file%s, now have %d command-line args:\n", added_stuff, added_stuff > 1 ? "s" : "", Args->NumArgs ()); for (int k = 1; k < Args->NumArgs (); k++) Printf ("%s\n", Args->GetArg (k)); } }
int main(int argc, char *argv[]) #endif { try { #if defined(UNIX) && !defined(GEKKO) if(!getuid() || !geteuid()) I_FatalError("root user detected, quitting odamex immediately"); #endif // [ML] 2007/9/3: From Eternity (originally chocolate Doom) Thanks SoM & fraggle! Args.SetArgs (argc, argv); const char *CON_FILE = Args.CheckValue("-confile"); if(CON_FILE)CON.open(CON_FILE, std::ios::in); // denis - if argv[1] starts with "odamex://" if(argc == 2 && argv && argv[1]) { const char *protocol = "odamex://"; const char *uri = argv[1]; if(strncmp(uri, protocol, strlen(protocol)) == 0) { std::string location = uri + strlen(protocol); size_t term = location.find_first_of('/'); if(term == std::string::npos) term = location.length(); Args.AppendArg("-connect"); Args.AppendArg(location.substr(0, term).c_str()); } } // [Russell] - No more double-tapping of capslock to enable autorun putenv("SDL_DISABLE_LOCK_KEYS=1"); #if defined WIN32 && !defined _XBOX // From the SDL 1.2.10 release notes: // // > The "windib" video driver is the default now, to prevent // > problems with certain laptops, 64-bit Windows, and Windows // > Vista. // // The hell with that. // SoM: the gdi interface is much faster for windowed modes which are more // commonly used. Thus, GDI is default. // // GDI mouse issues fill many users with great sadness. We are going back // to directx as defulat for now and the people will rejoice. --Hyper_Eye if (Args.CheckParm ("-gdi")) putenv("SDL_VIDEODRIVER=windib"); else if (getenv("SDL_VIDEODRIVER") == NULL || Args.CheckParm ("-directx") > 0) putenv("SDL_VIDEODRIVER=directx"); // Set the process affinity mask to 1 on Windows, so that all threads // run on the same processor. This is a workaround for a bug in // SDL_mixer that causes occasional crashes. Thanks to entryway and fraggle for this. // // [ML] 8/6/10: Updated to match prboom+'s I_SetAffinityMask. We don't do everything // you might find in there but we do enough for now. HMODULE kernel32_dll = LoadLibrary("kernel32.dll"); if (kernel32_dll) { SetAffinityFunc SetAffinity = (SetAffinityFunc)GetProcAddress(kernel32_dll, "SetProcessAffinityMask"); if (SetAffinity) { if (!SetAffinity(GetCurrentProcess(), 1)) LOG << "Failed to set process affinity mask: " << GetLastError() << std::endl; } } #endif if (SDL_Init (SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE) == -1) I_FatalError("Could not initialize SDL:\n%s\n", SDL_GetError()); atterm (SDL_Quit); /* killough 1/98: This fixes some problems with exit handling during abnormal situations. The old code called I_Quit() to end program, while now I_Quit() is installed as an exit handler and exit() is called to exit, either normally or abnormally. */ atexit (call_terms); Z_Init (); // 1/18/98 killough: start up memory stuff first atterm (R_Shutdown); atterm (I_Quit); atterm (DObject::StaticShutdown); // Figure out what directory the program resides in. progdir = I_GetBinaryDir(); startdir = I_GetCWD(); // init console C_InitConsole (80 * 8, 25 * 8, false); D_DoomMain (); } catch (CDoomError &error) { if (LOG.is_open()) { LOG << error.GetMessage() << std::endl; LOG << std::endl; } #ifndef WIN32 fprintf(stderr, "%s\n", error.GetMessage().c_str()); #elif _XBOX // Use future Xbox error message handling. -- Hyper_Eye #else MessageBox(NULL, error.GetMessage().c_str(), "Odamex Error", MB_OK); #endif exit (-1); } #ifndef _DEBUG catch (...) { // If an exception is thrown, be sure to do a proper shutdown. // This is especially important if we are in fullscreen mode, // because the OS will only show the alert box if we are in // windowed mode. Graphics gets shut down first in case something // goes wrong calling the cleanup functions. call_terms (); // Now let somebody who understands the exception deal with it. throw; } #endif return 0; }
int main (int argc, char **argv) { { int s[4] = { SIGSEGV, SIGILL, SIGFPE, SIGBUS }; cc_install_handlers(4, s, "zdoom-crash.log", DoomSpecificInfo); } seteuid (getuid ()); std::set_new_handler (NewFailure); if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE) == -1) { fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError()); return -1; } atterm (SDL_Quit); SDL_WM_SetCaption (GAMESIG " " DOTVERSIONSTR " (" __DATE__ ")", NULL); try { Args.SetArgs (argc, argv); /* killough 1/98: This fixes some problems with exit handling during abnormal situations. The old code called I_Quit() to end program, while now I_Quit() is installed as an exit handler and exit() is called to exit, either normally or abnormally. Seg faults are caught and the error handler is used, to prevent being left in graphics mode or having very loud SFX noise because the sound card is left in an unstable state. */ atexit (call_terms); atterm (I_Quit); if (realpath (argv[0], progdir) == NULL) strcpy (progdir, argv[0]); char *slash = strrchr (progdir, '/'); if (slash) *(slash + 1) = '\0'; else progdir[0] = '.', progdir[1] = '/', progdir[2] = '\0'; C_InitConsole (80*8, 25*8, false); D_DoomMain (); } catch (class CDoomError &error) { if (error.GetMessage ()) fprintf (stderr, "%s\n", error.GetMessage ()); exit (-1); } catch (...) { call_terms (); throw; } return 0; }
void DoMain (HINSTANCE hInstance) { LONG WinWidth, WinHeight; int height, width; RECT cRect; TIMECAPS tc; try { #ifdef _MSC_VER _set_new_handler (NewFailure); #endif Args.SetArgs (__argc, __argv); // Under XP, get our session ID so we can know when the user changes/locks sessions. // Since we need to remain binary compatible with older versions of Windows, we // need to extract the ProcessIdToSessionId function from kernel32.dll manually. HMODULE kernel = GetModuleHandle ("kernel32.dll"); // NASM does not support creating writeable code sections (even though this // is a perfectly valid configuration for Microsoft's COFF format), so I // need to make the self-modifying code writeable after it's already loaded. #ifdef USEASM { BYTE *module = (BYTE *)GetModuleHandle (NULL); IMAGE_DOS_HEADER *dosHeader = (IMAGE_DOS_HEADER *)module; IMAGE_NT_HEADERS *ntHeaders = (IMAGE_NT_HEADERS *)(module + dosHeader->e_lfanew); IMAGE_SECTION_HEADER *sections = IMAGE_FIRST_SECTION (ntHeaders); int i; LPVOID *start = NULL; SIZE_T size = 0; DWORD oldprotect; for (i = 0; i < ntHeaders->FileHeader.NumberOfSections; ++i) { if (memcmp (sections[i].Name, ".rtext\0", 8) == 0) { start = (LPVOID *)(sections[i].VirtualAddress + module); size = sections[i].Misc.VirtualSize; break; } } // I think these pages need to be mapped PAGE_EXECUTE_WRITECOPY (based on the // description of PAGE_WRITECOPY), but PAGE_EXECUTE_READWRITE seems to work // just as well; two instances of the program can be running with different // resolutions at the same time either way. Perhaps the file mappings for // executables are created with PAGE_WRITECOPY, so any attempts to give them // write access are automatically transformed to copy-on-write? // // This used to be PAGE_EXECUTE_WRITECOPY until Timmie found out Win9x doesn't // support it, although the MSDN does not indicate it. if (!VirtualProtect (start, size, PAGE_EXECUTE_READWRITE, &oldprotect)) { I_FatalError ("The self-modifying code section code not be made writeable."); } } #endif // Set the timer to be as accurate as possible if (timeGetDevCaps (&tc, sizeof(tc)) != TIMERR_NOERROR) TimerPeriod = 1; // Assume minimum resolution of 1 ms else TimerPeriod = tc.wPeriodMin; timeBeginPeriod (TimerPeriod); /* killough 1/98: This fixes some problems with exit handling during abnormal situations. The old code called I_Quit() to end program, while now I_Quit() is installed as an exit handler and exit() is called to exit, either normally or abnormally. */ atexit (call_terms); atterm (I_Quit); // Figure out what directory the program resides in. GetModuleFileName (NULL, progdir, 1024); *(strrchr (progdir, '\\') + 1) = 0; FixPathSeperator (progdir); // [BC] When hosting, spawn a console dialog box instead of creating a window. if ( Args.CheckParm( "-host" )) { // This never returns. DialogBox( g_hInst, MAKEINTRESOURCE( IDD_SERVERDIALOG ), NULL/*(HWND)Window*/, SERVERCONSOLE_ServerDialogBoxCallback ); } else { height = GetSystemMetrics (SM_CYFIXEDFRAME) * 2 + GetSystemMetrics (SM_CYCAPTION) + 12 * 32; width = GetSystemMetrics (SM_CXFIXEDFRAME) * 2 + 8 * 78; TheInvisibleCursor = LoadCursor (hInstance, MAKEINTRESOURCE(IDC_INVISIBLECURSOR)); TheArrowCursor = LoadCursor (NULL, IDC_ARROW); WndClass.style = 0; WndClass.lpfnWndProc = WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = hInstance; WndClass.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_ICON5)); WndClass.hCursor = TheArrowCursor; WndClass.hbrBackground = NULL; WndClass.lpszMenuName = NULL; WndClass.lpszClassName = (LPCTSTR)WinClassName; /* register this new class with Windows */ if (!RegisterClass((LPWNDCLASS)&WndClass)) I_FatalError ("Could not register window class"); /* create window */ Window = CreateWindow((LPCTSTR)WinClassName, (LPCTSTR) GAMESIG " v" DOTVERSIONSTR " (" __DATE__ ")", WS_OVERLAPPEDWINDOW, 0/*CW_USEDEFAULT*/, 1/*CW_USEDEFAULT*/, width, height, (HWND) NULL, (HMENU) NULL, hInstance, NULL); if (!Window) I_FatalError ("Could not open window"); WndClass.lpfnWndProc = LConProc; WndClass.lpszClassName = (LPCTSTR)ConClassName; if (RegisterClass ((LPWNDCLASS)&WndClass)) { ConWindow = CreateWindowEx ( WS_EX_PALETTEWINDOW & (~WS_EX_TOPMOST), (LPCTSTR)ConClassName, (LPCTSTR) "Skulltag Startup Viewer", WS_OVERLAPPEDWINDOW/* | WS_VISIBLE*/, CW_USEDEFAULT, CW_USEDEFAULT, 512, 384, Window, NULL, hInstance, NULL); } if (kernel != 0) { typedef BOOL (WINAPI *pts)(DWORD, DWORD *); pts pidsid = (pts)GetProcAddress (kernel, "ProcessIdToSessionId"); if (pidsid != 0) { if (!pidsid (GetCurrentProcessId(), &SessionID)) { SessionID = 0; } hwtsapi32 = LoadLibraryA ("wtsapi32.dll"); if (hwtsapi32 != 0) { FARPROC reg = GetProcAddress (hwtsapi32, "WTSRegisterSessionNotification"); if (reg == 0 || !((BOOL(WINAPI *)(HWND, DWORD))reg) (Window, NOTIFY_FOR_THIS_SESSION)) { FreeLibrary (hwtsapi32); hwtsapi32 = 0; } else { atterm (UnWTS); } } } } GetClientRect (Window, &cRect); WinWidth = cRect.right; WinHeight = cRect.bottom; } CoInitialize (NULL); atterm (UnCOM); C_InitConsole (((WinWidth / 8) + 2) * 8, (WinHeight / 12) * 8, false); I_DetectOS (); D_DoomMain (); } catch (class CDoomError &error) { I_ShutdownHardware (); SetWindowPos (Window, NULL, 0, 0, 0, 0, SWP_HIDEWINDOW); if (ConWindow != NULL) { ShowWindow (ConWindow, SW_SHOW); } if (error.GetMessage ()) MessageBox (Window, error.GetMessage(), "Skulltag Fatal Error", MB_OK|MB_ICONSTOP|MB_TASKMODAL); exit (-1); } }
int main(int argc, char *argv[]) { try { #ifdef UNIX if(!getuid() || !geteuid()) I_FatalError("root user detected, quitting odamex immediately"); #endif // [ML] 2007/9/3: From Eternity (originally chocolate Doom) Thanks SoM & fraggle! Args.SetArgs (argc, argv); LOG_FILE = Args.CheckValue("-logfile"); if(!LOG_FILE)LOG_FILE = "odamex.log"; LOG.open(LOG_FILE, std::ios::out); if (!LOG.is_open()) std::cerr << "Unable to create logfile: %s\n" << std::endl; const char *CON_FILE = Args.CheckValue("-confile"); if(CON_FILE)CON.open(CON_FILE, std::ios::in); // denis - if argv[1] starts with "odamex://" if(argc == 2 && argv && argv[1]) { const char *protocol = "odamex://"; const char *uri = argv[1]; if(strncmp(uri, protocol, strlen(protocol)) == 0) { std::string location = uri + strlen(protocol); size_t term = location.find_first_of('/'); if(term == std::string::npos) term = location.length(); Args.AppendArg("-connect"); Args.AppendArg(location.substr(0, term).c_str()); } } #ifdef WIN32 // From the SDL 1.2.10 release notes: // // > The "windib" video driver is the default now, to prevent // > problems with certain laptops, 64-bit Windows, and Windows // > Vista. // // The hell with that. // SoM: the gdi interface is much faster for windowed modes which are more // commonly used. Thus, GDI is default. if (Args.CheckParm ("-directx")) putenv("SDL_VIDEODRIVER=directx"); else if (getenv("SDL_VIDEODRIVER") == NULL || Args.CheckParm ("-gdi") > 0) putenv("SDL_VIDEODRIVER=windib"); // Set the process affinity mask to 1 on Windows, so that all threads // run on the same processor. This is a workaround for a bug in // SDL_mixer that causes occasional crashes. // Thanks to entryway and fraggle for this. if (!SetProcessAffinityMask(GetCurrentProcess(), 1)) LOG << "Failed to set process affinity mask: " << GetLastError() << std::endl; #endif if (SDL_Init (SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE) == -1) I_FatalError("Could not initialize SDL:\n%s\n", SDL_GetError()); atterm (SDL_Quit); /* killough 1/98: This fixes some problems with exit handling during abnormal situations. The old code called I_Quit() to end program, while now I_Quit() is installed as an exit handler and exit() is called to exit, either normally or abnormally. */ atexit (call_terms); Z_Init (); // 1/18/98 killough: start up memory stuff first atterm (I_Quit); atterm (DObject::StaticShutdown); // Figure out what directory the program resides in. progdir = I_GetBinaryDir(); startdir = I_GetCWD(); // init console C_InitConsole (80 * 8, 25 * 8, false); Printf (PRINT_HIGH, "Heapsize: %u megabytes\n", got_heapsize); D_DoomMain (); } catch (CDoomError &error) { if (LOG.is_open()) { LOG << error.GetMessage() << std::endl; } #ifndef WIN32 fprintf(stderr, "%s\n", error.GetMessage().c_str()); #else MessageBox(NULL, error.GetMessage().c_str(), "Odamex Error", MB_OK); #endif exit (-1); } #ifndef _DEBUG catch (...) { // If an exception is thrown, be sure to do a proper shutdown. // This is especially important if we are in fullscreen mode, // because the OS will only show the alert box if we are in // windowed mode. Graphics gets shut down first in case something // goes wrong calling the cleanup functions. call_terms (); // Now let somebody who understands the exception deal with it. throw; } #endif return 0; }