void Core_LoadCallback(void * reserved) { ResetGlobals (); OBSESerializationInterface* intfc = &g_OBSESerializationInterface; UInt32 type, version, length; while (intfc->GetNextRecordInfo(&type, &version, &length)) { switch (type) { case 'STVS': case 'STVR': case 'STVE': case 'ARVS': case 'ARVR': case 'ARVE': case 'MODS': break; // processed during preload case 'GLOB': ReadGlobals (intfc, length); break; default: _MESSAGE("Unhandled chunk type in LoadCallback: %d", type); continue; } } }
/*! * \brief * Initializes the system by resetting the globals. * * Initializes the system by resetting the globals. */ void Initialize() { ResetGlobals(); for(int i = 0; i < k_definition_list_count; i++) g_map_part_definition_lists[i].Ctor(); }
CReaderMonitor::CReaderMonitor(DWORD dwScope, CReaderListener *pListener) { g_pListener = pListener; g_dwScope = dwScope; m_hMonitorThread = NULL; ResetGlobals(); g_readersCheckedEvent = CreateEvent(NULL,FALSE,FALSE, NULL); }
void Core_NewGameCallback(void * reserved) { ResetGlobals (); g_ArrayMap.Clean(); g_StringMap.Clean(); // below are commented out because it is possible for quest scripts to create string/array vars during // main menu - in which case they would get obliterated when a new game is started. //g_StringMap.Reset(&g_OBSESerializationInterface); //g_ArrayMap.Reset(&g_OBSESerializationInterface); }
/*! * \brief * Initializes the system by resetting the globals. * * Initializes the system by resetting the globals. */ void Initialize() { ResetGlobals(); }
DWORD WINAPI CReaderMonitor::ReaderMonitorProc(void* param) { HRESULT hRes; LPTSTR mszNewReaderNames = NULL; while (!InterlockedCompareExchange(&g_fExit,0,0)) { if (g_hContext == 0) { // trying to establish context hRes = SCardEstablishContext(g_dwScope, NULL, NULL, &g_hContext); if (hRes != SCARD_S_SUCCESS) { Sleep(POLL_PERIOD); if(InterlockedCompareExchange(&g_fExit,1,1)) break; g_hContext = 0; } } if (g_hContext) { if (SCARD_S_SUCCESS == SCardIsValidContext(g_hContext)) { // rescan reader list... mszNewReaderNames = NULL; DWORD cchReaderNames = 0; do { hRes = SCardListReaders(g_hContext, NULL, NULL, &cchReaderNames); if ((hRes == SCARD_S_SUCCESS) && cchReaderNames) { mszNewReaderNames = new TCHAR[cchReaderNames]; hRes = SCardListReaders(g_hContext, NULL, mszNewReaderNames, &cchReaderNames); if (hRes != SCARD_S_SUCCESS) { delete[] mszNewReaderNames; mszNewReaderNames = NULL; } } } while (hRes == SCARD_E_INSUFFICIENT_BUFFER); } else hRes = SCARD_E_NO_SERVICE; if(InterlockedCompareExchange(&g_fExit,1,1)) break; // check reader listing status DWORD cNewReaderStates = 0; SCARD_READERSTATE *pNewReaderStates = NULL; switch (hRes) { case ERROR_INVALID_HANDLE: case SCARD_E_INVALID_HANDLE: case SCARD_E_NO_SERVICE: case SCARD_E_SERVICE_STOPPED: SCardReleaseContext(g_hContext); g_hContext = 0; hRes = SCARD_S_SUCCESS; break; case SCARD_E_NO_READERS_AVAILABLE: hRes = SCARD_S_SUCCESS; break; case SCARD_S_SUCCESS: for (LPCTSTR pReader = mszNewReaderNames; *pReader != 0; pReader += _tcslen(pReader) + 1) cNewReaderStates++; if (cNewReaderStates) { pNewReaderStates = new SCARD_READERSTATE[cNewReaderStates]; memset(pNewReaderStates,0,cNewReaderStates* sizeof(SCARD_READERSTATE)); } default: break; } if(InterlockedCompareExchange(&g_fExit,1,1)) break; if (hRes == SCARD_S_SUCCESS) { // compare readers DWORD j; for (j = 0; j < g_cReaderStates; j++) g_pReaderStates[j].pvUserData = (LPVOID)1; LPCTSTR pReader = mszNewReaderNames; DWORD i = 0; if (pReader) { while (*pReader != 0) { pNewReaderStates[i].pvUserData = (LPVOID)1; pNewReaderStates[i].dwCurrentState = SCARD_STATE_UNAWARE; for (j = 0; j < g_cReaderStates; j++) { if (_tcscmp(pReader, g_pReaderStates[j].szReader) == 0) { g_pReaderStates[j].pvUserData = NULL; pNewReaderStates[i] = g_pReaderStates[j]; break; } } pNewReaderStates[i].szReader = pReader; pReader += _tcslen(pReader) + 1; i++; } } // check removed readers for (j = 0; j < g_cReaderStates; j++) { if (g_pReaderStates[j].pvUserData != NULL) { NotifyReaderUnplug(g_pReaderStates[j].szReader); if(InterlockedCompareExchange(&g_fExit,1,1)) goto end_label; } } // update current list if (g_pReaderStates) delete[] g_pReaderStates; if (g_mszReaderNames) delete[] g_mszReaderNames; g_mszReaderNames = mszNewReaderNames; g_pReaderStates = pNewReaderStates; g_cReaderStates = cNewReaderStates; mszNewReaderNames = NULL; } // check reader states if (g_cReaderStates == 0) { if (!g_bReadersListInitialized) { SetEvent(g_readersCheckedEvent); g_bReadersListInitialized = true; } Sleep(POLL_PERIOD); if(InterlockedCompareExchange(&g_fExit,1,1)) break; } else { hRes = SCardGetStatusChange(g_hContext, POLL_PERIOD, g_pReaderStates, g_cReaderStates); if(InterlockedCompareExchange(&g_fExit,1,1)) break; if (hRes == SCARD_S_SUCCESS) { // check changed readers... for (DWORD i = 0; i < g_cReaderStates && !InterlockedCompareExchange(&g_fExit,0,0); i++) { if (g_pReaderStates[i].pvUserData != NULL) { // new reader g_pReaderStates[i].pvUserData = NULL; g_pReaderStates[i].dwEventState &= ~SCARD_STATE_CHANGED; g_pReaderStates[i].dwCurrentState = g_pReaderStates[i].dwEventState; if ((g_pReaderStates[i].dwEventState & (SCARD_STATE_IGNORE | SCARD_STATE_MUTE)) == 0) NotifyReaderPlug(g_pReaderStates[i]); if(InterlockedCompareExchange(&g_fExit,1,1)) goto end_label; } else if (g_pReaderStates[i].dwEventState & SCARD_STATE_CHANGED) { // existing reader g_pReaderStates[i].dwEventState &= ~SCARD_STATE_CHANGED; if ( ((g_pReaderStates[i].dwEventState & (SCARD_STATE_IGNORE | SCARD_STATE_MUTE)) == 0) && ((g_pReaderStates[i].dwCurrentState & SCARD_STATE_MUTE) == 0) && ( ((g_pReaderStates[i].dwCurrentState & SCARD_STATE_PRESENT) && (!(g_pReaderStates[i].dwEventState & SCARD_STATE_PRESENT))) ||((!(g_pReaderStates[i].dwCurrentState & SCARD_STATE_PRESENT)) && (g_pReaderStates[i].dwEventState & SCARD_STATE_PRESENT)) ) ) { NotifyReaderChange(g_pReaderStates[i]); } g_pReaderStates[i].dwCurrentState = g_pReaderStates[i].dwEventState & (~(SCARD_STATE_CHANGED | SCARD_STATE_IGNORE)); if(InterlockedCompareExchange(&g_fExit,1,1)) goto end_label; } } } else if (hRes != SCARD_E_TIMEOUT) { if(InterlockedCompareExchange(&g_fExit,1,1)) goto end_label; // something strange happened. Act as if all readers where disconnected for (DWORD i = 0; i < g_cReaderStates; i++) { NotifyReaderUnplug(g_pReaderStates[i].szReader); if(InterlockedCompareExchange(&g_fExit,1,1)) goto end_label; } if (g_pReaderStates) delete[] g_pReaderStates; if (g_mszReaderNames) delete[] g_mszReaderNames; g_mszReaderNames = NULL; g_pReaderStates = NULL; g_cReaderStates = 0; SCardReleaseContext(g_hContext); g_hContext = 0; } if (!g_bReadersListInitialized) { SetEvent(g_readersCheckedEvent); g_bReadersListInitialized = true; } } } } end_label: ResetGlobals(); if(mszNewReaderNames) delete [] mszNewReaderNames; return 0; }