mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 11:25:00 +00:00
Backed out 1 changesets (bug 1473371)for windows-specific changes and fails on windows CLOSED TREE
Backed out changeset f86b10b13521 (bug 1473371)
This commit is contained in:
parent
ce664a172d
commit
46d4610039
@ -357,13 +357,21 @@ InitializeDllBlocklistOOP(HANDLE aChildProcess)
|
||||
{
|
||||
mozilla::CrossProcessDllInterceptor intcpt(aChildProcess);
|
||||
intcpt.Init(L"ntdll.dll");
|
||||
bool ok = stub_NtMapViewOfSection.SetDetour(aChildProcess, intcpt,
|
||||
"NtMapViewOfSection",
|
||||
bool ok = stub_NtMapViewOfSection.SetDetour(intcpt, "NtMapViewOfSection",
|
||||
&patched_NtMapViewOfSection);
|
||||
if (!ok) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set the child process's copy of stub_NtMapViewOfSection
|
||||
SIZE_T bytesWritten;
|
||||
ok = !!::WriteProcessMemory(aChildProcess, &stub_NtMapViewOfSection,
|
||||
&stub_NtMapViewOfSection,
|
||||
sizeof(stub_NtMapViewOfSection), &bytesWritten);
|
||||
if (!ok) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Because aChildProcess has just been created in a suspended state, its
|
||||
// dynamic linker has not yet been initialized, thus its executable has
|
||||
// not yet been linked with ntdll.dll. If the blocklist hook intercepts a
|
||||
@ -399,8 +407,6 @@ InitializeDllBlocklistOOP(HANDLE aChildProcess)
|
||||
|
||||
ptrdiff_t iatLength = (curIatThunk - firstIatThunk) * sizeof(IMAGE_THUNK_DATA);
|
||||
|
||||
SIZE_T bytesWritten;
|
||||
|
||||
{ // Scope for prot
|
||||
AutoVirtualProtect prot(firstIatThunk, iatLength, PAGE_READWRITE,
|
||||
aChildProcess);
|
||||
|
@ -84,32 +84,32 @@
|
||||
namespace mozilla {
|
||||
namespace interceptor {
|
||||
|
||||
template <typename T>
|
||||
struct OriginalFunctionPtrTraits;
|
||||
|
||||
template <typename R, typename... Args>
|
||||
struct OriginalFunctionPtrTraits<R (*)(Args...)>
|
||||
{
|
||||
using ReturnType = R;
|
||||
};
|
||||
|
||||
#if defined(_M_IX86)
|
||||
template <typename R, typename... Args>
|
||||
struct OriginalFunctionPtrTraits<R (__stdcall*)(Args...)>
|
||||
{
|
||||
using ReturnType = R;
|
||||
};
|
||||
|
||||
template <typename R, typename... Args>
|
||||
struct OriginalFunctionPtrTraits<R (__fastcall*)(Args...)>
|
||||
{
|
||||
using ReturnType = R;
|
||||
};
|
||||
#endif // defined(_M_IX86)
|
||||
|
||||
template <typename InterceptorT, typename FuncPtrT>
|
||||
class FuncHook final
|
||||
{
|
||||
template <typename T>
|
||||
struct OriginalFunctionPtrTraits;
|
||||
|
||||
template <typename R, typename... Args>
|
||||
struct OriginalFunctionPtrTraits<R (*)(Args...)>
|
||||
{
|
||||
using ReturnType = R;
|
||||
};
|
||||
|
||||
#if defined(_M_IX86)
|
||||
template <typename R, typename... Args>
|
||||
struct OriginalFunctionPtrTraits<R (__stdcall*)(Args...)>
|
||||
{
|
||||
using ReturnType = R;
|
||||
};
|
||||
|
||||
template <typename R, typename... Args>
|
||||
struct OriginalFunctionPtrTraits<R (__fastcall*)(Args...)>
|
||||
{
|
||||
using ReturnType = R;
|
||||
};
|
||||
#endif // defined(_M_IX86)
|
||||
|
||||
public:
|
||||
using ThisType = FuncHook<InterceptorT, FuncPtrT>;
|
||||
using ReturnType = typename OriginalFunctionPtrTraits<FuncPtrT>::ReturnType;
|
||||
@ -221,96 +221,15 @@ private:
|
||||
INIT_ONCE mInitOnce;
|
||||
};
|
||||
|
||||
template <typename InterceptorT, typename FuncPtrT>
|
||||
class MOZ_ONLY_USED_TO_AVOID_STATIC_CONSTRUCTORS FuncHookCrossProcess final
|
||||
{
|
||||
public:
|
||||
using ThisType = FuncHookCrossProcess<InterceptorT, FuncPtrT>;
|
||||
using ReturnType = typename OriginalFunctionPtrTraits<FuncPtrT>::ReturnType;
|
||||
|
||||
FuncHookCrossProcess() = default;
|
||||
~FuncHookCrossProcess() = default;
|
||||
|
||||
bool Set(HANDLE aProcess, InterceptorT& aInterceptor, const char* aName,
|
||||
FuncPtrT aHookDest)
|
||||
{
|
||||
if (!aInterceptor.AddHook(aName, reinterpret_cast<intptr_t>(aHookDest),
|
||||
reinterpret_cast<void**>(&mOrigFunc))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return CopyStubToChildProcess(aProcess);
|
||||
}
|
||||
|
||||
bool SetDetour(HANDLE aProcess, InterceptorT& aInterceptor, const char* aName,
|
||||
FuncPtrT aHookDest)
|
||||
{
|
||||
if (!aInterceptor.AddDetour(aName, reinterpret_cast<intptr_t>(aHookDest),
|
||||
reinterpret_cast<void**>(&mOrigFunc))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return CopyStubToChildProcess(aProcess);
|
||||
}
|
||||
|
||||
explicit operator bool() const
|
||||
{
|
||||
return !!mOrigFunc;
|
||||
}
|
||||
|
||||
/**
|
||||
* NB: This operator is only meaningful when invoked in the target process!
|
||||
*/
|
||||
template <typename... ArgsType>
|
||||
ReturnType operator()(ArgsType... aArgs) const
|
||||
{
|
||||
return mOrigFunc(std::forward<ArgsType>(aArgs)...);
|
||||
}
|
||||
|
||||
FuncHookCrossProcess(const FuncHookCrossProcess&) = delete;
|
||||
FuncHookCrossProcess(FuncHookCrossProcess&&) = delete;
|
||||
FuncHookCrossProcess& operator=(const FuncHookCrossProcess&) = delete;
|
||||
FuncHookCrossProcess& operator=(FuncHookCrossProcess&& aOther) = delete;
|
||||
|
||||
private:
|
||||
bool CopyStubToChildProcess(HANDLE aProcess)
|
||||
{
|
||||
SIZE_T bytesWritten;
|
||||
return !!::WriteProcessMemory(aProcess, &mOrigFunc, &mOrigFunc,
|
||||
sizeof(mOrigFunc), &bytesWritten);
|
||||
}
|
||||
|
||||
private:
|
||||
FuncPtrT mOrigFunc;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
kDefaultTrampolineSize = 128
|
||||
};
|
||||
|
||||
template <typename MMPolicyT, typename InterceptorT>
|
||||
struct TypeResolver;
|
||||
|
||||
template <typename InterceptorT>
|
||||
struct TypeResolver<mozilla::interceptor::MMPolicyInProcess, InterceptorT>
|
||||
{
|
||||
template <typename FuncPtrT>
|
||||
using FuncHookType = FuncHook<InterceptorT, FuncPtrT>;
|
||||
};
|
||||
|
||||
template <typename InterceptorT>
|
||||
struct TypeResolver<mozilla::interceptor::MMPolicyOutOfProcess, InterceptorT>
|
||||
{
|
||||
template <typename FuncPtrT>
|
||||
using FuncHookType = FuncHookCrossProcess<InterceptorT, FuncPtrT>;
|
||||
};
|
||||
|
||||
template <typename VMPolicy =
|
||||
mozilla::interceptor::VMSharingPolicyShared<
|
||||
mozilla::interceptor::MMPolicyInProcess, kDefaultTrampolineSize>>
|
||||
class WindowsDllInterceptor final : public TypeResolver<typename VMPolicy::MMPolicyT,
|
||||
WindowsDllInterceptor<VMPolicy>>
|
||||
class WindowsDllInterceptor final
|
||||
{
|
||||
typedef WindowsDllInterceptor<VMPolicy> ThisType;
|
||||
|
||||
@ -453,12 +372,13 @@ private:
|
||||
return mDetourPatcher.AddHook(aProc, aHookDest, aOrigFunc);
|
||||
}
|
||||
|
||||
public:
|
||||
template <typename FuncPtrT>
|
||||
using FuncHookType = FuncHook<ThisType, FuncPtrT>;
|
||||
|
||||
private:
|
||||
template <typename InterceptorT, typename FuncPtrT>
|
||||
friend class FuncHook;
|
||||
|
||||
template <typename InterceptorT, typename FuncPtrT>
|
||||
friend class FuncHookCrossProcess;
|
||||
};
|
||||
|
||||
} // namespace interceptor
|
||||
|
@ -73,14 +73,22 @@ int ParentMain()
|
||||
mozilla::CrossProcessDllInterceptor intcpt(childProcess.get());
|
||||
intcpt.Init("TestDllInterceptorCrossProcess.exe");
|
||||
|
||||
if (!gOrigReturnResult.Set(childProcess.get(), intcpt, "ReturnResult",
|
||||
&ReturnResultHook)) {
|
||||
if (!gOrigReturnResult.Set(intcpt, "ReturnResult", &ReturnResultHook)) {
|
||||
printf("TEST-UNEXPECTED-FAIL | DllInterceptorCrossProcess | Failed to add hook\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("TEST-PASS | DllInterceptorCrossProcess | Hook added\n");
|
||||
|
||||
// Let's save the original hook
|
||||
SIZE_T bytesWritten;
|
||||
if (!::WriteProcessMemory(childProcess.get(), &gOrigReturnResult,
|
||||
&gOrigReturnResult, sizeof(gOrigReturnResult),
|
||||
&bytesWritten)) {
|
||||
printf("TEST-UNEXPECTED-FAIL | DllInterceptorCrossProcess | Failed to write original function pointer\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (::ResumeThread(childMainThread.get()) == static_cast<DWORD>(-1)) {
|
||||
printf("TEST-UNEXPECTED-FAIL | DllInterceptorCrossProcess | Failed to resume child thread\n");
|
||||
return 1;
|
||||
|
Loading…
Reference in New Issue
Block a user