mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Backed out changeset e135879cff29 (bug 1218473) to fix various Windows startup issues being experienced by some users. a=sledru
This commit is contained in:
parent
302ee59a1d
commit
08b59f8d68
@ -19,7 +19,6 @@ LOCAL_INCLUDES += [
|
||||
'/toolkit/xre',
|
||||
]
|
||||
|
||||
DISABLE_STL_WRAPPING = True
|
||||
USE_STATIC_LIBS = True
|
||||
|
||||
OS_LIBS += [
|
||||
|
@ -6,15 +6,9 @@
|
||||
|
||||
#ifndef NS_WINDOWS_DLL_INTERCEPTOR_H_
|
||||
#define NS_WINDOWS_DLL_INTERCEPTOR_H_
|
||||
|
||||
#include <wchar.h>
|
||||
#include <windows.h>
|
||||
#include <winternl.h>
|
||||
|
||||
#include "mozilla/ArrayUtils.h"
|
||||
#include "mozilla/UniquePtr.h"
|
||||
#include "nsWindowsHelpers.h"
|
||||
|
||||
/*
|
||||
* Simple function interception.
|
||||
*
|
||||
@ -120,7 +114,6 @@ public:
|
||||
, mPatchedFnsLen(0)
|
||||
{}
|
||||
|
||||
#if defined(_M_IX86)
|
||||
~WindowsDllNopSpacePatcher()
|
||||
{
|
||||
// Restore the mov edi, edi to the beginning of each function we patched.
|
||||
@ -147,12 +140,6 @@ public:
|
||||
|
||||
void Init(const char* aModuleName)
|
||||
{
|
||||
if (!IsCompatible()) {
|
||||
#if defined(MOZILLA_INTERNAL_API)
|
||||
NS_WARNING("NOP space patching is unavailable for compatibility reasons");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
mModule = LoadLibraryExA(aModuleName, nullptr, 0);
|
||||
if (!mModule) {
|
||||
//printf("LoadLibraryEx for '%s' failed\n", aModuleName);
|
||||
@ -160,91 +147,12 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* NVIDIA Optimus drivers utilize Microsoft Detours 2.x to patch functions
|
||||
* in our address space. There is a bug in Detours 2.x that causes it to
|
||||
* patch at the wrong address when attempting to detour code that is already
|
||||
* NOP space patched. This function is an effort to detect the presence of
|
||||
* this NVIDIA code in our address space and disable NOP space patching if it
|
||||
* is. We also check AppInit_DLLs since this is the mechanism that the Optimus
|
||||
* drivers use to inject into our process.
|
||||
*/
|
||||
static bool IsCompatible()
|
||||
{
|
||||
// These DLLs are known to have bad interactions with this style of patching
|
||||
const wchar_t* kIncompatibleDLLs[] = {
|
||||
L"detoured.dll",
|
||||
L"_etoured.dll",
|
||||
L"nvd3d9wrap.dll",
|
||||
L"nvdxgiwrap.dll"
|
||||
};
|
||||
// See if the infringing DLLs are already loaded
|
||||
for (unsigned int i = 0; i < mozilla::ArrayLength(kIncompatibleDLLs); ++i) {
|
||||
if (GetModuleHandleW(kIncompatibleDLLs[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (GetModuleHandleW(L"user32.dll")) {
|
||||
// user32 is loaded but the infringing DLLs are not, assume we're safe to
|
||||
// proceed.
|
||||
return true;
|
||||
}
|
||||
// If user32 has not loaded yet, check AppInit_DLLs to ensure that Optimus
|
||||
// won't be loaded once user32 is initialized.
|
||||
HKEY hkey = NULL;
|
||||
if (!RegOpenKeyExW(HKEY_LOCAL_MACHINE,
|
||||
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows",
|
||||
0, KEY_QUERY_VALUE, &hkey)) {
|
||||
nsAutoRegKey key(hkey);
|
||||
DWORD numBytes = 0;
|
||||
const wchar_t kAppInitDLLs[] = L"AppInit_DLLs";
|
||||
// Query for required buffer size
|
||||
LONG status = RegQueryValueExW(hkey, kAppInitDLLs, nullptr,
|
||||
nullptr, nullptr, &numBytes);
|
||||
mozilla::UniquePtr<wchar_t[]> data;
|
||||
if (!status) {
|
||||
// Allocate the buffer and query for the actual data
|
||||
data = mozilla::MakeUnique<wchar_t[]>(numBytes / sizeof(wchar_t));
|
||||
status = RegQueryValueExW(hkey, kAppInitDLLs, nullptr,
|
||||
nullptr, (LPBYTE)data.get(), &numBytes);
|
||||
}
|
||||
if (!status) {
|
||||
// For each token, split up the filename components and then check the
|
||||
// name of the file.
|
||||
const wchar_t kDelimiters[] = L", ";
|
||||
wchar_t* tokenContext = nullptr;
|
||||
wchar_t* token = wcstok_s(data.get(), kDelimiters, &tokenContext);
|
||||
while (token) {
|
||||
wchar_t fname[_MAX_FNAME] = {0};
|
||||
if (!_wsplitpath_s(token, nullptr, 0, nullptr, 0,
|
||||
fname, mozilla::ArrayLength(fname),
|
||||
nullptr, 0)) {
|
||||
// nvinit.dll is responsible for bootstrapping the DLL injection, so
|
||||
// that is the library that we check for here
|
||||
const wchar_t kNvInitName[] = L"nvinit";
|
||||
if (!_wcsnicmp(fname, kNvInitName,
|
||||
mozilla::ArrayLength(kNvInitName))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
token = wcstok_s(nullptr, kDelimiters, &tokenContext);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#if defined(_M_IX86)
|
||||
bool AddHook(const char* aName, intptr_t aHookDest, void** aOrigFunc)
|
||||
{
|
||||
if (!mModule) {
|
||||
return false;
|
||||
}
|
||||
if (!IsCompatible()) {
|
||||
#if defined(MOZILLA_INTERNAL_API)
|
||||
NS_WARNING("NOP space patching is unavailable for compatibility reasons");
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mPatchedFnsLen == maxPatchedFns) {
|
||||
// printf ("No space for hook in mPatchedFns.\n");
|
||||
@ -335,11 +243,6 @@ private:
|
||||
return aOriginalFunction;
|
||||
}
|
||||
#else
|
||||
void Init(const char* aModuleName)
|
||||
{
|
||||
// Not implemented except on x86-32.
|
||||
}
|
||||
|
||||
bool AddHook(const char* aName, intptr_t aHookDest, void** aOrigFunc)
|
||||
{
|
||||
// Not implemented except on x86-32.
|
||||
|
Loading…
Reference in New Issue
Block a user