//------------------------------------------------------------------------------------------------- extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE hInstDll, DWORD fdwReason, LPVOID) { if (fdwReason == DLL_PROCESS_ATTACH) { const DWORD dwLen = GetModuleFileNameW(nullptr, g_wBuf, MAX_PATH+1); if (dwLen >= 6 && dwLen < MAX_PATH) { wchar_t *pDelim = g_wBuf+dwLen; do { if (*--pDelim == L'\\') break; } while (pDelim > g_wBuf); if (pDelim >= g_wBuf+4 && pDelim <= g_wBuf+MAX_PATH-g_dwPathMargin && (pDelim[1] = L'\0', SetCurrentDirectoryW(g_wBuf)) && DisableThreadLibraryCalls(hInstDll)) if (const HANDLE hTimer = CreateWaitableTimerW(nullptr, FALSE, nullptr)) { LARGE_INTEGER liDueTime; liDueTime.QuadPart = 0; const bool bOk = SetWaitableTimer(hTimer, &liDueTime, 0, TimerAPCProc, hInstDll, FALSE); if (CloseHandle(hTimer) && bOk) { *pDelim = L'\0'; return TRUE; } } } } return FALSE; }
/// <summary> /// Start the waitable timer to trigger process of timed streams /// </summary> void KinectWindow::StartTimer() { m_hTimer = CreateWaitableTimerW(nullptr, FALSE, nullptr); if (m_hTimer) { LARGE_INTEGER dueTime = {0}; SetWaitableTimer(m_hTimer, &dueTime, TIMER_PERIOD, nullptr, nullptr, FALSE); } }
HOOKFUNC HANDLE WINAPI MyCreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes,BOOL bManualReset,LPCWSTR lpTimerName) { HANDLE rv = CreateWaitableTimerW(lpTimerAttributes, bManualReset, lpTimerName); debuglog(LCF_SYNCOBJ|LCF_DESYNC|LCF_UNTESTED|LCF_TODO, __FUNCTION__ " returned 0x%X.\n", rv); EnterCriticalSection(&s_handleCS); std::set<HANDLE>& handles = s_threadIdHandles[GetCurrentThreadId()]; handles.insert(rv); LeaveCriticalSection(&s_handleCS); return rv; }
HOOKFUNC HANDLE WINAPI MyCreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCWSTR lpTimerName) { ENTER(); HANDLE rv = CreateWaitableTimerW(lpTimerAttributes, bManualReset, lpTimerName); LEAVE(rv); EnterCriticalSection(&s_handleCS); std::set<HANDLE>& handles = s_threadIdHandles[GetCurrentThreadId()]; handles.insert(rv); LeaveCriticalSection(&s_handleCS); return rv; }
explicit impl(int64_t ms) : m_sink(nullptr) { m_h = CreateWaitableTimerW(nullptr, TRUE, nullptr); if (m_h == 0) throw detail::win32_error(::GetLastError()); LARGE_INTEGER li; li.QuadPart = -(ms * 10000); if (!SetWaitableTimer(m_h, &li, 0, 0, 0, FALSE)) { DWORD ec = ::GetLastError(); CloseHandle(m_h); throw detail::win32_error(ec); } }
HANDLE WINAPI CreateWaitableTimerA( LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCSTR lpTimerName ) /*++ Routine Description: ANSI thunk to CreateWaitableTimerW --*/ { PUNICODE_STRING Unicode; ANSI_STRING AnsiString; NTSTATUS Status; LPCWSTR NameBuffer; NameBuffer = NULL; if ( ARGUMENT_PRESENT(lpTimerName) ) { Unicode = &NtCurrentTeb()->StaticUnicodeString; RtlInitAnsiString(&AnsiString,lpTimerName); Status = RtlAnsiStringToUnicodeString(Unicode,&AnsiString,FALSE); if ( !NT_SUCCESS(Status) ) { if ( Status == STATUS_BUFFER_OVERFLOW ) { SetLastError(ERROR_FILENAME_EXCED_RANGE); } else { BaseSetLastNTError(Status); } return NULL; } NameBuffer = (LPCWSTR)Unicode->Buffer; } return CreateWaitableTimerW( lpTimerAttributes, bManualReset, NameBuffer ); }