185be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// Copyright 2013 Google Inc. All rights reserved. 285be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// 385be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// Redistribution and use in source and binary forms, with or without 485be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// modification, are permitted provided that the following conditions are 585be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// met: 685be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// 785be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// * Redistributions of source code must retain the above copyright 885be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// notice, this list of conditions and the following disclaimer. 985be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// * Redistributions in binary form must reproduce the above 1085be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// copyright notice, this list of conditions and the following disclaimer 1185be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// in the documentation and/or other materials provided with the 1285be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// distribution. 1385be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// * Neither the name of Google Inc. nor the names of its 1485be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// contributors may be used to endorse or promote products derived from 1585be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// this software without specific prior written permission. 1685be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// 1785be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1885be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1985be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2085be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2185be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2285be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2385be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2485be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2585be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2685be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2785be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2885be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 2985be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org#include "common/windows/dia_util.h" 3085be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 3185be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org#include <atlbase.h> 3285be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 3385be25b17ef145142197007edb785f236f5844d9chrisha@chromium.orgnamespace google_breakpad { 3485be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 3585be25b17ef145142197007edb785f236f5844d9chrisha@chromium.orgbool FindDebugStream(const wchar_t* name, 3685be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org IDiaSession* session, 3785be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org IDiaEnumDebugStreamData** debug_stream) { 3885be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org CComPtr<IDiaEnumDebugStreams> enum_debug_streams; 3985be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org if (FAILED(session->getEnumDebugStreams(&enum_debug_streams))) { 4085be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org fprintf(stderr, "IDiaSession::getEnumDebugStreams failed\n"); 4185be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org return false; 4285be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org } 4385be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 4485be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org CComPtr<IDiaEnumDebugStreamData> temp_debug_stream; 4585be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org ULONG fetched = 0; 4685be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org while (SUCCEEDED(enum_debug_streams->Next(1, &temp_debug_stream, &fetched)) && 4785be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org fetched == 1) { 4885be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org CComBSTR stream_name; 4985be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org if (FAILED(temp_debug_stream->get_name(&stream_name))) { 5085be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org fprintf(stderr, "IDiaEnumDebugStreamData::get_name failed\n"); 5185be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org return false; 5285be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org } 5385be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 5485be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org // Found the stream? 5585be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org if (wcsncmp((LPWSTR)stream_name, name, stream_name.Length()) == 0) { 5685be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org *debug_stream = temp_debug_stream.Detach(); 5785be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org return true; 5885be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org } 5985be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 6085be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org temp_debug_stream.Release(); 6185be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org } 6285be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 6385be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org // No table was found. 6485be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org return false; 6585be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org} 6685be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 6785be25b17ef145142197007edb785f236f5844d9chrisha@chromium.orgbool FindTable(REFIID iid, IDiaSession* session, void** table) { 6885be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org // Get the table enumerator. 6985be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org CComPtr<IDiaEnumTables> enum_tables; 7085be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org if (FAILED(session->getEnumTables(&enum_tables))) { 7185be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org fprintf(stderr, "IDiaSession::getEnumTables failed\n"); 7285be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org return false; 7385be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org } 7485be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 7585be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org // Iterate through the tables. 7685be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org CComPtr<IDiaTable> temp_table; 7785be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org ULONG fetched = 0; 7885be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org while (SUCCEEDED(enum_tables->Next(1, &temp_table, &fetched)) && 7985be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org fetched == 1) { 8085be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org void* temp = NULL; 8185be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org if (SUCCEEDED(temp_table->QueryInterface(iid, &temp))) { 8285be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org *table = temp; 8385be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org return true; 8485be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org } 8585be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org temp_table.Release(); 8685be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org } 8785be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 8885be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org // The table was not found. 8985be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org return false; 9085be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org} 9185be25b17ef145142197007edb785f236f5844d9chrisha@chromium.org 92c5edab4aba29171b5adf0876e59f242072b419c7ivanpe@chromium.org} // namespace google_breakpad