tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Timers.cpp (2026B)


      1 // This Source Code Form is subject to the terms of the Mozilla Public
      2 // License, v. 2.0.If a copy of the MPL was not distributed with this
      3 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
      4 
      5 #include <windows.h>
      6 #include "exdll.h"
      7 
      8 static void APIENTRY TimerCallback(LPVOID NSISFunctionAddr, DWORD, DWORD) {
      9  g_executeCodeSegment((int)NSISFunctionAddr, nullptr);
     10 }
     11 
     12 PLUGINFUNCTION(CreateTimer) {
     13  EXDLL_INIT();
     14  extra->RegisterPluginCallback(gHInst, NSISPluginCallback);
     15 
     16  TCHAR* funcAddrStr =
     17      (TCHAR*)HeapAlloc(GetProcessHeap(), 0, g_stringsize * sizeof(TCHAR));
     18  popstring(funcAddrStr);
     19  // Apparently GetFunctionAddress returnes a 1-indexed offset, but
     20  // ExecuteCodeSegment expects a 0-indexed one. Or something.
     21  uintptr_t funcAddr = static_cast<uintptr_t>(_ttoi64(funcAddrStr)) - 1;
     22  HeapFree(GetProcessHeap(), 0, funcAddrStr);
     23 
     24  TCHAR* intervalStr =
     25      (TCHAR*)HeapAlloc(GetProcessHeap(), 0, g_stringsize * sizeof(TCHAR));
     26  popstring(intervalStr);
     27  long interval = _ttol(intervalStr);
     28  HeapFree(GetProcessHeap(), 0, intervalStr);
     29 
     30  HANDLE timer = CreateWaitableTimer(nullptr, FALSE, nullptr);
     31  if (!timer) {
     32    return;
     33  }
     34 
     35  // The interval we were passed is in milliseconds, so we need to convert it
     36  // to the 100-nanosecond units that SetWaitableTimer expects. We also need to
     37  // make it negative, because that's what signifies a relative offset from now
     38  // instead of an epoch-based time stamp.
     39  LARGE_INTEGER dueTime;
     40  dueTime.QuadPart = -(interval * 10000);
     41 
     42  SetWaitableTimer(timer, &dueTime, interval, TimerCallback, (void*)funcAddr,
     43                   FALSE);
     44 
     45  TCHAR timerStr[32] = _T("");
     46  _ltot_s((long)timer, timerStr, 10);
     47  pushstring(timerStr);
     48 }
     49 
     50 PLUGINFUNCTION(CancelTimer) {
     51  TCHAR* timerStr =
     52      (TCHAR*)HeapAlloc(GetProcessHeap(), 0, g_stringsize * sizeof(TCHAR));
     53  popstring(timerStr);
     54  HANDLE timer = reinterpret_cast<HANDLE>(_ttoi(timerStr));
     55  HeapFree(GetProcessHeap(), 0, timerStr);
     56 
     57  CancelWaitableTimer(timer);
     58  CloseHandle(timer);
     59 }