OBJECTHANDLE ohCCW = NULL;
+#ifdef FEATURE_COMWRAPPERS
+ if (DACTryGetComWrappersHandleFromCCW(ccwPtr, &ohCCW) != S_OK)
+ {
+#endif
#ifdef FEATURE_COMINTEROP
ComCallWrapper *pCCW = DACGetCCWFromAddress(ccwPtr);
if (pCCW)
ohCCW = pCCW->GetObjectHandle();
}
#endif
+#ifdef FEATURE_COMWRAPPERS
+ }
+#endif
VMPTR_OBJECTHANDLE vmObjHandle;
vmObjHandle.SetDacTargetPtr(ohCCW);
static LONG s_procInit;
+protected:
+#ifdef FEATURE_COMWRAPPERS
+ HRESULT DACTryGetComWrappersHandleFromCCW(CLRDATA_ADDRESS ccwPtr, OBJECTHANDLE* objHandle);
+#endif
+
public:
// APIs for picking up the info needed for a debugger to look up an ngen image or IL image
// from it's search path.
return managedObjectWrapperPtr;
}
-HRESULT ClrDataAccess::DACTryGetComWrappersObjectFromCCW(CLRDATA_ADDRESS ccwPtr, OBJECTREF* objRef)
+HRESULT ClrDataAccess::DACTryGetComWrappersHandleFromCCW(CLRDATA_ADDRESS ccwPtr, OBJECTHANDLE* objHandle)
{
- if (ccwPtr == 0 || objRef == NULL)
- return E_INVALIDARG;
+ HRESULT hr = E_FAIL;
+ TADDR ccw, managedObjectWrapperPtr;
+ ULONG32 bytesRead = 0;
+ OBJECTHANDLE handle;
- SOSDacEnter();
+ if (ccwPtr == 0 || objHandle == NULL)
+ {
+ hr = E_INVALIDARG;
+ goto ErrExit;
+ }
if (!DACIsComWrappersCCW(ccwPtr))
{
goto ErrExit;
}
- TADDR ccw = CLRDATA_ADDRESS_TO_TADDR(ccwPtr);
+ ccw = CLRDATA_ADDRESS_TO_TADDR(ccwPtr);
// Return ManagedObjectWrapper as an OBJECTHANDLE. (The OBJECTHANDLE is guaranteed to live at offset 0).
- TADDR managedObjectWrapperPtr = DACGetManagedObjectWrapperFromCCW(ccwPtr);
+ managedObjectWrapperPtr = DACGetManagedObjectWrapperFromCCW(ccwPtr);
if (managedObjectWrapperPtr == NULL)
{
hr = E_FAIL;
goto ErrExit;
}
- ULONG32 bytesRead = 0;
- OBJECTHANDLE handle;
IfFailGo(m_pTarget->ReadVirtual(managedObjectWrapperPtr, (PBYTE)&handle, sizeof(OBJECTHANDLE), &bytesRead));
if (bytesRead != sizeof(OBJECTHANDLE))
{
goto ErrExit;
}
- *objRef = ObjectFromHandle(handle);
+ *objHandle = handle;
- SOSDacLeave();
+ return S_OK;
+
+ErrExit: return hr;
+}
+
+HRESULT ClrDataAccess::DACTryGetComWrappersObjectFromCCW(CLRDATA_ADDRESS ccwPtr, OBJECTREF* objRef)
+{
+ HRESULT hr = E_FAIL;
+
+ if (ccwPtr == 0 || objRef == NULL)
+ {
+ hr = E_INVALIDARG;
+ goto ErrExit;
+ }
+
+ OBJECTHANDLE handle;
+ if (DACTryGetComWrappersHandleFromCCW(ccwPtr, &handle) != S_OK)
+ {
+ hr = E_FAIL;
+ goto ErrExit;
+ }
+
+ *objRef = ObjectFromHandle(handle);
return S_OK;