diff options
Diffstat (limited to 'src/ToolBox/SOS/Strike/util.cpp')
-rw-r--r-- | src/ToolBox/SOS/Strike/util.cpp | 52 |
1 files changed, 22 insertions, 30 deletions
diff --git a/src/ToolBox/SOS/Strike/util.cpp b/src/ToolBox/SOS/Strike/util.cpp index 59ede3e72f..8722845a72 100644 --- a/src/ToolBox/SOS/Strike/util.cpp +++ b/src/ToolBox/SOS/Strike/util.cpp @@ -62,10 +62,6 @@ IXCLRDataProcess *g_clrData = NULL; ISOSDacInterface *g_sos = NULL; ICorDebugProcess *g_pCorDebugProcess = NULL; -#ifdef FEATURE_PAL -PFN_CLRDataCreateInstance g_pCLRDataCreateInstance = NULL; -#endif // FEATURE_PAL - #ifndef IfFailRet #define IfFailRet(EXPR) do { Status = (EXPR); if(FAILED(Status)) { return (Status); } } while (0) #endif @@ -4156,8 +4152,10 @@ void ResetGlobals(void) HRESULT LoadClrDebugDll(void) { + HRESULT hr = S_OK; #ifdef FEATURE_PAL - if (g_pCLRDataCreateInstance == NULL) + static IXCLRDataProcess* s_clrDataProcess = NULL; + if (s_clrDataProcess == NULL) { int err = PAL_InitializeDLL(); if(err != 0) @@ -4173,20 +4171,27 @@ HRESULT LoadClrDebugDll(void) { return E_FAIL; } - g_pCLRDataCreateInstance = (PFN_CLRDataCreateInstance)GetProcAddress(hdac, "CLRDataCreateInstance"); - if (g_pCLRDataCreateInstance == NULL) + PFN_CLRDataCreateInstance pCLRDataCreateInstance = (PFN_CLRDataCreateInstance)GetProcAddress(hdac, "CLRDataCreateInstance"); + if (pCLRDataCreateInstance == NULL) { FreeLibrary(hdac); return E_FAIL; } + ICLRDataTarget *target = new DataTarget(); + hr = pCLRDataCreateInstance(__uuidof(IXCLRDataProcess), target, (void**)&s_clrDataProcess); + if (FAILED(hr)) + { + s_clrDataProcess = NULL; + return hr; + } + ULONG32 flags = 0; + s_clrDataProcess->GetOtherNotificationFlags(&flags); + flags |= (CLRDATA_NOTIFY_ON_MODULE_LOAD | CLRDATA_NOTIFY_ON_MODULE_UNLOAD | CLRDATA_NOTIFY_ON_EXCEPTION); + s_clrDataProcess->SetOtherNotificationFlags(flags); } - ICLRDataTarget *target = new DataTarget(); - HRESULT hr = g_pCLRDataCreateInstance(__uuidof(IXCLRDataProcess), target, reinterpret_cast<void**>(&g_clrData)); - if (FAILED(hr)) - { - g_clrData = NULL; - return hr; - } + g_clrData = s_clrDataProcess; + g_clrData->AddRef(); + g_clrData->Flush(); #else WDBGEXTS_CLR_DATA_INTERFACE Query; @@ -4198,13 +4203,12 @@ HRESULT LoadClrDebugDll(void) g_clrData = (IXCLRDataProcess*)Query.Iface; #endif - - if (FAILED(g_clrData->QueryInterface(__uuidof(ISOSDacInterface), (void**)&g_sos))) + hr = g_clrData->QueryInterface(__uuidof(ISOSDacInterface), (void**)&g_sos); + if (FAILED(hr)) { g_sos = NULL; - return E_FAIL; + return hr; } - return S_OK; } @@ -4769,18 +4773,6 @@ HRESULT InitCorDebugInterface() UninitCorDebugInterface(); } - // Ensure that CLR and DAC are already loaded - if ((hr = CheckEEDll()) != S_OK) - { - EENotLoadedMessage(hr); - return hr; - } - if ((hr = LoadClrDebugDll()) != S_OK) - { - DACMessage(hr); - return hr; - } - // SOS now has a statically linked version of the loader code that is normally found in mscoree/mscoreei.dll // Its not much code and takes a big step towards 0 install dependencies // Need to pick the appropriate SKU of CLR to detect |