static void InitializeHooks() { static bool initialized = false; if (initialized) { return; } initialized = true; sDeviceNames = new std::unordered_map<std::wstring, std::wstring>(); for (const std::wstring& name : GetDosDeviceNames()) { sDeviceNames->emplace(name, GetDeviceMapping(name)); } sKernel32Intercept.Init("kernelbase.dll"); sOriginalQueryDosDeviceWFnPtr.Set(sKernel32Intercept, "QueryDosDeviceW", &QueryDosDeviceWHook); }
void Compatibility::Init() { // Note we collect some AT statistics/telemetry here for convenience. InitConsumers(); CrashReporter::AnnotateCrashReport( CrashReporter::Annotation::AccessibilityInProcClient, nsPrintfCString("0x%X", sConsumers)); // Gather telemetry uint32_t temp = sConsumers; for (int i = 0; temp; i++) { if (temp & 0x1) statistics::A11yConsumers(i); temp >>= 1; } // Turn off new tab switching for Jaws and WE. if (sConsumers & (JAWS | OLDJAWS | WE)) { // Check to see if the pref for disallowing CtrlTab is already set. If so, // bail out (respect the user settings). If not, set it. if (!Preferences::HasUserValue("browser.ctrlTab.disallowForScreenReaders")) Preferences::SetBool("browser.ctrlTab.disallowForScreenReaders", true); } // If we have a consumer who is not NVDA, we enable detection for the // InSendMessageEx compatibility hack. NVDA does not require this. // We also skip UIA, as we see crashes there. if ((sConsumers & (~(UIAUTOMATION | NVDA))) && BrowserTabsRemoteAutostart()) { sUser32Interceptor.Init("user32.dll"); sInSendMessageExStub.Set(sUser32Interceptor, "InSendMessageEx", &InSendMessageExHook); // The vectored exception handler allows us to catch exceptions ahead of any // SEH handlers. if (!sVectoredExceptionHandler) { // We need to let ASan's ShadowExceptionHandler remain in the firstHandler // position, otherwise we'll get infinite recursion when our handler // faults on shadow memory. const ULONG firstHandler = FALSE; sVectoredExceptionHandler = AddVectoredExceptionHandler( firstHandler, &DetectInSendMessageExCompat); } } }