forked from mirrors/gecko-dev
		
	 5690759b5c
			
		
	
	
		5690759b5c
		
	
	
	
	
		
			
			* We refactor the blocklist code. Code that may possibly run before initialization of the Win32 subsystem and the CRT is contained within the `freestanding` library. * The `freestanding` library's static initializers are placed in their own section so that they may be manually invoked separately from the remaining initializers in the binary. * `CheckBlockInfo` and `IsDllAllowed` are modified to return a `BlockAction` enum instead of a `bool`. This will be used more extensively in the future for LSP blocking. * The launcher process now hooks `LdrLoadDll` in addition to `NtMapViewOfSection`. This is necessary so that we can collect timing information. * Telemetry recorders must implement the `LoaderObserver` interface. * `ModuleLoadFrame` is a RAII class that collects the information about the DLL load and dispatches the information to `LoaderObserver`s. * The launcher process exposes an implementation of the `LoaderAPI` interface that may be called by either the launcher process blocklist or the legacy blocklist in `mozglue`. * During startup, the launcher process implements its own `LoaderObserver`. Once mozglue is running, it connects its `LoaderObserver` to the launcher process, receives a vector containing the module load events, and then stores and forwards them into XUL. Depends on D43155 Differential Revision: https://phabricator.services.mozilla.com/D43156 --HG-- rename : browser/app/winlauncher/DllBlocklistWin.cpp => browser/app/winlauncher/DllBlocklistInit.cpp rename : browser/app/winlauncher/DllBlocklistWin.h => browser/app/winlauncher/DllBlocklistInit.h rename : browser/app/winlauncher/DllBlocklistWin.cpp => browser/app/winlauncher/freestanding/DllBlocklist.cpp rename : browser/app/winlauncher/DllBlocklistWin.h => browser/app/winlauncher/freestanding/DllBlocklist.h rename : browser/app/winlauncher/moz.build => browser/app/winlauncher/freestanding/moz.build extra : moz-landing-system : lando
		
			
				
	
	
		
			49 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #include "mozilla/LoaderAPIInterfaces.h"
 | |
| 
 | |
| #include "freestanding/LoaderPrivateAPI.h"
 | |
| 
 | |
| #if defined(_MSC_VER)
 | |
| #  include <intrin.h>
 | |
| #  pragma intrinsic(_ReturnAddress)
 | |
| #  define RETURN_ADDRESS() _ReturnAddress()
 | |
| #elif defined(__GNUC__) || defined(__clang__)
 | |
| #  define RETURN_ADDRESS() \
 | |
|     __builtin_extract_return_addr(__builtin_return_address(0))
 | |
| #endif
 | |
| 
 | |
| static bool CheckForMozglue(void* aReturnAddress) {
 | |
|   HMODULE callingModule;
 | |
|   if (!::GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
 | |
|                                 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
 | |
|                             reinterpret_cast<LPCWSTR>(aReturnAddress),
 | |
|                             &callingModule)) {
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   return callingModule && callingModule == ::GetModuleHandleW(L"mozglue.dll");
 | |
| }
 | |
| 
 | |
| namespace mozilla {
 | |
| 
 | |
| extern "C" MOZ_EXPORT nt::LoaderAPI* GetNtLoaderAPI(
 | |
|     nt::LoaderObserver* aNewObserver) {
 | |
|   const bool isCallerMozglue = CheckForMozglue(RETURN_ADDRESS());
 | |
|   MOZ_ASSERT(isCallerMozglue);
 | |
|   if (!isCallerMozglue) {
 | |
|     return nullptr;
 | |
|   }
 | |
| 
 | |
|   freestanding::EnsureInitialized();
 | |
|   freestanding::LoaderPrivateAPI& api = freestanding::gLoaderPrivateAPI;
 | |
|   api.SetObserver(aNewObserver);
 | |
| 
 | |
|   return &api;
 | |
| }
 | |
| 
 | |
| }  // namespace mozilla
 |