void TMainDlg::WriteErrLogNoUI(const char *msg) { EnableErrLogFile(TRUE); WriteLogHeader(hErrLog); DWORD len, size; len = (DWORD)strlen(msg); ::WriteFile(hErrLog, msg, len, &size, 0); ::WriteFile(hErrLog, "\r\n\r\n", 4, &size, 0); if (::AttachConsole(ATTACH_PARENT_PROCESS)) { HANDLE hStdErr = GetStdHandle(STD_ERROR_HANDLE); Wstr wmsg(msg); ::WriteConsoleW(hStdErr, L"FastCopy: ", 10, &size, 0); ::WriteConsoleW(hStdErr, wmsg.s(), (DWORD)wcslen(wmsg.s()), &size, 0); ::WriteConsoleW(hStdErr, L"\r\n\r\n", 4, &size, 0); } EnableErrLogFile(FALSE); }
void TMainDlg::WriteErrLogAtStart() { EnableErrLogFile(TRUE); ::GetLocalTime(&startTm); WriteLogHeader(hErrLog); if (!errBufOffset) { if (!ti.errBuf) { ti.errBuf = fastCopy.GetErrBuf(); errBufOffset = (int)ti.errBuf->UsedSize(); } if (errBufOffset) { WriteErrLogCore(); } char *msg = "Initialize Error\r\n\r\n"; DWORD len = (DWORD)strlen(msg); ::WriteFile(hErrLog, msg, len, &len, 0); } EnableErrLogFile(FALSE); }
int main(int argc, char* argv[]) #endif { #ifdef _XBOX int argc = 1; char *argv[] = {"default.xbe"}; #endif g_argc = argc; g_argv = argv; /* Set up arch hooks first. This may set up crash handling. */ HOOKS = MakeArchHooks(); CString g_sErrorString = ""; #if !defined(DEBUG) /* Always catch RageExceptions; they should always have distinct strings. */ try { /* RageException */ /* Tricky: for other exceptions, we want a backtrace. To do this in Windows, * we need to catch the exception and force a crash. The call stack is still * there, and gets picked up by the crash handler. (If we don't catch it, we'll * get a generic, useless "abnormal termination" dialog.) In Linux, if we do this * we'll only get main() on the stack, but if we don't catch the exception, it'll * just work. So, only catch generic exceptions in Windows. */ #if defined(_WINDOWS) try { /* exception */ #endif #endif /* Almost everything uses this to read and write files. Load this early. */ FILEMAN = new RageFileManager( argv[0] ); FILEMAN->MountInitialFilesystems(); /* Set this up next. Do this early, since it's needed for RageException::Throw. */ LOG = new RageLog(); /* Whew--we should be able to crash safely now! */ // // load preferences and mount any alternative trees. // PREFSMAN = new PrefsManager; ApplyLogPreferences(); WriteLogHeader(); /* Set up alternative filesystem trees. */ if( PREFSMAN->m_sAdditionalFolders != "" ) { CStringArray dirs; split( PREFSMAN->m_sAdditionalFolders, ",", dirs, true ); for( unsigned i=0; i < dirs.size(); i++) FILEMAN->Mount( "dir", dirs[i], "" ); } if( PREFSMAN->m_sAdditionalSongFolders != "" ) { CStringArray dirs; split( PREFSMAN->m_sAdditionalSongFolders, ",", dirs, true ); for( unsigned i=0; i < dirs.size(); i++) FILEMAN->Mount( "dir", dirs[i], "Songs" ); } MountTreeOfZips( ZIPS_DIR ); /* One of the above filesystems might contain files that affect preferences, eg Data/Static.ini. * Re-read preferences. */ PREFSMAN->ReadGlobalPrefsFromDisk(); ApplyLogPreferences(); #if defined(HAVE_SDL) SetupSDL(); #endif /* This needs PREFSMAN. */ Dialog::Init(); // // Create game objects // GAMESTATE = new GameState; /* This requires PREFSMAN, for PREFSMAN->m_bShowLoadingWindow. */ LoadingWindow *loading_window = MakeLoadingWindow(); if( loading_window == NULL ) RageException::Throw( "Couldn't open any loading windows." ); loading_window->Paint(); srand( time(NULL) ); // seed number generator /* Do this early, so we have debugging output if anything else fails. LOG and * Dialog must be set up first. It shouldn't take long, but it might take a * little time; do this after the LoadingWindow is shown, since we don't want * that to appear delayed. */ HOOKS->DumpDebugInfo(); #if defined(HAVE_TLS) LOG->Info( "TLS is %savailable", RageThread::GetSupportsTLS()? "":"not " ); #endif if( PREFSMAN->m_bFirstRun ) OnFirstRun(); CheckSettings(); GAMEMAN = new GameManager; THEME = new ThemeManager; ANNOUNCER = new AnnouncerManager; NOTESKIN = new NoteSkinManager; /* Set up the theme and announcer. */ ReadGamePrefsFromDisk(); if( PREFSMAN->m_iSoundWriteAhead ) LOG->Info( "Sound writeahead has been overridden to %i", PREFSMAN->m_iSoundWriteAhead ); SOUNDMAN = new RageSoundManager; SOUNDMAN->Init( PREFSMAN->GetSoundDrivers() ); SOUNDMAN->SetPrefs( PREFSMAN->m_fSoundVolume ); SOUND = new GameSoundManager; BOOKKEEPER = new Bookkeeper; LIGHTSMAN = new LightsManager(PREFSMAN->m_sLightsDriver); INPUTFILTER = new InputFilter; INPUTMAPPER = new InputMapper; INPUTQUEUE = new InputQueue; SONGINDEX = new SongCacheIndex; BANNERCACHE = new BannerCache; /* depends on SONGINDEX: */ SONGMAN = new SongManager(); SONGMAN->InitAll( loading_window ); // this takes a long time CRYPTMAN = new CryptManager; // need to do this before ProfileMan MEMCARDMAN = new MemoryCardManager; PROFILEMAN = new ProfileManager; PROFILEMAN->Init(); // must load after SONGMAN UNLOCKMAN = new UnlockSystem; NSMAN = new NetworkSyncManager( loading_window ); delete loading_window; // destroy this before init'ing Display ProcessArgsFirst(); DISPLAY = CreateDisplay(); DISPLAY->ChangeCentering( PREFSMAN->m_iCenterImageTranslateX, PREFSMAN->m_iCenterImageTranslateY, PREFSMAN->m_fCenterImageScaleX, PREFSMAN->m_fCenterImageScaleY ); TEXTUREMAN = new RageTextureManager(); TEXTUREMAN->SetPrefs( RageTextureManagerPrefs( PREFSMAN->m_iTextureColorDepth, PREFSMAN->m_iMovieColorDepth, PREFSMAN->m_bDelayedTextureDelete, PREFSMAN->m_iMaxTextureResolution, PREFSMAN->m_bForceMipMaps ) ); MODELMAN = new ModelManager; MODELMAN->SetPrefs( ModelManagerPrefs( PREFSMAN->m_bDelayedModelDelete ) ); StoreActualGraphicOptions( true ); SONGMAN->PreloadSongImages(); /* This initializes objects that change the SDL event mask, and has other * dependencies on the SDL video subsystem, so it must be initialized after DISPLAY. */ INPUTMAN = new RageInput; // These things depend on the TextureManager, so do them after! FONT = new FontManager; SCREENMAN = new ScreenManager; /* People may want to do something else while songs are loading, so do * this after loading songs. */ BoostAppPri(); ResetGame(); CodeDetector::RefreshCacheItems(); /* Initialize which courses are ranking courses here. */ SONGMAN->UpdateRankingCourses(); /* Run the second argcheck, you can do your other options here */ ProcessArgsSecond(); /* Run the main loop. */ GameLoop(); PREFSMAN->SaveGlobalPrefsToDisk(); SaveGamePrefsToDisk(); #if !defined(DEBUG) } catch( const RageException &e ) { /* Gracefully shut down. */ g_sErrorString = e.what(); } #endif SAFE_DELETE( SCREENMAN ); SAFE_DELETE( NSMAN ); /* Delete INPUTMAN before the other INPUTFILTER handlers, or an input * driver may try to send a message to INPUTFILTER after we delete it. */ SAFE_DELETE( INPUTMAN ); SAFE_DELETE( INPUTQUEUE ); SAFE_DELETE( INPUTMAPPER ); SAFE_DELETE( INPUTFILTER ); SAFE_DELETE( MODELMAN ); SAFE_DELETE( PROFILEMAN ); // PROFILEMAN needs the songs still loaded SAFE_DELETE( UNLOCKMAN ); SAFE_DELETE( CRYPTMAN ); SAFE_DELETE( MEMCARDMAN ); SAFE_DELETE( SONGMAN ); SAFE_DELETE( BANNERCACHE ); SAFE_DELETE( SONGINDEX ); SAFE_DELETE( SOUND ); /* uses GAMESTATE, PREFSMAN */ SAFE_DELETE( PREFSMAN ); SAFE_DELETE( GAMESTATE ); SAFE_DELETE( GAMEMAN ); SAFE_DELETE( NOTESKIN ); SAFE_DELETE( THEME ); SAFE_DELETE( ANNOUNCER ); SAFE_DELETE( BOOKKEEPER ); SAFE_DELETE( LIGHTSMAN ); SAFE_DELETE( SOUNDMAN ); SAFE_DELETE( FONT ); SAFE_DELETE( TEXTUREMAN ); SAFE_DELETE( DISPLAY ); Dialog::Shutdown(); SAFE_DELETE( LOG ); SAFE_DELETE( FILEMAN ); #if !defined(DEBUG) && defined(_WINDOWS) } catch( const exception &e ) { /* This can be things like calling std::string::reserve(-1), or out of memory. * This can also happen if we throw a RageException during a ctor, in which case * we want a crash dump. */ FAIL_M( e.what() ); } #endif if( g_sErrorString != "" ) HandleException( g_sErrorString ); SAFE_DELETE( HOOKS ); #ifndef _XBOX return 0; #endif }
BOOL CNWNXConnect::OnCreate(const char* LogDir){ char log[MAX_PATH]; char logrotate[MAX_PATH]; sprintf( log, "%s\\nwnx_connect.txt", LogDir); sprintf( logrotate, "%s\\1\\nwnx_connect.txt", LogDir); MoveFile( log, logrotate ); // call the base class function if( !CNWNXBase::OnCreate( log ) ) return false; WriteLogHeader( ); char buffer[128]; char number[12]; CNWNXMemory mem; TLK = (CExoString *)mem.nwnx_malloc(sizeof(CExoString)); CIniFile ini( "NWNX.ini" ); ini.ReadString( "CONNECT", "TLK", buffer, 128, "" ); int n=0; if( buffer[0]=='\0' ){ Log( "No TLK file was registered in nwnx.ini!\n" ); return true; } else{ TLK->CExoStringCpy( buffer ); Log( "TLK: %s\n", TLK->CStr() ); } ini.ReadString( "CONNECT", _itoa( ++n, number, 10 ), buffer, 128, "" ); HAKLen=0; void * temp; HAK=NULL; while( buffer[0]!='\0' ){ temp = mem.nwnx_malloc( sizeof(CExoString)*(HAKLen+1) ); if( HAK ){ memcpy( temp, HAK, sizeof(CExoString)*HAKLen ); mem.nwnx_free( HAK ); } HAK = (CExoString*)temp; HAK[HAKLen].CExoStringCpy( buffer ); Log( "HAK %i: %s\n", HAKLen+1, HAK[HAKLen].CStr() ); HAKLen++; ini.ReadString( "CONNECT", _itoa( ++n, number, 10 ), buffer, 128, "" ); } Log( "\n" ); if( HookCode( (PVOID)0x0043a810, CNWSMessage__SendServerToPlayerCharList, (PVOID*)&CNWSMessage__SendServerToPlayerCharListNext ) ) Log( "o Hooked SendServerToPlayerCharList!\n" ); else Log( "! Failed to hook SendServerToPlayerCharList!\n" ); Log( "\n" ); return true; }
BOOL CNWNXMessages::OnCreate(const char* LogDir){ char log[MAX_PATH]; char logrotate[MAX_PATH]; sprintf( log, "%s\\nwnx_messages.txt", LogDir); sprintf( logrotate, "%s\\1\\nwnx_messages.txt", LogDir); MoveFile( log, logrotate ); // call the base class function if( !CNWNXBase::OnCreate( log ) ) return false; WriteLogHeader( ); CIniFile ini( "NWNX.ini" ); SS=NULL; SSLen=0; char lpath[MAX_PATH]; ini.ReadString( "MESSAGES", "Languages", lpath, MAX_PATH-25, "%" ); if( lpath[0] != '%' ){ int loaded = LoadLanguages( lpath ); if( loaded <= 0 ){ SS = new ScrambleSet[1]; SSLen=1; } else Log( "Loaded: %i languages\n\n", loaded-1 ); } else{ SS = new ScrambleSet[1]; SSLen=1; Log( "No languages where loaded!\n\n" ); } char buffer[128]; char number[12]; CNWNXMemory mem; TLK = (CExoString *)mem.nwnx_malloc(sizeof(CExoString)); LASTSTR=(CExoString *)mem.nwnx_malloc(sizeof(CExoString)); TLK->text=NULL; LASTSTR->text=NULL; LOGLEVEL=ini.ReadInteger( "MESSAGES", "log", 0 ); ini.ReadString( "MESSAGES", "TLK", buffer, 128, "" ); int n=0; if( buffer[0]=='\0' ){ Log( "No TLK file was registered in nwnx.ini! Sending Haklist disabled!\n" ); } else{ TLK->CExoStringCpy( buffer ); Log( "TLK: %s\n", TLK->CStr() ); ini.ReadString( "MESSAGES", _itoa( ++n, number, 10 ), buffer, 128, "" ); HAKLen=0; void * temp; HAK=NULL; while( buffer[0]!='\0' ){ temp = mem.nwnx_malloc( sizeof(CExoString)*(HAKLen+1) ); if( HAK ){ memcpy( temp, HAK, sizeof(CExoString)*HAKLen ); mem.nwnx_free( HAK ); } HAK = (CExoString*)temp; HAK[HAKLen].text=NULL; HAK[HAKLen].CExoStringCpy( buffer ); Log( "HAK %i: %s\n", HAKLen+1, HAK[HAKLen].CStr() ); HAKLen++; ini.ReadString( "MESSAGES", _itoa( ++n, number, 10 ), buffer, 128, "" ); } Log( "\n" ); if( HookCode( (PVOID)0x0043a810, CNWSMessage__SendServerToPlayerCharList, (PVOID*)&CNWSMessage__SendServerToPlayerCharListNext ) ) Log( "o Hooked SendServerToPlayerCharList!\n" ); else Log( "! Failed to hook SendServerToPlayerCharList!\n" ); Log( "\n" ); } return true; }
LONG __stdcall OpenLogW ( IN LPCWSTR szLogFileName, IN DWORD dwAccessFlags, IN LPDWORD lpdwLogType, IN HQUERY hQuery, IN DWORD dwMaxRecords ) { DWORD dwFileNameSize; LONG pdhStatus = ERROR_SUCCESS; DWORD dwLocalLogType; PLOG_INFO pLog = &LogEntry; try { // test the parameters before continuing if (szLogFileName != NULL) { dwFileNameSize = lstrlenW (szLogFileName) + 1; if (dwFileNameSize > 1) { if (lpdwLogType != NULL) { dwLocalLogType = *lpdwLogType; // test read *lpdwLogType = 0; // test write to buffer *lpdwLogType = dwLocalLogType; // restore value } else { // required parameter is missing pdhStatus = PDH_INVALID_ARGUMENT; } } else { // empty file name pdhStatus = PDH_INVALID_ARGUMENT; } } else { // required parameter is missing pdhStatus = PDH_INVALID_ARGUMENT; } } except (EXCEPTION_EXECUTE_HANDLER) { // something failed so give up here pdhStatus = PDH_INVALID_ARGUMENT; } if (pdhStatus == ERROR_SUCCESS) { // create a log entry pdhStatus = CreateNewLogEntry ( szLogFileName, dwFileNameSize, hQuery, dwMaxRecords); // open the file if (pdhStatus == ERROR_SUCCESS) { // dispatch based on read/write attribute if ((dwAccessFlags & LOG_READ_ACCESS) == LOG_READ_ACCESS) { pdhStatus = ERROR_NOT_SUPPORTED; } else if ((dwAccessFlags & LOG_WRITE_ACCESS) == LOG_WRITE_ACCESS) { pdhStatus = OpenOutputLogFile (pLog, dwAccessFlags, &dwLocalLogType); if (pdhStatus == ERROR_SUCCESS) { pdhStatus = WriteLogHeader (pLog); } } else { pdhStatus = PDH_INVALID_ARGUMENT; } if (pdhStatus == ERROR_SUCCESS) { // return handle to caller *lpdwLogType = dwLocalLogType; } } } return pdhStatus; }