Index: chrome_elf/blacklist/test/blacklist_test_main_dll.cc |
diff --git a/chrome_elf/blacklist/test/blacklist_test_main_dll.cc b/chrome_elf/blacklist/test/blacklist_test_main_dll.cc |
index 8c01d552975001e47c09f7c9af9239bbd5d5e81b..649b7ca9604f291c3b415ac4596ab6a0e1ad0d23 100644 |
--- a/chrome_elf/blacklist/test/blacklist_test_main_dll.cc |
+++ b/chrome_elf/blacklist/test/blacklist_test_main_dll.cc |
@@ -2,16 +2,88 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "chrome_elf/blacklist/blacklist.h" |
+ |
#include <windows.h> |
-#include "chrome_elf/blacklist/blacklist.h" |
+#include "base/files/file.h" |
+#include "base/files/scoped_temp_dir.h" |
+#include "base/path_service.h" |
+#include "chrome_elf/chrome_elf_reg.h" |
#include "chrome_elf/chrome_elf_util.h" |
-extern "C" void InitBlacklistTestDll() { |
+namespace { |
+ |
+void GetIpcOverrides() { |
robertshield
2016/04/20 15:45:47
thinking about this, it looks like the test exe is
penny
2016/05/28 01:34:22
See main comment in reply.
(Excellent idea. Work
|
+ wchar_t path[MAX_PATH] = {}; |
+ ::wsprintf(path, L"chrome_elf_test_%u\\", ::GetCurrentProcessId()); |
robertshield
2016/04/20 15:45:47
PIDs get reused alarmingly frequently, please also
penny
2016/05/28 01:34:22
See main comment in reply.
(PID reuse isn't an is
|
+ |
+ base::FilePath ipc_file; |
+ if (!base::PathService::Get(base::DIR_TEMP, &ipc_file)) |
+ return; |
+ ipc_file = ipc_file.Append(path); |
+ ipc_file = ipc_file.Append(L"chrome_elf_tests.txt"); |
+ base::File file(ipc_file, base::File::FLAG_OPEN | base::File::FLAG_READ); |
+ if (!file.IsValid()) |
+ return; |
+ |
+ DWORD size = static_cast<DWORD>(file.GetLength()); |
+ base::string16 content; |
+ content.resize(size); |
+ if (-1 == file.Read(0, (char*)content.c_str(), size)) { |
robertshield
2016/04/20 15:45:47
no c-style casts
also casting wchar_t* to char* s
penny
2016/05/28 01:34:22
See main comment in reply.
Acknowledged.
|
+ file.Close(); |
+ return; |
+ } |
+ content.append(L"\0"); |
+ |
+ size_t index = content.find(L"hkcu="); |
+ if (index != base::string16::npos) { |
+ const wchar_t* ptr = content.c_str() + index; |
robertshield
2016/04/20 15:45:47
content.begin() + index
penny
2016/05/28 01:34:22
Acknowledged.
|
+ ptr = ::wcschr(ptr, L'\"'); |
robertshield
2016/04/20 15:45:47
why not use one of the find() variants that takes
penny
2016/05/28 01:34:22
Acknowledged.
|
+ if (ptr != nullptr) { |
+ ptr++; |
+ std::vector<wchar_t>(str); |
+ while (*ptr != L'\"') { |
+ str.push_back(*ptr); |
+ ptr++; |
+ } |
robertshield
2016/04/20 15:45:47
I think you can replace most of this with:
size_t
penny
2016/05/28 01:34:22
See main comment in reply.
Your idea would have l
|
+ str.push_back(L'\0'); |
+ base::string16 substr(str.begin(), str.end()); |
+ nt::HKCU_override.assign(substr); |
+ } |
+ } |
+ |
+ index = content.find(L"hklm="); |
+ if (index != base::string16::npos) { |
+ const wchar_t* ptr = content.c_str() + index; |
+ ptr = ::wcschr(ptr, L'\"'); |
+ if (ptr != nullptr) { |
+ ptr++; |
+ std::vector<wchar_t>(str); |
+ while (*ptr != L'\"') { |
+ str.push_back(*ptr); |
+ ptr++; |
+ } |
robertshield
2016/04/20 15:45:47
ditto for simplification suggestion.
penny
2016/05/28 01:34:22
Done.
|
+ str.push_back(L'\0'); |
+ base::string16 substr(str.begin(), str.end()); |
+ nt::HKLM_override.assign(substr); |
+ } |
+ } |
+ |
+ file.Close(); |
+ return; |
+} |
+ |
+} // namespace |
+ |
+extern "C" __declspec(dllexport) void InitTestDll() { |
+ // Make sure we've got the latest registry overrides. |
+ GetIpcOverrides(); |
} |
BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) { |
if (reason == DLL_PROCESS_ATTACH) { |
+ GetIpcOverrides(); |
InitializeProcessType(); |
blacklist::Initialize(true); // force always on, no beacon |
} |