blob: c53a8e49023b4933fa300870a6ac955841bb5e40 [file] [log] [blame]
// 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/logging.h"
namespace base {
namespace win {
namespace internal {
DWORD ModifyCode(void* destination, const void* source, int length) {
if ((NULL == destination) || (NULL == 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