Bug 1503538 Part 2/5: Move AutoVirtualProtect to a shared header r=aklotz

AutoVirtualProtect will be useful for following patches. This moves it out of
DllBlocklistWin.cpp and into WinHeaderOnlyUtils.h so it can be shared.

Differential Revision: https://phabricator.services.mozilla.com/D13197

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Carl Corcoran 2019-03-06 00:40:55 +00:00
Родитель d6d1ff2060
Коммит 183288850c
2 изменённых файлов: 41 добавлений и 41 удалений

Просмотреть файл

@ -306,47 +306,6 @@ static NTSTATUS NTAPI patched_NtMapViewOfSection(
namespace mozilla {
class MOZ_RAII AutoVirtualProtect final {
public:
AutoVirtualProtect(void* aAddress, size_t aLength, DWORD aProtFlags,
HANDLE aTargetProcess = nullptr)
: mAddress(aAddress),
mLength(aLength),
mTargetProcess(aTargetProcess),
mPrevProt(0),
mError(WindowsError::CreateSuccess()) {
if (!::VirtualProtectEx(aTargetProcess, aAddress, aLength, aProtFlags,
&mPrevProt)) {
mError = WindowsError::FromLastError();
}
}
~AutoVirtualProtect() {
if (mError.IsFailure()) {
return;
}
::VirtualProtectEx(mTargetProcess, mAddress, mLength, mPrevProt,
&mPrevProt);
}
explicit operator bool() const { return mError.IsSuccess(); }
WindowsError GetError() const { return mError; }
AutoVirtualProtect(const AutoVirtualProtect&) = delete;
AutoVirtualProtect(AutoVirtualProtect&&) = delete;
AutoVirtualProtect& operator=(const AutoVirtualProtect&) = delete;
AutoVirtualProtect& operator=(AutoVirtualProtect&&) = delete;
private:
void* mAddress;
size_t mLength;
HANDLE mTargetProcess;
DWORD mPrevProt;
WindowsError mError;
};
LauncherVoidResult InitializeDllBlocklistOOP(HANDLE aChildProcess) {
mozilla::CrossProcessDllInterceptor intcpt(aChildProcess);
intcpt.Init(L"ntdll.dll");

Просмотреть файл

@ -361,6 +361,47 @@ inline WindowsErrorResult<bool> DoPathsPointToIdenticalFile(
return id1 == id2;
}
class MOZ_RAII AutoVirtualProtect final {
public:
AutoVirtualProtect(void* aAddress, size_t aLength, DWORD aProtFlags,
HANDLE aTargetProcess = nullptr)
: mAddress(aAddress),
mLength(aLength),
mTargetProcess(aTargetProcess),
mPrevProt(0),
mError(WindowsError::CreateSuccess()) {
if (!::VirtualProtectEx(aTargetProcess, aAddress, aLength, aProtFlags,
&mPrevProt)) {
mError = WindowsError::FromLastError();
}
}
~AutoVirtualProtect() {
if (mError.IsFailure()) {
return;
}
::VirtualProtectEx(mTargetProcess, mAddress, mLength, mPrevProt,
&mPrevProt);
}
explicit operator bool() const { return mError.IsSuccess(); }
WindowsError GetError() const { return mError; }
AutoVirtualProtect(const AutoVirtualProtect&) = delete;
AutoVirtualProtect(AutoVirtualProtect&&) = delete;
AutoVirtualProtect& operator=(const AutoVirtualProtect&) = delete;
AutoVirtualProtect& operator=(AutoVirtualProtect&&) = delete;
private:
void* mAddress;
size_t mLength;
HANDLE mTargetProcess;
DWORD mPrevProt;
WindowsError mError;
};
} // namespace mozilla
#endif // mozilla_WinHeaderOnlyUtils_h