1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/install_verification/win/loaded_modules_snapshot.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <Windows.h> 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <algorithm> 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <vector> 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/callback_helpers.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/install_verification/win/module_verification_test.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST(LoadedModulesSnapshotTest, TestCase) { 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<HMODULE> snapshot; 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(GetLoadedModulesSnapshot(&snapshot)); 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t original_snapshot_size = snapshot.size(); 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_GT(original_snapshot_size, 0u); 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) snapshot.clear(); 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Load in a new module. Pick msvidc32.dll as it is present from WinXP to 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Win8 and yet rarely used. 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(NULL, ::GetModuleHandle(L"msvidc32.dll")); 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) HMODULE new_dll = ::LoadLibrary(L"msvidc32.dll"); 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NE(static_cast<HMODULE>(NULL), new_dll); 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::ScopedClosureRunner release_new_dll( 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(base::IgnoreResult(&::FreeLibrary), new_dll)); 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(GetLoadedModulesSnapshot(&snapshot)); 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_GT(snapshot.size(), original_snapshot_size); 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NE(snapshot.end(), 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::find(snapshot.begin(), snapshot.end(), new_dll)); 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 38