forked from Pissandshittium/pissandshittium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpatch_util.cc
52 lines (41 loc) · 1.45 KB
/
patch_util.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/win/patch_util.h"
#include "base/notreached.h"
namespace base {
namespace win {
namespace internal {
DWORD ModifyCode(void* destination, const void* source, int length) {
if ((nullptr == destination) || (nullptr == source) || (0 == length)) {
NOTREACHED();
return ERROR_INVALID_PARAMETER;
}
// Change the page protection so that we can write.
MEMORY_BASIC_INFORMATION memory_info;
DWORD error = NO_ERROR;
DWORD old_page_protection = 0;
if (!VirtualQuery(destination, &memory_info, sizeof(memory_info))) {
error = GetLastError();
return error;
}
DWORD is_executable = (PAGE_EXECUTE | PAGE_EXECUTE_READ |
PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY) &
memory_info.Protect;
if (VirtualProtect(destination, length,
is_executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE,
&old_page_protection)) {
// Write the data.
CopyMemory(destination, source, length);
// Restore the old page protection.
error = ERROR_SUCCESS;
VirtualProtect(destination, length, old_page_protection,
&old_page_protection);
} else {
error = GetLastError();
}
return error;
}
} // namespace internal
} // namespace win
} // namespace base