Home | History | Annotate | Download | only in windows
      1 // Copyright 2013 Google Inc. All rights reserved.
      2 //
      3 // Redistribution and use in source and binary forms, with or without
      4 // modification, are permitted provided that the following conditions are
      5 // met:
      6 //
      7 //     * Redistributions of source code must retain the above copyright
      8 // notice, this list of conditions and the following disclaimer.
      9 //     * Redistributions in binary form must reproduce the above
     10 // copyright notice, this list of conditions and the following disclaimer
     11 // in the documentation and/or other materials provided with the
     12 // distribution.
     13 //     * Neither the name of Google Inc. nor the names of its
     14 // contributors may be used to endorse or promote products derived from
     15 // this software without specific prior written permission.
     16 //
     17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 
     29 #include "common/windows/dia_util.h"
     30 
     31 #include <atlbase.h>
     32 
     33 namespace google_breakpad {
     34 
     35 bool FindDebugStream(const wchar_t* name,
     36                      IDiaSession* session,
     37                      IDiaEnumDebugStreamData** debug_stream) {
     38   CComPtr<IDiaEnumDebugStreams> enum_debug_streams;
     39   if (FAILED(session->getEnumDebugStreams(&enum_debug_streams))) {
     40     fprintf(stderr, "IDiaSession::getEnumDebugStreams failed\n");
     41     return false;
     42   }
     43 
     44   CComPtr<IDiaEnumDebugStreamData> temp_debug_stream;
     45   ULONG fetched = 0;
     46   while (SUCCEEDED(enum_debug_streams->Next(1, &temp_debug_stream, &fetched)) &&
     47          fetched == 1) {
     48     CComBSTR stream_name;
     49     if (FAILED(temp_debug_stream->get_name(&stream_name))) {
     50       fprintf(stderr, "IDiaEnumDebugStreamData::get_name failed\n");
     51       return false;
     52     }
     53 
     54     // Found the stream?
     55     if (wcsncmp((LPWSTR)stream_name, name, stream_name.Length()) == 0) {
     56       *debug_stream = temp_debug_stream.Detach();
     57       return true;
     58     }
     59 
     60     temp_debug_stream.Release();
     61   }
     62 
     63   // No table was found.
     64   return false;
     65 }
     66 
     67 bool FindTable(REFIID iid, IDiaSession* session, void** table) {
     68   // Get the table enumerator.
     69   CComPtr<IDiaEnumTables> enum_tables;
     70   if (FAILED(session->getEnumTables(&enum_tables))) {
     71     fprintf(stderr, "IDiaSession::getEnumTables failed\n");
     72     return false;
     73   }
     74 
     75   // Iterate through the tables.
     76   CComPtr<IDiaTable> temp_table;
     77   ULONG fetched = 0;
     78   while (SUCCEEDED(enum_tables->Next(1, &temp_table, &fetched)) &&
     79          fetched == 1) {
     80     void* temp = NULL;
     81     if (SUCCEEDED(temp_table->QueryInterface(iid, &temp))) {
     82       *table = temp;
     83       return true;
     84     }
     85     temp_table.Release();
     86   }
     87 
     88   // The table was not found.
     89   return false;
     90 }
     91 
     92 }  // namespace google_breakpad