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