82 lines
1.9 KiB
C++
82 lines
1.9 KiB
C++
|
|
#ifndef MSDIA_HPP
|
|
#define MSDIA_HPP
|
|
|
|
#include "pdbaccess.hpp"
|
|
#include "pdblocal.hpp"
|
|
|
|
//----------------------------------------------------------------------------
|
|
struct pdb_session_t
|
|
{
|
|
HMODULE dia_hmod;
|
|
int refcount;
|
|
local_pdb_access_t *pdb_access;
|
|
|
|
pdb_session_t()
|
|
: dia_hmod(NULL),
|
|
refcount(1),
|
|
pdb_access(NULL),
|
|
pSource(NULL)
|
|
{
|
|
session_count++;
|
|
}
|
|
~pdb_session_t();
|
|
|
|
HRESULT open_session(const pdbargs_t &pdbargs);
|
|
void close();
|
|
const char *get_used_fname() const { return used_fname.begin(); }
|
|
|
|
private:
|
|
DECLARE_UNCOPYABLE(pdb_session_t)
|
|
HRESULT create_dia_source(int *dia_version);
|
|
|
|
IDiaDataSource *pSource;
|
|
qwstring winput;
|
|
qwstring wspath;
|
|
enum load_data_type_t
|
|
{
|
|
EXE_LOCAL,
|
|
MEM_LOCAL, // PDB_PLUGIN
|
|
EXE_WIN32, // PDB_WIN32_SERVER
|
|
MEM_WIN32, // PDB_WIN32_SERVER
|
|
};
|
|
HRESULT load_data_for_exe(const pdbargs_t &pdbargs, load_data_type_t type);
|
|
HRESULT load_input_path(const pdbargs_t &pdbargs, const char *input_path);
|
|
|
|
// The total number of different PDB sessions; kept track of
|
|
// in order to know when we can safely CoUninitialize().
|
|
static int session_count;
|
|
|
|
// Whether COM is initialized in this thread.
|
|
static bool co_initialized;
|
|
#ifdef _DEBUG
|
|
public:
|
|
qstring _pdb_path;
|
|
#endif
|
|
qstring used_fname;
|
|
};
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
class pdb_session_ref_t
|
|
{
|
|
public:
|
|
pdb_session_t *session; // refcounted object
|
|
|
|
pdb_session_ref_t(void) : session(NULL) {}
|
|
pdb_session_ref_t(const pdb_session_ref_t &r);
|
|
~pdb_session_ref_t();
|
|
|
|
pdb_session_ref_t &operator=(const pdb_session_ref_t &r);
|
|
void create_session();
|
|
void close();
|
|
bool empty() const { return session == NULL; }
|
|
bool opened() const { return !empty() && session->pdb_access != NULL; }
|
|
HRESULT open_session(const pdbargs_t &args);
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
const char *pdberr(int code);
|
|
|
|
#endif
|