Home | History | Annotate | Download | only in blacklist
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_ELF_BLACKLIST_BLACKLIST_H_
      6 #define CHROME_ELF_BLACKLIST_BLACKLIST_H_
      7 
      8 #if defined(_WIN64)
      9 #include "sandbox/win/src/sandbox_nt_types.h"
     10 #endif
     11 
     12 namespace blacklist {
     13 
     14 // Max size of the DLL blacklist.
     15 const size_t kTroublesomeDllsMaxCount = 64;
     16 
     17 // The DLL blacklist.
     18 extern const wchar_t* g_troublesome_dlls[kTroublesomeDllsMaxCount];
     19 
     20 #if defined(_WIN64)
     21 extern NtMapViewOfSectionFunction g_nt_map_view_of_section_func;
     22 #endif
     23 
     24 // Attempts to leave a beacon in the current user's registry hive. If the
     25 // blacklist beacon doesn't say it is enabled or there are any other errors when
     26 // creating the beacon, returns false. Otherwise returns true. The intent of the
     27 // beacon is to act as an extra failure mode protection whereby if Chrome
     28 // repeatedly fails to start during blacklist setup, it will skip blacklisting
     29 // on the subsequent run.
     30 bool LeaveSetupBeacon();
     31 
     32 // Looks for the setup running beacon that LeaveSetupBeacon() creates and resets
     33 // it to to show the setup was successful.
     34 // Returns true if the beacon was successfully set to BLACKLIST_ENABLED.
     35 bool ResetBeacon();
     36 
     37 // Return the size of the current blacklist.
     38 int BlacklistSize();
     39 
     40 // Returns if true if the blacklist has been initialized.
     41 extern "C" bool IsBlacklistInitialized();
     42 
     43 // Adds the given dll name to the blacklist. Returns true if the dll name is in
     44 // the blacklist when this returns, false on error. Note that this will copy
     45 // |dll_name| and will leak it on exit if the string is not subsequently removed
     46 // using RemoveDllFromBlacklist.
     47 // Exposed for testing only, this shouldn't be exported from chrome_elf.dll.
     48 extern "C" bool AddDllToBlacklist(const wchar_t* dll_name);
     49 
     50 // Removes the given dll name from the blacklist. Returns true if it was
     51 // removed, false on error.
     52 // Exposed for testing only, this shouldn't be exported from chrome_elf.dll.
     53 extern "C" bool RemoveDllFromBlacklist(const wchar_t* dll_name);
     54 
     55 // Returns a list of all the dlls that have been successfully blocked by the
     56 // blacklist via blocked_dlls, if there is enough space (according to |size|).
     57 // |size| will always be modified to be the number of dlls that were blocked.
     58 // The caller doesn't own the strings and isn't expected to free them. These
     59 // strings won't be hanging unless RemoveDllFromBlacklist is called, but it
     60 // is only exposed in tests (and should stay that way).
     61 extern "C" void SuccessfullyBlocked(const wchar_t** blocked_dlls, int* size);
     62 
     63 // Add the dlls, originally passed in through finch, from the registry to the
     64 // blacklist so that they will be blocked identically to those hard coded in.
     65 extern "C" bool AddDllsFromRegistryToBlacklist();
     66 
     67 // Record that the dll at the given index was blocked.
     68 void BlockedDll(size_t blocked_index);
     69 
     70 // Initializes the DLL blacklist in the current process. This should be called
     71 // before any undesirable DLLs might be loaded. If |force| is set to true, then
     72 // initialization will take place even if a beacon is present. This is useful
     73 // for tests.
     74 bool Initialize(bool force);
     75 
     76 }  // namespace blacklist
     77 
     78 #endif  // CHROME_ELF_BLACKLIST_BLACKLIST_H_
     79