| Index: chrome_elf/blacklist/blacklist.cc
|
| diff --git a/chrome_elf/blacklist/blacklist.cc b/chrome_elf/blacklist/blacklist.cc
|
| index 705cc608286d6744103f96caf6ddf4052fae5adc..7cdfb2b45e9b053dd5ffff379be96460f0e4288d 100644
|
| --- a/chrome_elf/blacklist/blacklist.cc
|
| +++ b/chrome_elf/blacklist/blacklist.cc
|
| @@ -342,7 +342,58 @@ bool Initialize(bool force) {
|
|
|
| RecordSuccessfulThunkSetup(&key);
|
|
|
| + AddDllsFromRegistryToBlacklist();
|
| +
|
| return NT_SUCCESS(ret) && page_executable;
|
| }
|
|
|
| +void AddDllsFromRegistryToBlacklist() {
|
| + HKEY key = NULL;
|
| + LONG result = ::RegOpenKeyEx(HKEY_CURRENT_USER,
|
| + kRegistryFinchListPath,
|
| + 0,
|
| + KEY_QUERY_VALUE | KEY_SET_VALUE,
|
| + &key);
|
| +
|
| + if (result != ERROR_SUCCESS)
|
| + return;
|
| +
|
| + int num_dlls;
|
| + int longest_name;
|
| + ::RegQueryInfoKey(key, NULL, NULL, NULL, NULL, NULL, NULL,
|
| + (DWORD*) &num_dlls, (DWORD*) &longest_name, NULL, NULL, NULL);
|
| +
|
| + // Collect dll so that we can delete them after the enumeration.
|
| + std::vector<wchar_t*> dll_names(num_dlls);
|
| +
|
| + for (int i = 0; i < num_dlls; ++i) {
|
| + DWORD name_len(longest_name + 1);
|
| + DWORD value_len;
|
| + wchar_t* name_buffer = new wchar_t[name_len];
|
| + result = ::RegEnumValue(key, i, name_buffer, &name_len, NULL, NULL,
|
| + NULL, &value_len);
|
| + name_len = name_len + 1;
|
| + wchar_t* value_buffer = new wchar_t[value_len+1];
|
| + result = ::RegEnumValue(key, i, name_buffer, &name_len, NULL, NULL,
|
| + (BYTE*) value_buffer, &value_len);
|
| + value_buffer[value_len] = L'\0';
|
| +
|
| + if (result == ERROR_SUCCESS) {
|
| + AddDllToBlacklist(value_buffer);
|
| + }
|
| +
|
| + dll_names[i] = name_buffer;
|
| +
|
| + delete[] value_buffer;
|
| + }
|
| +
|
| + for (int i = 0; i < (int) dll_names.size(); ++i) {
|
| + ::RegDeleteValue(key, dll_names[i]);
|
| + delete[] dll_names[i];
|
| + }
|
| +
|
| + ::RegCloseKey(key);
|
| +}
|
| +
|
| } // namespace blacklist
|
| +
|
|
|