summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--CMakeLists.txt7
-rw-r--r--src/debug/daccess/ddunpack.cpp4048
-rw-r--r--src/debug/daccess/ddunpack.h411
-rw-r--r--src/debug/debug-pal/.gitmirror1
-rw-r--r--src/debug/debug-pal/CMakeLists.txt32
-rw-r--r--src/debug/debug-pal/unix/.gitmirror1
-rw-r--r--src/debug/debug-pal/unix/dynamiclibaddress.cpp81
-rw-r--r--src/debug/debug-pal/unix/twowaypipe.cpp172
-rw-r--r--src/debug/debug-pal/unix/windefs.h13
-rw-r--r--src/debug/debug-pal/win/.gitmirror1
-rw-r--r--src/debug/debug-pal/win/twowaypipe.cpp211
-rw-r--r--src/debug/di/CMakeLists.txt2
-rw-r--r--src/debug/di/cordb.cpp60
-rw-r--r--src/debug/di/dbgtransportmanager.cpp1929
-rw-r--r--src/debug/di/dbgtransportmanager.h225
-rw-r--r--src/debug/di/dbgtransportpipeline.cpp54
-rw-r--r--src/debug/di/ddpack.cpp3731
-rw-r--r--src/debug/di/ddpack.h346
-rw-r--r--src/debug/di/eventchannel.h2
-rw-r--r--src/debug/di/platformspecific.cpp2
-rw-r--r--src/debug/di/process.cpp67
-rw-r--r--src/debug/di/remoteeventchannel.cpp21
-rw-r--r--src/debug/di/shimlocaldatatarget.cpp4
-rw-r--r--src/debug/di/shimpriv.h4
-rw-r--r--src/debug/di/shimprocess.cpp30
-rw-r--r--src/debug/di/shimremotedatatarget.cpp43
-rw-r--r--src/debug/ee/CMakeLists.txt9
-rw-r--r--src/debug/ee/dbgtransportproxy.cpp122
-rw-r--r--src/debug/ee/dbgtransportproxy.h51
-rw-r--r--src/debug/ee/ddunpack.cpp4578
-rw-r--r--src/debug/ee/ddunpack.h498
-rw-r--r--src/debug/ee/debugger.cpp227
-rw-r--r--src/debug/ee/debugger.h34
-rw-r--r--src/debug/ee/inprocdac.cpp432
-rw-r--r--src/debug/ee/inprocdac.h157
-rw-r--r--src/debug/ee/rcthread.cpp326
-rw-r--r--src/debug/inc/coreclrremotedebugginginterfaces.h43
-rw-r--r--src/debug/inc/dbgtransportsession.h86
-rw-r--r--src/debug/inc/ddmarshalutil.h14
-rw-r--r--src/debug/inc/ddshared.h155
-rw-r--r--src/debug/inc/debug-pal.h16
-rw-r--r--src/debug/inc/twowaypipe.h99
-rw-r--r--src/debug/shared/dbgtransportsession.cpp593
-rw-r--r--src/debug/shared/utils.cpp4
-rw-r--r--src/dlls/mscordbi/CMakeLists.txt1
-rw-r--r--src/dlls/mscordbi/mscordbi.src3
-rw-r--r--src/dlls/mscoree/coreclr/CMakeLists.txt1
-rw-r--r--src/inc/clrconfigvalues.h2
-rw-r--r--src/inc/dbgproxy.h389
-rw-r--r--src/utilcode/CMakeLists.txt2
-rw-r--r--src/utilcode/staticnohost/CMakeLists.txt8
-rw-r--r--src/utilcode/winfix.cpp106
53 files changed, 1285 insertions, 18172 deletions
diff --git a/.gitignore b/.gitignore
index e69eb76426..137c9100dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -248,6 +248,9 @@ Temporary Items
# We have some checked in prebuilt generated files
!src/pal/prebuilt/idl/*_i.c
+# Valid 'debug' folder, that contains CLR debuggin code
+!src/debug
+
# Ignore folders created by the test build
TestWrappers_x64_debug
TestWrappers_x64_release
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d8c704daac..8e44374131 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -294,6 +294,8 @@ add_compile_options(-fms-extensions )
add_compile_options(-Wno-incompatible-ms-struct)
endif(CLR_CMAKE_PLATFORM_UNIX)
+add_subdirectory(src/debug/debug-pal)
+
# Include directory directives
# Include the basic prebuilt headers - required for getting fileversion resource details.
@@ -459,6 +461,11 @@ add_definitions(-DFEATURE_MULTICOREJIT)
add_definitions(-DFEATURE_USE_ASM_GC_WRITE_BARRIERS)
add_definitions(-DFEATURE_SYMDIFF)
+if(CLR_CMAKE_PLATFORM_UNIX)
+ add_definitions(-DFEATURE_DBGIPC_TRANSPORT_DI)
+ add_definitions(-DFEATURE_DBGIPC_TRANSPORT_VM)
+endif(CLR_CMAKE_PLATFORM_UNIX)
+
if (IS_64BIT_BUILD EQUAL 1)
add_definitions(-D_AMD64_)
add_definitions(-D_AMD64_SIMULATOR_)
diff --git a/src/debug/daccess/ddunpack.cpp b/src/debug/daccess/ddunpack.cpp
deleted file mode 100644
index 9c2fa48c96..0000000000
--- a/src/debug/daccess/ddunpack.cpp
+++ /dev/null
@@ -1,4048 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-// Unpacker
-//
-// Lives on EE side of the fence
-//
-// Note that this file is generated by ndp\clr\src\Debug\tools\BuildDDMarshal\.
-// Changes should be made to output\DDUnpack_template.cpp in that directory.
-//
-
-
-#include "stdafx.h"
-
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
-#include "dacdbiinterface.h"
-
-#include "ddshared.h"
-
-#include "ddmarshalutil.h"
-
-#include "ddunpack.h"
-
-#include "../shared/stringcopyholder.cpp"
-
-// Suppress PREFast warning about overly large function
-// These functions are automatically generated.
-#if defined(_PREFAST_)
-#pragma warning(disable:21000)
-#endif
-
-// general callback for Callback functions.
-template <class T>
-void GeneralEnumerationCallback(T vmAppDomain, void * pUserData)
-{
- WriteBuffer * pResult = (WriteBuffer *) pUserData;
-
- DWORD dw = 1; // Continue
- WriteToBuffer(pResult, dw);
- WriteToBuffer(pResult, vmAppDomain);
-}
-
-
-
-
-//
-// These stubs are called by the handler
-//
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT CheckDbiVersion(const DbiVersion * pVersion)
-void DDUnpack::Unpack_CheckDbiVersion(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- DbiVersion _pVersion; // storage
- const DbiVersion * pVersion = &_pVersion;
- ReadFromBuffer(pSend, &_pVersion); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->CheckDbiVersion(pVersion); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method CheckDbiVersion
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT FlushCache()
-void DDUnpack::Unpack_FlushCache(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->FlushCache(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method FlushCache
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void DacSetTargetConsistencyChecks(bool fEnableAsserts)
-void DDUnpack::Unpack_DacSetTargetConsistencyChecks(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- bool fEnableAsserts;
- ReadFromBuffer(pSend, fEnableAsserts);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->DacSetTargetConsistencyChecks(fEnableAsserts); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method DacSetTargetConsistencyChecks
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void Destroy()
-void DDUnpack::Unpack_Destroy(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->Destroy(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method Destroy
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsLeftSideInitialized()
-void DDUnpack::Unpack_IsLeftSideInitialized(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsLeftSideInitialized(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsLeftSideInitialized
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_AppDomain GetAppDomainFromId(ULONG appdomainId)
-void DDUnpack::Unpack_GetAppDomainFromId(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- ULONG appdomainId;
- ReadFromBuffer(pSend, appdomainId);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_AppDomain _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAppDomainFromId(appdomainId); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainFromId
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// ULONG GetAppDomainId(VMPTR_AppDomain vmAppDomain)
-void DDUnpack::Unpack_GetAppDomainId(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- ULONG _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAppDomainId(vmAppDomain); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainId
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_OBJECTHANDLE GetAppDomainObject(VMPTR_AppDomain vmAppDomain)
-void DDUnpack::Unpack_GetAppDomainObject(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_OBJECTHANDLE _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAppDomainObject(vmAppDomain); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainObject
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsDefaultDomain(VMPTR_AppDomain vmAppDomain)
-void DDUnpack::Unpack_IsDefaultDomain(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsDefaultDomain(vmAppDomain); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsDefaultDomain
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetAssemblyFromDomainAssembly(VMPTR_DomainAssembly vmDomainAssembly, VMPTR_Assembly * vmAssembly)
-void DDUnpack::Unpack_GetAssemblyFromDomainAssembly(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_DomainAssembly vmDomainAssembly;
- ReadFromBuffer(pSend, vmDomainAssembly);
- VMPTR_Assembly _vmAssembly; // storage
- VMPTR_Assembly * vmAssembly = &_vmAssembly;
- // vmAssembly does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetAssemblyFromDomainAssembly(vmDomainAssembly, vmAssembly); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, vmAssembly);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAssemblyFromDomainAssembly
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsAssemblyFullyTrusted(VMPTR_DomainAssembly vmDomainAssembly)
-void DDUnpack::Unpack_IsAssemblyFullyTrusted(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_DomainAssembly vmDomainAssembly;
- ReadFromBuffer(pSend, vmDomainAssembly);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsAssemblyFullyTrusted(vmDomainAssembly); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsAssemblyFullyTrusted
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetAppDomainFullName(VMPTR_AppDomain vmAppDomain, IStringHolder * pStrName)
-void DDUnpack::Unpack_GetAppDomainFullName(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- StringCopyHolder _pStrName; // storage
- StringCopyHolder* pStrName = &_pStrName;
- // pStrName does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetAppDomainFullName(vmAppDomain, pStrName); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pStrName);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainFullName
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetModuleSimpleName(VMPTR_Module vmModule, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetModuleSimpleName(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetModuleSimpleName(vmModule, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetModuleSimpleName
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL GetAssemblyPath(VMPTR_Assembly vmAssembly, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetAssemblyPath(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Assembly vmAssembly;
- ReadFromBuffer(pSend, vmAssembly);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAssemblyPath(vmAssembly, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAssemblyPath
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void ResolveTypeReference(const TypeRefData * pTypeRefInfo, TypeRefData * pTargetRefInfo)
-void DDUnpack::Unpack_ResolveTypeReference(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- TypeRefData _pTypeRefInfo; // storage
- const TypeRefData * pTypeRefInfo = &_pTypeRefInfo;
- ReadFromBuffer(pSend, &_pTypeRefInfo); // serialize to storage
- TypeRefData _pTargetRefInfo; // storage
- TypeRefData * pTargetRefInfo = &_pTargetRefInfo;
- ReadFromBuffer(pSend, &_pTargetRefInfo); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->ResolveTypeReference(pTypeRefInfo, pTargetRefInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTargetRefInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method ResolveTypeReference
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL GetModulePath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetModulePath(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetModulePath(vmModule, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetModulePath
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL GetModuleNGenPath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetModuleNGenPath(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetModuleNGenPath(vmModule, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetModuleNGenPath
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetMetadata(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer)
-void DDUnpack::Unpack_GetMetadata(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- TargetBuffer _pTargetBuffer; // storage
- TargetBuffer * pTargetBuffer = &_pTargetBuffer;
- // pTargetBuffer does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetMetadata(vmModule, pTargetBuffer); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTargetBuffer);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetMetadata
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetSymbolsBuffer(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer, IDacDbiInterface::SymbolFormat * pSymbolFormat)
-void DDUnpack::Unpack_GetSymbolsBuffer(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- TargetBuffer _pTargetBuffer; // storage
- TargetBuffer * pTargetBuffer = &_pTargetBuffer;
- // pTargetBuffer does not need to be copied on input
- IDacDbiInterface::SymbolFormat _pSymbolFormat; // storage
- IDacDbiInterface::SymbolFormat * pSymbolFormat = &_pSymbolFormat;
- // pSymbolFormat does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetSymbolsBuffer(vmModule, pTargetBuffer, pSymbolFormat); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTargetBuffer);
- WriteToBuffer(pResult, pSymbolFormat);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetSymbolsBuffer
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetModuleData(VMPTR_Module vmModule, ModuleInfo * pData)
-void DDUnpack::Unpack_GetModuleData(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- ModuleInfo _pData; // storage
- ModuleInfo * pData = &_pData;
- // pData does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetModuleData(vmModule, pData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetModuleData
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetDomainFileData(VMPTR_DomainFile vmDomainFile, DomainFileInfo * pData)
-void DDUnpack::Unpack_GetDomainFileData(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- DomainFileInfo _pData; // storage
- DomainFileInfo * pData = &_pData;
- // pData does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetDomainFileData(vmDomainFile, pData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetDomainFileData
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetModuleForDomainFile(VMPTR_DomainFile vmDomainFile, VMPTR_Module * pModule)
-void DDUnpack::Unpack_GetModuleForDomainFile(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- VMPTR_Module _pModule; // storage
- VMPTR_Module * pModule = &_pModule;
- // pModule does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetModuleForDomainFile(vmDomainFile, pModule); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pModule);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetModuleForDomainFile
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// IDacDbiInterface::AddressType GetAddressType(CORDB_ADDRESS address)
-void DDUnpack::Unpack_GetAddressType(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS address;
- ReadFromBuffer(pSend, address);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- IDacDbiInterface::AddressType _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAddressType(address); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAddressType
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsTransitionStub(CORDB_ADDRESS address)
-void DDUnpack::Unpack_IsTransitionStub(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS address;
- ReadFromBuffer(pSend, address);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsTransitionStub(address); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsTransitionStub
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL * pfAllowJITOpts, BOOL * pfEnableEnC)
-void DDUnpack::Unpack_GetCompilerFlags(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- BOOL _pfAllowJITOpts; // storage
- BOOL * pfAllowJITOpts = &_pfAllowJITOpts;
- // pfAllowJITOpts does not need to be copied on input
- BOOL _pfEnableEnC; // storage
- BOOL * pfEnableEnC = &_pfEnableEnC;
- // pfEnableEnC does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetCompilerFlags(vmDomainFile, pfAllowJITOpts, pfEnableEnC); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pfAllowJITOpts);
- WriteToBuffer(pResult, pfEnableEnC);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCompilerFlags
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT SetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL fAllowJitOpts, BOOL fEnableEnC)
-void DDUnpack::Unpack_SetCompilerFlags(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- BOOL fAllowJitOpts;
- ReadFromBuffer(pSend, fAllowJitOpts);
- BOOL fEnableEnC;
- ReadFromBuffer(pSend, fEnableEnC);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->SetCompilerFlags(vmDomainFile, fAllowJitOpts, fEnableEnC); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method SetCompilerFlags
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateAppDomains(IDacDbiInterface::FP_APPDOMAIN_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateAppDomains(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateAppDomains(GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateAppDomains
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateAssembliesInAppDomain(VMPTR_AppDomain vmAppDomain, IDacDbiInterface::FP_ASSEMBLY_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateAssembliesInAppDomain(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateAssembliesInAppDomain(vmAppDomain, GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateAssembliesInAppDomain
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateModulesInAssembly(VMPTR_DomainAssembly vmAssembly, IDacDbiInterface::FP_MODULE_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateModulesInAssembly(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_DomainAssembly vmAssembly;
- ReadFromBuffer(pSend, vmAssembly);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateModulesInAssembly(vmAssembly, GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateModulesInAssembly
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void RequestSyncAtEvent()
-void DDUnpack::Unpack_RequestSyncAtEvent(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->RequestSyncAtEvent(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method RequestSyncAtEvent
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void MarkDebuggerAttachPending()
-void DDUnpack::Unpack_MarkDebuggerAttachPending(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->MarkDebuggerAttachPending(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method MarkDebuggerAttachPending
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void MarkDebuggerAttached(BOOL fAttached)
-void DDUnpack::Unpack_MarkDebuggerAttached(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- BOOL fAttached;
- ReadFromBuffer(pSend, fAttached);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->MarkDebuggerAttached(fAttached); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method MarkDebuggerAttached
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void Hijack(VMPTR_Thread vmThread, ULONG32 dwThreadId, const EXCEPTION_RECORD * pRecord, T_CONTEXT * pOriginalContext, ULONG32 cbSizeContext, EHijackReason::EHijackReason reason, void * pUserData, CORDB_ADDRESS * pRemoteContextAddr)
-void DDUnpack::Unpack_Hijack(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Callbacks not yet implemented
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method Hijack
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateConnections(IDacDbiInterface::FP_CONNECTION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateConnections(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Callbacks not yet implemented
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateConnections
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateThreads(IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateThreads(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateThreads(GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateThreads
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool IsThreadMarkedDead(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_IsThreadMarkedDead(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsThreadMarkedDead(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsThreadMarkedDead
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HANDLE GetThreadHandle(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetThreadHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Callbacks not yet implemented
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetThreadHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_OBJECTHANDLE GetThreadObject(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetThreadObject(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_OBJECTHANDLE _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetThreadObject(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetThreadObject
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void SetDebugState(VMPTR_Thread vmThread, CorDebugThreadState debugState)
-void DDUnpack::Unpack_SetDebugState(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- CorDebugThreadState debugState;
- ReadFromBuffer(pSend, debugState);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->SetDebugState(vmThread, debugState); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method SetDebugState
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL HasUnhandledException(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_HasUnhandledException(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->HasUnhandledException(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method HasUnhandledException
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CorDebugUserState GetUserState(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetUserState(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CorDebugUserState _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetUserState(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetUserState
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CONNID GetConnectionID(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetConnectionID(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CONNID _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetConnectionID(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetConnectionID
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// TASKID GetTaskID(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetTaskID(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- TASKID _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetTaskID(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetTaskID
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// DWORD TryGetVolatileOSThreadID(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_TryGetVolatileOSThreadID(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- DWORD _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->TryGetVolatileOSThreadID(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method TryGetVolatileOSThreadID
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// DWORD GetUniqueThreadID(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetUniqueThreadID(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- DWORD _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetUniqueThreadID(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetUniqueThreadID
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_OBJECTHANDLE GetCurrentException(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetCurrentException(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_OBJECTHANDLE _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetCurrentException(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCurrentException
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_OBJECTHANDLE GetCurrentCustomDebuggerNotification(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetCurrentCustomDebuggerNotification(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_OBJECTHANDLE _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetCurrentCustomDebuggerNotification(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCurrentCustomDebuggerNotification
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_AppDomain GetCurrentAppDomain(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetCurrentAppDomain(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_AppDomain _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetCurrentAppDomain(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCurrentAppDomain
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_DomainAssembly ResolveAssembly(VMPTR_DomainFile vmScope, mdToken tkAssemblyRef)
-void DDUnpack::Unpack_ResolveAssembly(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_DomainFile vmScope;
- ReadFromBuffer(pSend, vmScope);
- mdToken tkAssemblyRef;
- ReadFromBuffer(pSend, tkAssemblyRef);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_DomainAssembly _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->ResolveAssembly(vmScope, tkAssemblyRef); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method ResolveAssembly
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetNativeCodeSequencePointsAndVarInfo(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS startAddress, BOOL fCodeAvailabe, NativeVarData * pNativeVarData, SequencePoints * pSequencePoints)
-void DDUnpack::Unpack_GetNativeCodeSequencePointsAndVarInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_MethodDesc vmMethodDesc;
- ReadFromBuffer(pSend, vmMethodDesc);
- CORDB_ADDRESS startAddress;
- ReadFromBuffer(pSend, startAddress);
- BOOL fCodeAvailabe;
- ReadFromBuffer(pSend, fCodeAvailabe);
- NativeVarData _pNativeVarData; // storage
- NativeVarData * pNativeVarData = &_pNativeVarData;
- // pNativeVarData does not need to be copied on input
- SequencePoints _pSequencePoints; // storage
- SequencePoints * pSequencePoints = &_pSequencePoints;
- // pSequencePoints does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetNativeCodeSequencePointsAndVarInfo(vmMethodDesc, startAddress, fCodeAvailabe, pNativeVarData, pSequencePoints); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pNativeVarData);
- WriteToBuffer(pResult, pSequencePoints);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetNativeCodeSequencePointsAndVarInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_CONTEXT GetManagedStoppedContext(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetManagedStoppedContext(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_CONTEXT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetManagedStoppedContext(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetManagedStoppedContext
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void CreateStackWalk(VMPTR_Thread vmThread, DT_CONTEXT * pInternalContextBuffer, StackWalkHandle * ppSFIHandle)
-void DDUnpack::Unpack_CreateStackWalk(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- DT_CONTEXT _pInternalContextBuffer; // storage
- DT_CONTEXT * pInternalContextBuffer = &_pInternalContextBuffer;
- ReadFromBuffer(pSend, &_pInternalContextBuffer); // serialize to storage
- StackWalkHandle _ppSFIHandle; // storage
- StackWalkHandle * ppSFIHandle = &_ppSFIHandle;
- // ppSFIHandle does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->CreateStackWalk(vmThread, pInternalContextBuffer, ppSFIHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pInternalContextBuffer);
- WriteToBuffer(pResult, ppSFIHandle);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method CreateStackWalk
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void DeleteStackWalk(StackWalkHandle ppSFIHandle)
-void DDUnpack::Unpack_DeleteStackWalk(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- StackWalkHandle ppSFIHandle;
- ReadFromBuffer(pSend, ppSFIHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->DeleteStackWalk(ppSFIHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method DeleteStackWalk
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetStackWalkCurrentContext(StackWalkHandle pSFIHandle, DT_CONTEXT * pContext)
-void DDUnpack::Unpack_GetStackWalkCurrentContext(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- StackWalkHandle pSFIHandle;
- ReadFromBuffer(pSend, pSFIHandle);
- DT_CONTEXT _pContext; // storage
- DT_CONTEXT * pContext = &_pContext;
- ReadFromBuffer(pSend, &_pContext); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetStackWalkCurrentContext(pSFIHandle, pContext); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pContext);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetStackWalkCurrentContext
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void SetStackWalkCurrentContext(VMPTR_Thread vmThread, StackWalkHandle pSFIHandle, CorDebugSetContextFlag flag, DT_CONTEXT * pContext)
-void DDUnpack::Unpack_SetStackWalkCurrentContext(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- StackWalkHandle pSFIHandle;
- ReadFromBuffer(pSend, pSFIHandle);
- CorDebugSetContextFlag flag;
- ReadFromBuffer(pSend, flag);
- DT_CONTEXT _pContext; // storage
- DT_CONTEXT * pContext = &_pContext;
- ReadFromBuffer(pSend, &_pContext); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->SetStackWalkCurrentContext(vmThread, pSFIHandle, flag, pContext); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pContext);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method SetStackWalkCurrentContext
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL UnwindStackWalkFrame(StackWalkHandle pSFIHandle)
-void DDUnpack::Unpack_UnwindStackWalkFrame(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- StackWalkHandle pSFIHandle;
- ReadFromBuffer(pSend, pSFIHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->UnwindStackWalkFrame(pSFIHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method UnwindStackWalkFrame
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT CheckContext(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
-void DDUnpack::Unpack_CheckContext(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- DT_CONTEXT _pContext; // storage
- const DT_CONTEXT * pContext = &_pContext;
- ReadFromBuffer(pSend, &_pContext); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->CheckContext(vmThread, pContext); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method CheckContext
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// IDacDbiInterface::FrameType GetStackWalkCurrentFrameInfo(StackWalkHandle pSFIHandle, DebuggerIPCE_STRData * pFrameData)
-void DDUnpack::Unpack_GetStackWalkCurrentFrameInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- StackWalkHandle pSFIHandle;
- ReadFromBuffer(pSend, pSFIHandle);
- DebuggerIPCE_STRData _pFrameData; // storage
- DebuggerIPCE_STRData * pFrameData = &_pFrameData;
- ReadFromBuffer(pSend, &_pFrameData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- IDacDbiInterface::FrameType _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetStackWalkCurrentFrameInfo(pSFIHandle, pFrameData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pFrameData);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetStackWalkCurrentFrameInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// ULONG32 GetCountOfInternalFrames(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetCountOfInternalFrames(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- ULONG32 _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetCountOfInternalFrames(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCountOfInternalFrames
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateInternalFrames(VMPTR_Thread vmThread, IDacDbiInterface::FP_INTERNAL_FRAME_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateInternalFrames(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateInternalFrames(vmThread, GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateInternalFrames
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsMatchingParentFrame(FramePointer fpToCheck, FramePointer fpParent)
-void DDUnpack::Unpack_IsMatchingParentFrame(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- FramePointer fpToCheck;
- ReadFromBuffer(pSend, fpToCheck);
- FramePointer fpParent;
- ReadFromBuffer(pSend, fpParent);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsMatchingParentFrame(fpToCheck, fpParent); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsMatchingParentFrame
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// ULONG32 GetStackParameterSize(CORDB_ADDRESS controlPC)
-void DDUnpack::Unpack_GetStackParameterSize(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS controlPC;
- ReadFromBuffer(pSend, controlPC);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- ULONG32 _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetStackParameterSize(controlPC); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetStackParameterSize
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// FramePointer GetFramePointer(StackWalkHandle pSFIHandle)
-void DDUnpack::Unpack_GetFramePointer(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- StackWalkHandle pSFIHandle;
- ReadFromBuffer(pSend, pSFIHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- FramePointer _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetFramePointer(pSFIHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetFramePointer
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsLeafFrame(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
-void DDUnpack::Unpack_IsLeafFrame(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- DT_CONTEXT _pContext; // storage
- const DT_CONTEXT * pContext = &_pContext;
- ReadFromBuffer(pSend, &_pContext); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsLeafFrame(vmThread, pContext); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsLeafFrame
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetContext(VMPTR_Thread vmThread, DT_CONTEXT * pContextBuffer)
-void DDUnpack::Unpack_GetContext(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- DT_CONTEXT _pContextBuffer; // storage
- DT_CONTEXT * pContextBuffer = &_pContextBuffer;
- ReadFromBuffer(pSend, &_pContextBuffer); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetContext(vmThread, pContextBuffer); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pContextBuffer);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetContext
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void ConvertContextToDebuggerRegDisplay(const DT_CONTEXT * pInContext, DebuggerREGDISPLAY * pOutDRD, BOOL fActive)
-void DDUnpack::Unpack_ConvertContextToDebuggerRegDisplay(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- DT_CONTEXT _pInContext; // storage
- const DT_CONTEXT * pInContext = &_pInContext;
- ReadFromBuffer(pSend, &_pInContext); // serialize to storage
- DebuggerREGDISPLAY _pOutDRD; // storage
- DebuggerREGDISPLAY * pOutDRD = &_pOutDRD;
- ReadFromBuffer(pSend, &_pOutDRD); // serialize to storage
- BOOL fActive;
- ReadFromBuffer(pSend, fActive);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->ConvertContextToDebuggerRegDisplay(pInContext, pOutDRD, fActive); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pOutDRD);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method ConvertContextToDebuggerRegDisplay
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// IDacDbiInterface::DynamicMethodType IsILStubOrLCGMethod(VMPTR_MethodDesc vmMethodDesc)
-void DDUnpack::Unpack_IsILStubOrLCGMethod(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_MethodDesc vmMethodDesc;
- ReadFromBuffer(pSend, vmMethodDesc);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- IDacDbiInterface::DynamicMethodType _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsILStubOrLCGMethod(vmMethodDesc); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsILStubOrLCGMethod
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// TargetBuffer GetVarArgSig(CORDB_ADDRESS VASigCookieAddr, CORDB_ADDRESS * pArgBase)
-void DDUnpack::Unpack_GetVarArgSig(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS VASigCookieAddr;
- ReadFromBuffer(pSend, VASigCookieAddr);
- CORDB_ADDRESS _pArgBase; // storage
- CORDB_ADDRESS * pArgBase = &_pArgBase;
- // pArgBase does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- TargetBuffer _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetVarArgSig(VASigCookieAddr, pArgBase); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pArgBase);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetVarArgSig
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// GENERICS_TYPE_TOKEN ResolveExactGenericArgsToken(DWORD dwExactGenericArgsTokenIndex, GENERICS_TYPE_TOKEN rawToken)
-void DDUnpack::Unpack_ResolveExactGenericArgsToken(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- DWORD dwExactGenericArgsTokenIndex;
- ReadFromBuffer(pSend, dwExactGenericArgsTokenIndex);
- GENERICS_TYPE_TOKEN rawToken;
- ReadFromBuffer(pSend, rawToken);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- GENERICS_TYPE_TOKEN _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->ResolveExactGenericArgsToken(dwExactGenericArgsTokenIndex, rawToken); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method ResolveExactGenericArgsToken
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetILCodeAndSig(VMPTR_DomainFile vmDomainFile, mdToken functionToken, TargetBuffer * pCodeInfo, mdToken * pLocalSigToken)
-void DDUnpack::Unpack_GetILCodeAndSig(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- mdToken functionToken;
- ReadFromBuffer(pSend, functionToken);
- TargetBuffer _pCodeInfo; // storage
- TargetBuffer * pCodeInfo = &_pCodeInfo;
- // pCodeInfo does not need to be copied on input
- mdToken _pLocalSigToken; // storage
- mdToken * pLocalSigToken = &_pLocalSigToken;
- // pLocalSigToken does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetILCodeAndSig(vmDomainFile, functionToken, pCodeInfo, pLocalSigToken); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pCodeInfo);
- WriteToBuffer(pResult, pLocalSigToken);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetILCodeAndSig
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetNativeCodeInfo(VMPTR_DomainFile vmDomainFile, mdToken functionToken, NativeCodeFunctionData * pCodeInfo)
-void DDUnpack::Unpack_GetNativeCodeInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- mdToken functionToken;
- ReadFromBuffer(pSend, functionToken);
- NativeCodeFunctionData _pCodeInfo; // storage
- NativeCodeFunctionData * pCodeInfo = &_pCodeInfo;
- // pCodeInfo does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetNativeCodeInfo(vmDomainFile, functionToken, pCodeInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pCodeInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetNativeCodeInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetNativeCodeInfoForAddr(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS hotCodeStartAddr, NativeCodeFunctionData * pCodeInfo)
-void DDUnpack::Unpack_GetNativeCodeInfoForAddr(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_MethodDesc vmMethodDesc;
- ReadFromBuffer(pSend, vmMethodDesc);
- CORDB_ADDRESS hotCodeStartAddr;
- ReadFromBuffer(pSend, hotCodeStartAddr);
- NativeCodeFunctionData _pCodeInfo; // storage
- NativeCodeFunctionData * pCodeInfo = &_pCodeInfo;
- ReadFromBuffer(pSend, &_pCodeInfo); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetNativeCodeInfoForAddr(vmMethodDesc, hotCodeStartAddr, pCodeInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pCodeInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetNativeCodeInfoForAddr
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetClassInfo(VMPTR_AppDomain vmAppDomain, VMPTR_Module vmModule, mdTypeDef metadataToken, VMPTR_TypeHandle thExact, VMPTR_TypeHandle thApprox, ClassInfo * pData)
-void DDUnpack::Unpack_GetClassInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- mdTypeDef metadataToken;
- ReadFromBuffer(pSend, metadataToken);
- VMPTR_TypeHandle thExact;
- ReadFromBuffer(pSend, thExact);
- VMPTR_TypeHandle thApprox;
- ReadFromBuffer(pSend, thApprox);
- ClassInfo _pData; // storage
- ClassInfo * pData = &_pData;
- ReadFromBuffer(pSend, &_pData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetClassInfo(vmAppDomain, vmModule, metadataToken, thExact, thApprox, pData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetClassInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetInstantiationFieldInfo(VMPTR_DomainFile vmDomainFile, mdTypeDef metadataToken, VMPTR_TypeHandle vmThExact, VMPTR_TypeHandle vmThApprox, DacDbiArrayList<FieldData> * pFieldList, SIZE_T * pObjectSize)
-void DDUnpack::Unpack_GetInstantiationFieldInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- mdTypeDef metadataToken;
- ReadFromBuffer(pSend, metadataToken);
- VMPTR_TypeHandle vmThExact;
- ReadFromBuffer(pSend, vmThExact);
- VMPTR_TypeHandle vmThApprox;
- ReadFromBuffer(pSend, vmThApprox);
- DacDbiArrayList<FieldData> _pFieldList; // storage
- DacDbiArrayList<FieldData> * pFieldList = &_pFieldList;
- // pFieldList does not need to be copied on input
- SIZE_T _pObjectSize; // storage
- SIZE_T * pObjectSize = &_pObjectSize;
- // pObjectSize does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetInstantiationFieldInfo(vmDomainFile, metadataToken, vmThExact, vmThApprox, pFieldList, pObjectSize); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pFieldList);
- WriteToBuffer(pResult, pObjectSize);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetInstantiationFieldInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void TypeHandleToExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
-void DDUnpack::Unpack_TypeHandleToExpandedTypeInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- AreValueTypesBoxed boxed;
- ReadFromBuffer(pSend, boxed);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- VMPTR_TypeHandle vmTypeHandle;
- ReadFromBuffer(pSend, vmTypeHandle);
- DebuggerIPCE_ExpandedTypeData _pTypeInfo; // storage
- DebuggerIPCE_ExpandedTypeData * pTypeInfo = &_pTypeInfo;
- ReadFromBuffer(pSend, &_pTypeInfo); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->TypeHandleToExpandedTypeInfo(boxed, vmAppDomain, vmTypeHandle, pTypeInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTypeInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method TypeHandleToExpandedTypeInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetObjectExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, CORDB_ADDRESS addr, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
-void DDUnpack::Unpack_GetObjectExpandedTypeInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- AreValueTypesBoxed boxed;
- ReadFromBuffer(pSend, boxed);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- CORDB_ADDRESS addr;
- ReadFromBuffer(pSend, addr);
- DebuggerIPCE_ExpandedTypeData _pTypeInfo; // storage
- DebuggerIPCE_ExpandedTypeData * pTypeInfo = &_pTypeInfo;
- // pTypeInfo does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetObjectExpandedTypeInfo(boxed, vmAppDomain, addr, pTypeInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTypeInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetObjectExpandedTypeInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_TypeHandle GetApproxTypeHandle(TypeInfoList * pTypeData)
-void DDUnpack::Unpack_GetApproxTypeHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- TypeInfoList _pTypeData; // storage
- TypeInfoList * pTypeData = &_pTypeData;
- ReadFromBuffer(pSend, &_pTypeData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_TypeHandle _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetApproxTypeHandle(pTypeData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTypeData);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetApproxTypeHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_TypeHandle GetExactTypeHandle(DebuggerIPCE_ExpandedTypeData * pTypeData, ArgInfoList * pArgInfo)
-void DDUnpack::Unpack_GetExactTypeHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- DebuggerIPCE_ExpandedTypeData _pTypeData; // storage
- DebuggerIPCE_ExpandedTypeData * pTypeData = &_pTypeData;
- ReadFromBuffer(pSend, &_pTypeData); // serialize to storage
- ArgInfoList _pArgInfo; // storage
- ArgInfoList * pArgInfo = &_pArgInfo;
- ReadFromBuffer(pSend, &_pArgInfo); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_TypeHandle _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetExactTypeHandle(pTypeData, pArgInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTypeData);
- WriteToBuffer(pResult, pArgInfo);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetExactTypeHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetMethodDescParams(VMPTR_AppDomain vmAppDomain, VMPTR_MethodDesc vmMethodDesc, GENERICS_TYPE_TOKEN genericsToken, UINT32 * pcGenericClassTypeParams, TypeParamsList * pGenericTypeParams)
-void DDUnpack::Unpack_GetMethodDescParams(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- VMPTR_MethodDesc vmMethodDesc;
- ReadFromBuffer(pSend, vmMethodDesc);
- GENERICS_TYPE_TOKEN genericsToken;
- ReadFromBuffer(pSend, genericsToken);
- UINT32 _pcGenericClassTypeParams; // storage
- UINT32 * pcGenericClassTypeParams = &_pcGenericClassTypeParams;
- // pcGenericClassTypeParams does not need to be copied on input
- TypeParamsList _pGenericTypeParams; // storage
- TypeParamsList * pGenericTypeParams = &_pGenericTypeParams;
- // pGenericTypeParams does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetMethodDescParams(vmAppDomain, vmMethodDesc, genericsToken, pcGenericClassTypeParams, pGenericTypeParams); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pcGenericClassTypeParams);
- WriteToBuffer(pResult, pGenericTypeParams);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetMethodDescParams
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CORDB_ADDRESS GetThreadOrContextStaticAddress(VMPTR_FieldDesc vmField, VMPTR_Thread vmRuntimeThread)
-void DDUnpack::Unpack_GetThreadOrContextStaticAddress(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_FieldDesc vmField;
- ReadFromBuffer(pSend, vmField);
- VMPTR_Thread vmRuntimeThread;
- ReadFromBuffer(pSend, vmRuntimeThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CORDB_ADDRESS _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetThreadOrContextStaticAddress(vmField, vmRuntimeThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetThreadOrContextStaticAddress
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CORDB_ADDRESS GetCollectibleTypeStaticAddress(VMPTR_FieldDesc vmField, VMPTR_AppDomain vmAppDomain)
-void DDUnpack::Unpack_GetCollectibleTypeStaticAddress(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_FieldDesc vmField;
- ReadFromBuffer(pSend, vmField);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CORDB_ADDRESS _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetCollectibleTypeStaticAddress(vmField, vmAppDomain); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCollectibleTypeStaticAddress
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetEnCHangingFieldInfo(const EnCHangingFieldInfo * pEnCFieldInfo, FieldData * pFieldData, BOOL * pfStatic)
-void DDUnpack::Unpack_GetEnCHangingFieldInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- EnCHangingFieldInfo _pEnCFieldInfo; // storage
- const EnCHangingFieldInfo * pEnCFieldInfo = &_pEnCFieldInfo;
- ReadFromBuffer(pSend, &_pEnCFieldInfo); // serialize to storage
- FieldData _pFieldData; // storage
- FieldData * pFieldData = &_pFieldData;
- // pFieldData does not need to be copied on input
- BOOL _pfStatic; // storage
- BOOL * pfStatic = &_pfStatic;
- // pfStatic does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetEnCHangingFieldInfo(pEnCFieldInfo, pFieldData, pfStatic); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pFieldData);
- WriteToBuffer(pResult, pfStatic);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetEnCHangingFieldInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetTypeHandleParams(VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, TypeParamsList * pParams)
-void DDUnpack::Unpack_GetTypeHandleParams(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- VMPTR_TypeHandle vmTypeHandle;
- ReadFromBuffer(pSend, vmTypeHandle);
- TypeParamsList _pParams; // storage
- TypeParamsList * pParams = &_pParams;
- // pParams does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetTypeHandleParams(vmAppDomain, vmTypeHandle, pParams); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pParams);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetTypeHandleParams
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetSimpleType(VMPTR_AppDomain vmAppDomain, CorElementType simpleType, mdTypeDef * pMetadataToken, VMPTR_DomainFile * pVmDomainFile)
-void DDUnpack::Unpack_GetSimpleType(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- CorElementType simpleType;
- ReadFromBuffer(pSend, simpleType);
- mdTypeDef _pMetadataToken; // storage
- mdTypeDef * pMetadataToken = &_pMetadataToken;
- // pMetadataToken does not need to be copied on input
- VMPTR_DomainFile _pVmDomainFile; // storage
- VMPTR_DomainFile * pVmDomainFile = &_pVmDomainFile;
- // pVmDomainFile does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetSimpleType(vmAppDomain, simpleType, pMetadataToken, pVmDomainFile); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pMetadataToken);
- WriteToBuffer(pResult, pVmDomainFile);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetSimpleType
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetTypedByRefInfo(CORDB_ADDRESS pTypedByRef, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
-void DDUnpack::Unpack_GetTypedByRefInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS pTypedByRef;
- ReadFromBuffer(pSend, pTypedByRef);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- DebuggerIPCE_ObjectData _pObjectData; // storage
- DebuggerIPCE_ObjectData * pObjectData = &_pObjectData;
- ReadFromBuffer(pSend, &_pObjectData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetTypedByRefInfo(pTypedByRef, vmAppDomain, pObjectData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pObjectData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetTypedByRefInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetStringData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
-void DDUnpack::Unpack_GetStringData(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS objectAddress;
- ReadFromBuffer(pSend, objectAddress);
- DebuggerIPCE_ObjectData _pObjectData; // storage
- DebuggerIPCE_ObjectData * pObjectData = &_pObjectData;
- ReadFromBuffer(pSend, &_pObjectData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetStringData(objectAddress, pObjectData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pObjectData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetStringData
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetArrayData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
-void DDUnpack::Unpack_GetArrayData(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS objectAddress;
- ReadFromBuffer(pSend, objectAddress);
- DebuggerIPCE_ObjectData _pObjectData; // storage
- DebuggerIPCE_ObjectData * pObjectData = &_pObjectData;
- ReadFromBuffer(pSend, &_pObjectData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetArrayData(objectAddress, pObjectData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pObjectData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetArrayData
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetBasicObjectInfo(CORDB_ADDRESS objectAddress, CorElementType type, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
-void DDUnpack::Unpack_GetBasicObjectInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS objectAddress;
- ReadFromBuffer(pSend, objectAddress);
- CorElementType type;
- ReadFromBuffer(pSend, type);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- DebuggerIPCE_ObjectData _pObjectData; // storage
- DebuggerIPCE_ObjectData * pObjectData = &_pObjectData;
- ReadFromBuffer(pSend, &_pObjectData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetBasicObjectInfo(objectAddress, type, vmAppDomain, pObjectData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pObjectData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetBasicObjectInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void TestCrst(VMPTR_Crst vmCrst)
-void DDUnpack::Unpack_TestCrst(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Crst vmCrst;
- ReadFromBuffer(pSend, vmCrst);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->TestCrst(vmCrst); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method TestCrst
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void TestRWLock(VMPTR_SimpleRWLock vmRWLock)
-void DDUnpack::Unpack_TestRWLock(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_SimpleRWLock vmRWLock;
- ReadFromBuffer(pSend, vmRWLock);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->TestRWLock(vmRWLock); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method TestRWLock
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CORDB_ADDRESS GetDebuggerControlBlockAddress()
-void DDUnpack::Unpack_GetDebuggerControlBlockAddress(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CORDB_ADDRESS _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetDebuggerControlBlockAddress(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetDebuggerControlBlockAddress
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_Object GetObjectFromRefPtr(CORDB_ADDRESS ptr)
-void DDUnpack::Unpack_GetObjectFromRefPtr(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS ptr;
- ReadFromBuffer(pSend, ptr);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_Object _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetObjectFromRefPtr(ptr); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetObjectFromRefPtr
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_Object GetObject(CORDB_ADDRESS ptr)
-void DDUnpack::Unpack_GetObject(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS ptr;
- ReadFromBuffer(pSend, ptr);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_Object _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetObject(ptr); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetObject
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_OBJECTHANDLE GetVmObjectHandle(CORDB_ADDRESS handleAddress)
-void DDUnpack::Unpack_GetVmObjectHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS handleAddress;
- ReadFromBuffer(pSend, handleAddress);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_OBJECTHANDLE _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetVmObjectHandle(handleAddress); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetVmObjectHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsVmObjectHandleValid(VMPTR_OBJECTHANDLE vmHandle)
-void DDUnpack::Unpack_IsVmObjectHandleValid(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_OBJECTHANDLE vmHandle;
- ReadFromBuffer(pSend, vmHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsVmObjectHandleValid(vmHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsVmObjectHandleValid
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// ULONG GetAppDomainIdFromVmObjectHandle(VMPTR_OBJECTHANDLE vmHandle)
-void DDUnpack::Unpack_GetAppDomainIdFromVmObjectHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_OBJECTHANDLE vmHandle;
- ReadFromBuffer(pSend, vmHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- ULONG _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAppDomainIdFromVmObjectHandle(vmHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainIdFromVmObjectHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CORDB_ADDRESS GetHandleAddressFromVmHandle(VMPTR_OBJECTHANDLE vmHandle)
-void DDUnpack::Unpack_GetHandleAddressFromVmHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_OBJECTHANDLE vmHandle;
- ReadFromBuffer(pSend, vmHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CORDB_ADDRESS _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetHandleAddressFromVmHandle(vmHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetHandleAddressFromVmHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// TargetBuffer GetObjectContents(VMPTR_Object obj)
-void DDUnpack::Unpack_GetObjectContents(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Object obj;
- ReadFromBuffer(pSend, obj);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- TargetBuffer _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetObjectContents(obj); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetObjectContents
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateBlockingObjects(VMPTR_Thread vmThread, IDacDbiInterface::FP_BLOCKINGOBJECT_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateBlockingObjects(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateBlockingObjects(vmThread, GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateBlockingObjects
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// MonitorLockInfo GetThreadOwningMonitorLock(VMPTR_Object vmObject)
-void DDUnpack::Unpack_GetThreadOwningMonitorLock(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Object vmObject;
- ReadFromBuffer(pSend, vmObject);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- MonitorLockInfo _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetThreadOwningMonitorLock(vmObject); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetThreadOwningMonitorLock
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateMonitorEventWaitList(VMPTR_Object vmObject, IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateMonitorEventWaitList(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Object vmObject;
- ReadFromBuffer(pSend, vmObject);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateMonitorEventWaitList(vmObject, GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateMonitorEventWaitList
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsManagedDebugEventPending()
-void DDUnpack::Unpack_IsManagedDebugEventPending(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsManagedDebugEventPending(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsManagedDebugEventPending
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool GetMetaDataFileInfoFromPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwImageSize, bool & isNGEN, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetMetaDataFileInfoFromPEFile(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_PEFile vmPEFile;
- ReadFromBuffer(pSend, vmPEFile);
- DWORD dwTimeStamp;
- ReadFromBuffer(pSend, dwTimeStamp);
- DWORD dwImageSize;
- ReadFromBuffer(pSend, dwImageSize);
- bool isNGEN;
- ReadFromBuffer(pSend, isNGEN);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetMetaDataFileInfoFromPEFile(vmPEFile, dwTimeStamp, dwImageSize, isNGEN, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, dwTimeStamp);
- WriteToBuffer(pResult, dwImageSize);
- WriteToBuffer(pResult, isNGEN);
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetMetaDataFileInfoFromPEFile
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool GetILImageInfoFromNgenPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwSize, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetILImageInfoFromNgenPEFile(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_PEFile vmPEFile;
- ReadFromBuffer(pSend, vmPEFile);
- DWORD dwTimeStamp;
- ReadFromBuffer(pSend, dwTimeStamp);
- DWORD dwSize;
- ReadFromBuffer(pSend, dwSize);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetILImageInfoFromNgenPEFile(vmPEFile, dwTimeStamp, dwSize, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, dwTimeStamp);
- WriteToBuffer(pResult, dwSize);
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetILImageInfoFromNgenPEFile
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool IsThreadSuspendedOrHijacked(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_IsThreadSuspendedOrHijacked(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsThreadSuspendedOrHijacked(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsThreadSuspendedOrHijacked
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool AreGCStructuresValid()
-void DDUnpack::Unpack_AreGCStructuresValid(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->AreGCStructuresValid(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method AreGCStructuresValid
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT CreateHeapWalk(HeapWalkHandle * pHandle)
-void DDUnpack::Unpack_CreateHeapWalk(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- HeapWalkHandle _pHandle; // storage
- HeapWalkHandle * pHandle = &_pHandle;
- // pHandle does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->CreateHeapWalk(pHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pHandle);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method CreateHeapWalk
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void DeleteHeapWalk(HeapWalkHandle handle)
-void DDUnpack::Unpack_DeleteHeapWalk(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- HeapWalkHandle handle;
- ReadFromBuffer(pSend, handle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->DeleteHeapWalk(handle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method DeleteHeapWalk
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT WalkHeap(HeapWalkHandle handle, ULONG count, COR_HEAPOBJECT * objects, ULONG * pFetched)
-void DDUnpack::Unpack_WalkHeap(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- HeapWalkHandle handle;
- ReadFromBuffer(pSend, handle);
- ULONG count;
- ReadFromBuffer(pSend, count);
- COR_HEAPOBJECT _objects; // storage
- COR_HEAPOBJECT * objects = &_objects;
- // objects does not need to be copied on input
- ULONG _pFetched; // storage
- ULONG * pFetched = &_pFetched;
- // pFetched does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->WalkHeap(handle, count, objects, pFetched); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, objects);
- WriteToBuffer(pResult, pFetched);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method WalkHeap
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT GetHeapSegments(DacDbiArrayList<COR_SEGMENT> * pSegments)
-void DDUnpack::Unpack_GetHeapSegments(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- DacDbiArrayList<COR_SEGMENT> _pSegments; // storage
- DacDbiArrayList<COR_SEGMENT> * pSegments = &_pSegments;
- // pSegments does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetHeapSegments(pSegments); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pSegments);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetHeapSegments
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool IsValidObject(CORDB_ADDRESS obj)
-void DDUnpack::Unpack_IsValidObject(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS obj;
- ReadFromBuffer(pSend, obj);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsValidObject(obj); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsValidObject
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool GetAppDomainForObject(CORDB_ADDRESS obj, VMPTR_AppDomain * pApp, VMPTR_Module * pModule, VMPTR_DomainFile * pDomainFile)
-void DDUnpack::Unpack_GetAppDomainForObject(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Initialize a holder to swap in & out the g_pAllocator
- DD_UNPACK_ENTER_MAY_THROW;
-
- // Parameters
- CORDB_ADDRESS obj;
- ReadFromBuffer(pSend, obj);
- VMPTR_AppDomain _pApp; // storage
- VMPTR_AppDomain * pApp = &_pApp;
- // pApp does not need to be copied on input
- VMPTR_Module _pModule; // storage
- VMPTR_Module * pModule = &_pModule;
- // pModule does not need to be copied on input
- VMPTR_DomainFile _pDomainFile; // storage
- VMPTR_DomainFile * pDomainFile = &_pDomainFile;
- // pDomainFile does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAppDomainForObject(obj, pApp, pModule, pDomainFile); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pApp);
- WriteToBuffer(pResult, pModule);
- WriteToBuffer(pResult, pDomainFile);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainForObject
-
-
-//
-// Handler
-//
-void DDUnpack::HandleDDMessage(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- DD_MessageId id;
- ReadFromBuffer(pSend, id);
-
- switch(id)
- {
-
- case DDID_CheckDbiVersion:
- Unpack_CheckDbiVersion(pSend, pResult);
- break;
-
- case DDID_FlushCache:
- Unpack_FlushCache(pSend, pResult);
- break;
-
- case DDID_DacSetTargetConsistencyChecks:
- Unpack_DacSetTargetConsistencyChecks(pSend, pResult);
- break;
-
- case DDID_Destroy:
- Unpack_Destroy(pSend, pResult);
- break;
-
- case DDID_IsLeftSideInitialized:
- Unpack_IsLeftSideInitialized(pSend, pResult);
- break;
-
- case DDID_GetAppDomainFromId:
- Unpack_GetAppDomainFromId(pSend, pResult);
- break;
-
- case DDID_GetAppDomainId:
- Unpack_GetAppDomainId(pSend, pResult);
- break;
-
- case DDID_GetAppDomainObject:
- Unpack_GetAppDomainObject(pSend, pResult);
- break;
-
- case DDID_IsDefaultDomain:
- Unpack_IsDefaultDomain(pSend, pResult);
- break;
-
- case DDID_GetAssemblyFromDomainAssembly:
- Unpack_GetAssemblyFromDomainAssembly(pSend, pResult);
- break;
-
- case DDID_IsAssemblyFullyTrusted:
- Unpack_IsAssemblyFullyTrusted(pSend, pResult);
- break;
-
- case DDID_GetAppDomainFullName:
- Unpack_GetAppDomainFullName(pSend, pResult);
- break;
-
- case DDID_GetModuleSimpleName:
- Unpack_GetModuleSimpleName(pSend, pResult);
- break;
-
- case DDID_GetAssemblyPath:
- Unpack_GetAssemblyPath(pSend, pResult);
- break;
-
- case DDID_ResolveTypeReference:
- Unpack_ResolveTypeReference(pSend, pResult);
- break;
-
- case DDID_GetModulePath:
- Unpack_GetModulePath(pSend, pResult);
- break;
-
- case DDID_GetModuleNGenPath:
- Unpack_GetModuleNGenPath(pSend, pResult);
- break;
-
- case DDID_GetMetadata:
- Unpack_GetMetadata(pSend, pResult);
- break;
-
- case DDID_GetSymbolsBuffer:
- Unpack_GetSymbolsBuffer(pSend, pResult);
- break;
-
- case DDID_GetModuleData:
- Unpack_GetModuleData(pSend, pResult);
- break;
-
- case DDID_GetDomainFileData:
- Unpack_GetDomainFileData(pSend, pResult);
- break;
-
- case DDID_GetModuleForDomainFile:
- Unpack_GetModuleForDomainFile(pSend, pResult);
- break;
-
- case DDID_GetAddressType:
- Unpack_GetAddressType(pSend, pResult);
- break;
-
- case DDID_IsTransitionStub:
- Unpack_IsTransitionStub(pSend, pResult);
- break;
-
- case DDID_GetCompilerFlags:
- Unpack_GetCompilerFlags(pSend, pResult);
- break;
-
- case DDID_SetCompilerFlags:
- Unpack_SetCompilerFlags(pSend, pResult);
- break;
-
- case DDID_EnumerateAppDomains:
- Unpack_EnumerateAppDomains(pSend, pResult);
- break;
-
- case DDID_EnumerateAssembliesInAppDomain:
- Unpack_EnumerateAssembliesInAppDomain(pSend, pResult);
- break;
-
- case DDID_EnumerateModulesInAssembly:
- Unpack_EnumerateModulesInAssembly(pSend, pResult);
- break;
-
- case DDID_RequestSyncAtEvent:
- Unpack_RequestSyncAtEvent(pSend, pResult);
- break;
-
- case DDID_MarkDebuggerAttachPending:
- Unpack_MarkDebuggerAttachPending(pSend, pResult);
- break;
-
- case DDID_MarkDebuggerAttached:
- Unpack_MarkDebuggerAttached(pSend, pResult);
- break;
-
- case DDID_Hijack:
- Unpack_Hijack(pSend, pResult);
- break;
-
- case DDID_EnumerateConnections:
- Unpack_EnumerateConnections(pSend, pResult);
- break;
-
- case DDID_EnumerateThreads:
- Unpack_EnumerateThreads(pSend, pResult);
- break;
-
- case DDID_IsThreadMarkedDead:
- Unpack_IsThreadMarkedDead(pSend, pResult);
- break;
-
- case DDID_GetThreadHandle:
- Unpack_GetThreadHandle(pSend, pResult);
- break;
-
- case DDID_GetThreadObject:
- Unpack_GetThreadObject(pSend, pResult);
- break;
-
- case DDID_SetDebugState:
- Unpack_SetDebugState(pSend, pResult);
- break;
-
- case DDID_HasUnhandledException:
- Unpack_HasUnhandledException(pSend, pResult);
- break;
-
- case DDID_GetUserState:
- Unpack_GetUserState(pSend, pResult);
- break;
-
- case DDID_GetConnectionID:
- Unpack_GetConnectionID(pSend, pResult);
- break;
-
- case DDID_GetTaskID:
- Unpack_GetTaskID(pSend, pResult);
- break;
-
- case DDID_TryGetVolatileOSThreadID:
- Unpack_TryGetVolatileOSThreadID(pSend, pResult);
- break;
-
- case DDID_GetUniqueThreadID:
- Unpack_GetUniqueThreadID(pSend, pResult);
- break;
-
- case DDID_GetCurrentException:
- Unpack_GetCurrentException(pSend, pResult);
- break;
-
- case DDID_GetCurrentCustomDebuggerNotification:
- Unpack_GetCurrentCustomDebuggerNotification(pSend, pResult);
- break;
-
- case DDID_GetCurrentAppDomain:
- Unpack_GetCurrentAppDomain(pSend, pResult);
- break;
-
- case DDID_ResolveAssembly:
- Unpack_ResolveAssembly(pSend, pResult);
- break;
-
- case DDID_GetNativeCodeSequencePointsAndVarInfo:
- Unpack_GetNativeCodeSequencePointsAndVarInfo(pSend, pResult);
- break;
-
- case DDID_GetManagedStoppedContext:
- Unpack_GetManagedStoppedContext(pSend, pResult);
- break;
-
- case DDID_CreateStackWalk:
- Unpack_CreateStackWalk(pSend, pResult);
- break;
-
- case DDID_DeleteStackWalk:
- Unpack_DeleteStackWalk(pSend, pResult);
- break;
-
- case DDID_GetStackWalkCurrentContext:
- Unpack_GetStackWalkCurrentContext(pSend, pResult);
- break;
-
- case DDID_SetStackWalkCurrentContext:
- Unpack_SetStackWalkCurrentContext(pSend, pResult);
- break;
-
- case DDID_UnwindStackWalkFrame:
- Unpack_UnwindStackWalkFrame(pSend, pResult);
- break;
-
- case DDID_CheckContext:
- Unpack_CheckContext(pSend, pResult);
- break;
-
- case DDID_GetStackWalkCurrentFrameInfo:
- Unpack_GetStackWalkCurrentFrameInfo(pSend, pResult);
- break;
-
- case DDID_GetCountOfInternalFrames:
- Unpack_GetCountOfInternalFrames(pSend, pResult);
- break;
-
- case DDID_EnumerateInternalFrames:
- Unpack_EnumerateInternalFrames(pSend, pResult);
- break;
-
- case DDID_IsMatchingParentFrame:
- Unpack_IsMatchingParentFrame(pSend, pResult);
- break;
-
- case DDID_GetStackParameterSize:
- Unpack_GetStackParameterSize(pSend, pResult);
- break;
-
- case DDID_GetFramePointer:
- Unpack_GetFramePointer(pSend, pResult);
- break;
-
- case DDID_IsLeafFrame:
- Unpack_IsLeafFrame(pSend, pResult);
- break;
-
- case DDID_GetContext:
- Unpack_GetContext(pSend, pResult);
- break;
-
- case DDID_ConvertContextToDebuggerRegDisplay:
- Unpack_ConvertContextToDebuggerRegDisplay(pSend, pResult);
- break;
-
- case DDID_IsILStubOrLCGMethod:
- Unpack_IsILStubOrLCGMethod(pSend, pResult);
- break;
-
- case DDID_GetVarArgSig:
- Unpack_GetVarArgSig(pSend, pResult);
- break;
-
- case DDID_ResolveExactGenericArgsToken:
- Unpack_ResolveExactGenericArgsToken(pSend, pResult);
- break;
-
- case DDID_GetILCodeAndSig:
- Unpack_GetILCodeAndSig(pSend, pResult);
- break;
-
- case DDID_GetNativeCodeInfo:
- Unpack_GetNativeCodeInfo(pSend, pResult);
- break;
-
- case DDID_GetNativeCodeInfoForAddr:
- Unpack_GetNativeCodeInfoForAddr(pSend, pResult);
- break;
-
- case DDID_GetClassInfo:
- Unpack_GetClassInfo(pSend, pResult);
- break;
-
- case DDID_GetInstantiationFieldInfo:
- Unpack_GetInstantiationFieldInfo(pSend, pResult);
- break;
-
- case DDID_TypeHandleToExpandedTypeInfo:
- Unpack_TypeHandleToExpandedTypeInfo(pSend, pResult);
- break;
-
- case DDID_GetObjectExpandedTypeInfo:
- Unpack_GetObjectExpandedTypeInfo(pSend, pResult);
- break;
-
- case DDID_GetApproxTypeHandle:
- Unpack_GetApproxTypeHandle(pSend, pResult);
- break;
-
- case DDID_GetExactTypeHandle:
- Unpack_GetExactTypeHandle(pSend, pResult);
- break;
-
- case DDID_GetMethodDescParams:
- Unpack_GetMethodDescParams(pSend, pResult);
- break;
-
- case DDID_GetThreadOrContextStaticAddress:
- Unpack_GetThreadOrContextStaticAddress(pSend, pResult);
- break;
-
- case DDID_GetCollectibleTypeStaticAddress:
- Unpack_GetCollectibleTypeStaticAddress(pSend, pResult);
- break;
-
- case DDID_GetEnCHangingFieldInfo:
- Unpack_GetEnCHangingFieldInfo(pSend, pResult);
- break;
-
- case DDID_GetTypeHandleParams:
- Unpack_GetTypeHandleParams(pSend, pResult);
- break;
-
- case DDID_GetSimpleType:
- Unpack_GetSimpleType(pSend, pResult);
- break;
-
- case DDID_GetTypedByRefInfo:
- Unpack_GetTypedByRefInfo(pSend, pResult);
- break;
-
- case DDID_GetStringData:
- Unpack_GetStringData(pSend, pResult);
- break;
-
- case DDID_GetArrayData:
- Unpack_GetArrayData(pSend, pResult);
- break;
-
- case DDID_GetBasicObjectInfo:
- Unpack_GetBasicObjectInfo(pSend, pResult);
- break;
-
- case DDID_TestCrst:
- Unpack_TestCrst(pSend, pResult);
- break;
-
- case DDID_TestRWLock:
- Unpack_TestRWLock(pSend, pResult);
- break;
-
- case DDID_GetDebuggerControlBlockAddress:
- Unpack_GetDebuggerControlBlockAddress(pSend, pResult);
- break;
-
- case DDID_GetObjectFromRefPtr:
- Unpack_GetObjectFromRefPtr(pSend, pResult);
- break;
-
- case DDID_GetObject:
- Unpack_GetObject(pSend, pResult);
- break;
-
- case DDID_GetVmObjectHandle:
- Unpack_GetVmObjectHandle(pSend, pResult);
- break;
-
- case DDID_IsVmObjectHandleValid:
- Unpack_IsVmObjectHandleValid(pSend, pResult);
- break;
-
- case DDID_GetAppDomainIdFromVmObjectHandle:
- Unpack_GetAppDomainIdFromVmObjectHandle(pSend, pResult);
- break;
-
- case DDID_GetHandleAddressFromVmHandle:
- Unpack_GetHandleAddressFromVmHandle(pSend, pResult);
- break;
-
- case DDID_GetObjectContents:
- Unpack_GetObjectContents(pSend, pResult);
- break;
-
- case DDID_EnumerateBlockingObjects:
- Unpack_EnumerateBlockingObjects(pSend, pResult);
- break;
-
- case DDID_GetThreadOwningMonitorLock:
- Unpack_GetThreadOwningMonitorLock(pSend, pResult);
- break;
-
- case DDID_EnumerateMonitorEventWaitList:
- Unpack_EnumerateMonitorEventWaitList(pSend, pResult);
- break;
-
- case DDID_IsManagedDebugEventPending:
- Unpack_IsManagedDebugEventPending(pSend, pResult);
- break;
-
- case DDID_GetMetaDataFileInfoFromPEFile:
- Unpack_GetMetaDataFileInfoFromPEFile(pSend, pResult);
- break;
-
- case DDID_GetILImageInfoFromNgenPEFile:
- Unpack_GetILImageInfoFromNgenPEFile(pSend, pResult);
- break;
-
- case DDID_IsThreadSuspendedOrHijacked:
- Unpack_IsThreadSuspendedOrHijacked(pSend, pResult);
- break;
-
- case DDID_AreGCStructuresValid:
- Unpack_AreGCStructuresValid(pSend, pResult);
- break;
-
- case DDID_CreateHeapWalk:
- Unpack_CreateHeapWalk(pSend, pResult);
- break;
-
- case DDID_DeleteHeapWalk:
- Unpack_DeleteHeapWalk(pSend, pResult);
- break;
-
- case DDID_WalkHeap:
- Unpack_WalkHeap(pSend, pResult);
- break;
-
- case DDID_GetHeapSegments:
- Unpack_GetHeapSegments(pSend, pResult);
- break;
-
- case DDID_IsValidObject:
- Unpack_IsValidObject(pSend, pResult);
- break;
-
- case DDID_GetAppDomainForObject:
- Unpack_GetAppDomainForObject(pSend, pResult);
- break;
-
-
- } // end switch
-} // end HandleDDMessage method
-
-#endif //FEATURE_DBGIPC_TRANSPORT_VM
-
-// end of file
diff --git a/src/debug/daccess/ddunpack.h b/src/debug/daccess/ddunpack.h
deleted file mode 100644
index ec9e25a0e9..0000000000
--- a/src/debug/daccess/ddunpack.h
+++ /dev/null
@@ -1,411 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-// Unpacker
-//
-// Lives on EE side of the fence
-//
-// Note that this file is generated by ndp\clr\src\Debug\tools\BuildDDMarshal\.
-// Changes should be made to output\DDUnpack_template.h in that directory.
-//
-
-
-#ifndef _DDUNPACK_H_
-#define _DDUNPACK_H_
-
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
-
-#include "ddmarshalutil.h"
-#include "ddshared.h"
-
-extern "C" IDacDbiInterface::IAllocator * g_pAllocator;
-
-class DDAllocatorHolder
-{
-public:
- DDAllocatorHolder(IDacDbiInterface::IAllocator * pAllocator)
- {
- // not reentrant
- _ASSERTE(g_pAllocator == NULL);
- g_pAllocator = pAllocator;
- }
-
- ~DDAllocatorHolder()
- {
- g_pAllocator = NULL;
- }
-};
-
-#define DD_UNPACK_ENTER_MAY_THROW \
- DDAllocatorHolder __ddunpackHolder(this->m_pAllocator);
-
-// Header for unpacking
-//
-class DDUnpack
- {
- protected:
- IDacDbiInterface * m_pReal;
- IDacDbiInterface::IAllocator * m_pAllocator;
- public:
- DDUnpack(IDacDbiInterface * pReal, IDacDbiInterface::IAllocator * pAllocator)
- {
- m_pReal = pReal;
- m_pAllocator = pAllocator;
- }
-
- // Main entry point
- // This will then delegate to the proper unpacking stubs.
- void HandleDDMessage(ReadBuffer * pSend, WriteBuffer * pResult);
-
-
- //
- // Stubs
- //
-
-//---------------------------------------------------------------------
-// Unpacking stubs
- // HRESULT CheckDbiVersion(const DbiVersion * pVersion)
- void Unpack_CheckDbiVersion(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT FlushCache()
- void Unpack_FlushCache(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void DacSetTargetConsistencyChecks(bool fEnableAsserts)
- void Unpack_DacSetTargetConsistencyChecks(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void Destroy()
- void Unpack_Destroy(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsLeftSideInitialized()
- void Unpack_IsLeftSideInitialized(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_AppDomain GetAppDomainFromId(ULONG appdomainId)
- void Unpack_GetAppDomainFromId(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // ULONG GetAppDomainId(VMPTR_AppDomain vmAppDomain)
- void Unpack_GetAppDomainId(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_OBJECTHANDLE GetAppDomainObject(VMPTR_AppDomain vmAppDomain)
- void Unpack_GetAppDomainObject(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsDefaultDomain(VMPTR_AppDomain vmAppDomain)
- void Unpack_IsDefaultDomain(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetAssemblyFromDomainAssembly(VMPTR_DomainAssembly vmDomainAssembly, VMPTR_Assembly * vmAssembly)
- void Unpack_GetAssemblyFromDomainAssembly(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsAssemblyFullyTrusted(VMPTR_DomainAssembly vmDomainAssembly)
- void Unpack_IsAssemblyFullyTrusted(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetAppDomainFullName(VMPTR_AppDomain vmAppDomain, IStringHolder * pStrName)
- void Unpack_GetAppDomainFullName(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetModuleSimpleName(VMPTR_Module vmModule, IStringHolder * pStrFilename)
- void Unpack_GetModuleSimpleName(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL GetAssemblyPath(VMPTR_Assembly vmAssembly, IStringHolder * pStrFilename)
- void Unpack_GetAssemblyPath(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void ResolveTypeReference(const TypeRefData * pTypeRefInfo, TypeRefData * pTargetRefInfo)
- void Unpack_ResolveTypeReference(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL GetModulePath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
- void Unpack_GetModulePath(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL GetModuleNGenPath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
- void Unpack_GetModuleNGenPath(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetMetadata(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer)
- void Unpack_GetMetadata(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetSymbolsBuffer(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer, IDacDbiInterface::SymbolFormat * pSymbolFormat)
- void Unpack_GetSymbolsBuffer(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetModuleData(VMPTR_Module vmModule, ModuleInfo * pData)
- void Unpack_GetModuleData(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetDomainFileData(VMPTR_DomainFile vmDomainFile, DomainFileInfo * pData)
- void Unpack_GetDomainFileData(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetModuleForDomainFile(VMPTR_DomainFile vmDomainFile, VMPTR_Module * pModule)
- void Unpack_GetModuleForDomainFile(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // IDacDbiInterface::AddressType GetAddressType(CORDB_ADDRESS address)
- void Unpack_GetAddressType(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsTransitionStub(CORDB_ADDRESS address)
- void Unpack_IsTransitionStub(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL * pfAllowJITOpts, BOOL * pfEnableEnC)
- void Unpack_GetCompilerFlags(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT SetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL fAllowJitOpts, BOOL fEnableEnC)
- void Unpack_SetCompilerFlags(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateAppDomains(IDacDbiInterface::FP_APPDOMAIN_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateAppDomains(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateAssembliesInAppDomain(VMPTR_AppDomain vmAppDomain, IDacDbiInterface::FP_ASSEMBLY_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateAssembliesInAppDomain(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateModulesInAssembly(VMPTR_DomainAssembly vmAssembly, IDacDbiInterface::FP_MODULE_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateModulesInAssembly(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void RequestSyncAtEvent()
- void Unpack_RequestSyncAtEvent(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void MarkDebuggerAttachPending()
- void Unpack_MarkDebuggerAttachPending(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void MarkDebuggerAttached(BOOL fAttached)
- void Unpack_MarkDebuggerAttached(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void Hijack(VMPTR_Thread vmThread, ULONG32 dwThreadId, const EXCEPTION_RECORD * pRecord, T_CONTEXT * pOriginalContext, ULONG32 cbSizeContext, EHijackReason::EHijackReason reason, void * pUserData, CORDB_ADDRESS * pRemoteContextAddr)
- void Unpack_Hijack(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateConnections(IDacDbiInterface::FP_CONNECTION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateConnections(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateThreads(IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateThreads(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool IsThreadMarkedDead(VMPTR_Thread vmThread)
- void Unpack_IsThreadMarkedDead(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HANDLE GetThreadHandle(VMPTR_Thread vmThread)
- void Unpack_GetThreadHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_OBJECTHANDLE GetThreadObject(VMPTR_Thread vmThread)
- void Unpack_GetThreadObject(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void SetDebugState(VMPTR_Thread vmThread, CorDebugThreadState debugState)
- void Unpack_SetDebugState(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL HasUnhandledException(VMPTR_Thread vmThread)
- void Unpack_HasUnhandledException(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CorDebugUserState GetUserState(VMPTR_Thread vmThread)
- void Unpack_GetUserState(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CONNID GetConnectionID(VMPTR_Thread vmThread)
- void Unpack_GetConnectionID(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // TASKID GetTaskID(VMPTR_Thread vmThread)
- void Unpack_GetTaskID(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // DWORD TryGetVolatileOSThreadID(VMPTR_Thread vmThread)
- void Unpack_TryGetVolatileOSThreadID(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // DWORD GetUniqueThreadID(VMPTR_Thread vmThread)
- void Unpack_GetUniqueThreadID(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_OBJECTHANDLE GetCurrentException(VMPTR_Thread vmThread)
- void Unpack_GetCurrentException(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_OBJECTHANDLE GetCurrentCustomDebuggerNotification(VMPTR_Thread vmThread)
- void Unpack_GetCurrentCustomDebuggerNotification(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_AppDomain GetCurrentAppDomain(VMPTR_Thread vmThread)
- void Unpack_GetCurrentAppDomain(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_DomainAssembly ResolveAssembly(VMPTR_DomainFile vmScope, mdToken tkAssemblyRef)
- void Unpack_ResolveAssembly(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetNativeCodeSequencePointsAndVarInfo(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS startAddress, BOOL fCodeAvailabe, NativeVarData * pNativeVarData, SequencePoints * pSequencePoints)
- void Unpack_GetNativeCodeSequencePointsAndVarInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_CONTEXT GetManagedStoppedContext(VMPTR_Thread vmThread)
- void Unpack_GetManagedStoppedContext(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void CreateStackWalk(VMPTR_Thread vmThread, DT_CONTEXT * pInternalContextBuffer, StackWalkHandle * ppSFIHandle)
- void Unpack_CreateStackWalk(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void DeleteStackWalk(StackWalkHandle ppSFIHandle)
- void Unpack_DeleteStackWalk(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetStackWalkCurrentContext(StackWalkHandle pSFIHandle, DT_CONTEXT * pContext)
- void Unpack_GetStackWalkCurrentContext(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void SetStackWalkCurrentContext(VMPTR_Thread vmThread, StackWalkHandle pSFIHandle, CorDebugSetContextFlag flag, DT_CONTEXT * pContext)
- void Unpack_SetStackWalkCurrentContext(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL UnwindStackWalkFrame(StackWalkHandle pSFIHandle)
- void Unpack_UnwindStackWalkFrame(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT CheckContext(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
- void Unpack_CheckContext(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // IDacDbiInterface::FrameType GetStackWalkCurrentFrameInfo(StackWalkHandle pSFIHandle, DebuggerIPCE_STRData * pFrameData)
- void Unpack_GetStackWalkCurrentFrameInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // ULONG32 GetCountOfInternalFrames(VMPTR_Thread vmThread)
- void Unpack_GetCountOfInternalFrames(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateInternalFrames(VMPTR_Thread vmThread, IDacDbiInterface::FP_INTERNAL_FRAME_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateInternalFrames(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsMatchingParentFrame(FramePointer fpToCheck, FramePointer fpParent)
- void Unpack_IsMatchingParentFrame(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // ULONG32 GetStackParameterSize(CORDB_ADDRESS controlPC)
- void Unpack_GetStackParameterSize(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // FramePointer GetFramePointer(StackWalkHandle pSFIHandle)
- void Unpack_GetFramePointer(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsLeafFrame(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
- void Unpack_IsLeafFrame(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetContext(VMPTR_Thread vmThread, DT_CONTEXT * pContextBuffer)
- void Unpack_GetContext(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void ConvertContextToDebuggerRegDisplay(const DT_CONTEXT * pInContext, DebuggerREGDISPLAY * pOutDRD, BOOL fActive)
- void Unpack_ConvertContextToDebuggerRegDisplay(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // IDacDbiInterface::DynamicMethodType IsILStubOrLCGMethod(VMPTR_MethodDesc vmMethodDesc)
- void Unpack_IsILStubOrLCGMethod(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // TargetBuffer GetVarArgSig(CORDB_ADDRESS VASigCookieAddr, CORDB_ADDRESS * pArgBase)
- void Unpack_GetVarArgSig(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // GENERICS_TYPE_TOKEN ResolveExactGenericArgsToken(DWORD dwExactGenericArgsTokenIndex, GENERICS_TYPE_TOKEN rawToken)
- void Unpack_ResolveExactGenericArgsToken(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetILCodeAndSig(VMPTR_DomainFile vmDomainFile, mdToken functionToken, TargetBuffer * pCodeInfo, mdToken * pLocalSigToken)
- void Unpack_GetILCodeAndSig(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetNativeCodeInfo(VMPTR_DomainFile vmDomainFile, mdToken functionToken, NativeCodeFunctionData * pCodeInfo)
- void Unpack_GetNativeCodeInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetNativeCodeInfoForAddr(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS hotCodeStartAddr, NativeCodeFunctionData * pCodeInfo)
- void Unpack_GetNativeCodeInfoForAddr(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetClassInfo(VMPTR_AppDomain vmAppDomain, VMPTR_Module vmModule, mdTypeDef metadataToken, VMPTR_TypeHandle thExact, VMPTR_TypeHandle thApprox, ClassInfo * pData)
- void Unpack_GetClassInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetInstantiationFieldInfo(VMPTR_DomainFile vmDomainFile, mdTypeDef metadataToken, VMPTR_TypeHandle vmThExact, VMPTR_TypeHandle vmThApprox, DacDbiArrayList<FieldData> * pFieldList, SIZE_T * pObjectSize)
- void Unpack_GetInstantiationFieldInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void TypeHandleToExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
- void Unpack_TypeHandleToExpandedTypeInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetObjectExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, CORDB_ADDRESS addr, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
- void Unpack_GetObjectExpandedTypeInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_TypeHandle GetApproxTypeHandle(TypeInfoList * pTypeData)
- void Unpack_GetApproxTypeHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_TypeHandle GetExactTypeHandle(DebuggerIPCE_ExpandedTypeData * pTypeData, ArgInfoList * pArgInfo)
- void Unpack_GetExactTypeHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetMethodDescParams(VMPTR_AppDomain vmAppDomain, VMPTR_MethodDesc vmMethodDesc, GENERICS_TYPE_TOKEN genericsToken, UINT32 * pcGenericClassTypeParams, TypeParamsList * pGenericTypeParams)
- void Unpack_GetMethodDescParams(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CORDB_ADDRESS GetThreadOrContextStaticAddress(VMPTR_FieldDesc vmField, VMPTR_Thread vmRuntimeThread)
- void Unpack_GetThreadOrContextStaticAddress(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CORDB_ADDRESS GetCollectibleTypeStaticAddress(VMPTR_FieldDesc vmField, VMPTR_AppDomain vmAppDomain)
- void Unpack_GetCollectibleTypeStaticAddress(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetEnCHangingFieldInfo(const EnCHangingFieldInfo * pEnCFieldInfo, FieldData * pFieldData, BOOL * pfStatic)
- void Unpack_GetEnCHangingFieldInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetTypeHandleParams(VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, TypeParamsList * pParams)
- void Unpack_GetTypeHandleParams(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetSimpleType(VMPTR_AppDomain vmAppDomain, CorElementType simpleType, mdTypeDef * pMetadataToken, VMPTR_DomainFile * pVmDomainFile)
- void Unpack_GetSimpleType(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetTypedByRefInfo(CORDB_ADDRESS pTypedByRef, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
- void Unpack_GetTypedByRefInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetStringData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
- void Unpack_GetStringData(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetArrayData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
- void Unpack_GetArrayData(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetBasicObjectInfo(CORDB_ADDRESS objectAddress, CorElementType type, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
- void Unpack_GetBasicObjectInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void TestCrst(VMPTR_Crst vmCrst)
- void Unpack_TestCrst(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void TestRWLock(VMPTR_SimpleRWLock vmRWLock)
- void Unpack_TestRWLock(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CORDB_ADDRESS GetDebuggerControlBlockAddress()
- void Unpack_GetDebuggerControlBlockAddress(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_Object GetObjectFromRefPtr(CORDB_ADDRESS ptr)
- void Unpack_GetObjectFromRefPtr(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_Object GetObject(CORDB_ADDRESS ptr)
- void Unpack_GetObject(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_OBJECTHANDLE GetVmObjectHandle(CORDB_ADDRESS handleAddress)
- void Unpack_GetVmObjectHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsVmObjectHandleValid(VMPTR_OBJECTHANDLE vmHandle)
- void Unpack_IsVmObjectHandleValid(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // ULONG GetAppDomainIdFromVmObjectHandle(VMPTR_OBJECTHANDLE vmHandle)
- void Unpack_GetAppDomainIdFromVmObjectHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CORDB_ADDRESS GetHandleAddressFromVmHandle(VMPTR_OBJECTHANDLE vmHandle)
- void Unpack_GetHandleAddressFromVmHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // TargetBuffer GetObjectContents(VMPTR_Object obj)
- void Unpack_GetObjectContents(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateBlockingObjects(VMPTR_Thread vmThread, IDacDbiInterface::FP_BLOCKINGOBJECT_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateBlockingObjects(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // MonitorLockInfo GetThreadOwningMonitorLock(VMPTR_Object vmObject)
- void Unpack_GetThreadOwningMonitorLock(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateMonitorEventWaitList(VMPTR_Object vmObject, IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateMonitorEventWaitList(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsManagedDebugEventPending()
- void Unpack_IsManagedDebugEventPending(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool GetMetaDataFileInfoFromPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwImageSize, bool & isNGEN, IStringHolder * pStrFilename)
- void Unpack_GetMetaDataFileInfoFromPEFile(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool GetILImageInfoFromNgenPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwSize, IStringHolder * pStrFilename)
- void Unpack_GetILImageInfoFromNgenPEFile(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool IsThreadSuspendedOrHijacked(VMPTR_Thread vmThread)
- void Unpack_IsThreadSuspendedOrHijacked(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool AreGCStructuresValid()
- void Unpack_AreGCStructuresValid(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT CreateHeapWalk(HeapWalkHandle * pHandle)
- void Unpack_CreateHeapWalk(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void DeleteHeapWalk(HeapWalkHandle handle)
- void Unpack_DeleteHeapWalk(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT WalkHeap(HeapWalkHandle handle, ULONG count, COR_HEAPOBJECT * objects, ULONG * pFetched)
- void Unpack_WalkHeap(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT GetHeapSegments(DacDbiArrayList<COR_SEGMENT> * pSegments)
- void Unpack_GetHeapSegments(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool IsValidObject(CORDB_ADDRESS obj)
- void Unpack_IsValidObject(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool GetAppDomainForObject(CORDB_ADDRESS obj, VMPTR_AppDomain * pApp, VMPTR_Module * pModule, VMPTR_DomainFile * pDomainFile)
- void Unpack_GetAppDomainForObject(ReadBuffer * pSend, WriteBuffer * pResult);
-
- };
-
-#endif // _DDUNPACK_H_
-
-#endif //FEATURE_DBGIPC_TRANSPORT_VM
-
-// end of file
diff --git a/src/debug/debug-pal/.gitmirror b/src/debug/debug-pal/.gitmirror
new file mode 100644
index 0000000000..f507630f94
--- /dev/null
+++ b/src/debug/debug-pal/.gitmirror
@@ -0,0 +1 @@
+Only contents of this folder, excluding subfolders, will be mirrored by the Git-TFS Mirror. \ No newline at end of file
diff --git a/src/debug/debug-pal/CMakeLists.txt b/src/debug/debug-pal/CMakeLists.txt
new file mode 100644
index 0000000000..4070f4b350
--- /dev/null
+++ b/src/debug/debug-pal/CMakeLists.txt
@@ -0,0 +1,32 @@
+
+include_directories(../inc)
+include_directories(../../pal/inc)
+
+
+if(WIN32)
+ #use static crt
+ add_definitions(-MT)
+ add_definitions(-DWIN32_LEAN_AND_MEAN)
+ include_directories(../../inc) #needed for warning control
+
+ set(TWO_WAY_PIPE_SOURCES
+ win/twowaypipe.cpp
+ )
+endif(WIN32)
+
+if(CLR_CMAKE_PLATFORM_UNIX)
+ add_compile_options(-fPIC)
+
+ add_definitions(-DFEATURE_PAL)
+ add_definitions(-DPAL_IMPLEMENTATION)
+
+ set(TWO_WAY_PIPE_SOURCES
+ unix/twowaypipe.cpp
+ unix/dynamiclibaddress.cpp
+ )
+
+endif(CLR_CMAKE_PLATFORM_UNIX)
+
+add_library(debug-pal STATIC ${TWO_WAY_PIPE_SOURCES})
+
+install (TARGETS debug-pal DESTINATION .)
diff --git a/src/debug/debug-pal/unix/.gitmirror b/src/debug/debug-pal/unix/.gitmirror
new file mode 100644
index 0000000000..f507630f94
--- /dev/null
+++ b/src/debug/debug-pal/unix/.gitmirror
@@ -0,0 +1 @@
+Only contents of this folder, excluding subfolders, will be mirrored by the Git-TFS Mirror. \ No newline at end of file
diff --git a/src/debug/debug-pal/unix/dynamiclibaddress.cpp b/src/debug/debug-pal/unix/dynamiclibaddress.cpp
new file mode 100644
index 0000000000..bd86831d9e
--- /dev/null
+++ b/src/debug/debug-pal/unix/dynamiclibaddress.cpp
@@ -0,0 +1,81 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+#include "windefs.h"
+#include <stdio.h>
+
+
+void *GetDynamicLibraryAddressInProcess(DWORD pid, const char *libraryName)
+{
+#ifdef HAVE_PROCFS_CTL
+ // Here we read /proc/<pid>/maps file in order to parse it and figure out what it says
+ // about a library we are looking for. This file looks something like this:
+ //
+ // [address] [perms] [offset] [dev] [inode] [pathname] - HEADER is not preset in an actual file
+ //
+ // 35b1800000-35b1820000 r-xp 00000000 08:02 135522 /usr/lib64/ld-2.15.so
+ // 35b1a1f000-35b1a20000 r--p 0001f000 08:02 135522 /usr/lib64/ld-2.15.so
+ // 35b1a20000-35b1a21000 rw-p 00020000 08:02 135522 /usr/lib64/ld-2.15.so
+ // 35b1a21000-35b1a22000 rw-p 00000000 00:00 0 [heap]
+ // 35b1c00000-35b1dac000 r-xp 00000000 08:02 135870 /usr/lib64/libc-2.15.so
+ // 35b1dac000-35b1fac000 ---p 001ac000 08:02 135870 /usr/lib64/libc-2.15.so
+ // 35b1fac000-35b1fb0000 r--p 001ac000 08:02 135870 /usr/lib64/libc-2.15.so
+ // 35b1fb0000-35b1fb2000 rw-p 001b0000 08:02 135870 /usr/lib64/libc-2.15.so
+
+ void *result = NULL;
+
+ // Making something like: /proc/123/maps
+ char mapFileName[100];
+ int chars = snprintf(mapFileName, sizeof(mapFileName), "/proc/%d/maps", pid);
+ _ASSERTE(chars > 0 && chars <= sizeof(mapFileName));
+
+ // Making something like: /libcoreclr.so
+ char slashLibName[PATH_MAX];
+ chars = snprintf(slashLibName, sizeof(slashLibName), "/%s", libraryName);
+ _ASSERTE(chars > 0 && chars <= sizeof(mapFileName));
+ size_t slashLibNameLen = strlen(slashLibName);
+
+ FILE *mapsFile = fopen(mapFileName, "r");
+ if (mapsFile == NULL)
+ {
+ return NULL;
+ }
+
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t read;
+
+ // Reading maps file line by line
+ while ((read = getline(&line, &len, mapsFile)) != -1)
+ {
+ //Checking if this line ends with /libraryName\n
+ const char *expectedLibLocation = line + strlen(line) - 1 - slashLibNameLen;
+ if (expectedLibLocation > line && strncmp(expectedLibLocation, slashLibName, slashLibNameLen) == 0)
+ {
+ void *address1, *address2, *offset;
+ // We found a record for our library
+ // let's parse address and offset
+
+ if (sscanf(line, "%p-%p %*[-rwxsp] %p", &address1, &address2, &offset) == 3)
+ {
+ // We were able to read all the info we need
+ if (offset == 0)
+ {
+ // We found address that corresponds to the very beginning of the lib we're looking for
+ result = address1;
+ break;
+ }
+ }
+ }
+ }
+
+ free(line); // We didn't allocate line, but as per contract of getline we should free it
+ fclose(mapsFile);
+ return result;
+
+#else
+ _ASSERTE(!"Not implemented on this platform");
+ return NULL;
+#endif
+} \ No newline at end of file
diff --git a/src/debug/debug-pal/unix/twowaypipe.cpp b/src/debug/debug-pal/unix/twowaypipe.cpp
new file mode 100644
index 0000000000..d97cc8ec4e
--- /dev/null
+++ b/src/debug/debug-pal/unix/twowaypipe.cpp
@@ -0,0 +1,172 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <limits.h>
+
+#include "windefs.h"
+#include "twowaypipe.h"
+
+#define PIPE_NAME_FORMAT_STR "/tmp/clr-debug-pipe-%d-%s"
+
+static void GetPipeName(char *name, DWORD id, const char *suffix)
+{
+ int chars = snprintf(name, PATH_MAX, PIPE_NAME_FORMAT_STR, id, suffix);
+ _ASSERTE(chars > 0 && chars < PATH_MAX);
+}
+
+// Creates a server side of the pipe.
+// Id is used to create pipes names and uniquely identify the pipe on the machine.
+// true - success, false - failure (use GetLastError() for more details)
+bool TwoWayPipe::CreateServer(DWORD id)
+{
+ _ASSERTE(m_state == NotInitialized);
+ if (m_state != NotInitialized)
+ return false;
+
+ m_id = id;
+ char inPipeName[PATH_MAX];
+ char outPipeName[PATH_MAX];
+ GetPipeName(inPipeName, id, "in");
+ GetPipeName(outPipeName, id, "out");
+
+ //TODO: REVIEW if S_IRWXU | S_IRWXG is the right access level in prof use
+ if (mkfifo(inPipeName, S_IRWXU | S_IRWXG) == -1)
+ {
+ return false;
+ }
+
+ if (mkfifo(outPipeName, S_IRWXU | S_IRWXG) == -1)
+ {
+ remove(inPipeName);
+ return false;
+ }
+
+ m_state = Created;
+ return true;
+}
+
+
+// Connects to a previously opened server side of the pipe.
+// Id is used to locate the pipe on the machine.
+// true - success, false - failure (use GetLastError() for more details)
+bool TwoWayPipe::Connect(DWORD id)
+{
+ _ASSERTE(m_state == NotInitialized);
+ if (m_state != NotInitialized)
+ return false;
+
+ m_id = id;
+ char inPipeName[PATH_MAX];
+ char outPipeName[PATH_MAX];
+ //"in" and "out" are switched deliberately, because we're on the client
+ GetPipeName(inPipeName, id, "out");
+ GetPipeName(outPipeName, id, "in");
+
+ // Pipe opening order is reversed compared to WaitForConnection()
+ // in order to avaid deadlock.
+ m_outboundPipe = open(outPipeName, O_WRONLY);
+ if (m_outboundPipe == INVALID_PIPE)
+ {
+ return false;
+ }
+
+ m_inboundPipe = open(inPipeName, O_RDONLY);
+ if (m_inboundPipe == INVALID_PIPE)
+ {
+ close(m_outboundPipe);
+ m_outboundPipe = INVALID_PIPE;
+ return false;
+ }
+
+ m_state = ClientConnected;
+ return true;
+
+}
+
+// Waits for incoming client connections, assumes GetState() == Created
+// true - success, false - failure (use GetLastError() for more details)
+bool TwoWayPipe::WaitForConnection()
+{
+ _ASSERTE(m_state == Created);
+ if (m_state != Created)
+ return false;
+
+ char inPipeName[PATH_MAX];
+ char outPipeName[PATH_MAX];
+ GetPipeName(inPipeName, m_id, "in");
+ GetPipeName(outPipeName, m_id, "out");
+
+ m_inboundPipe = open(inPipeName, O_RDONLY);
+ if (m_inboundPipe == INVALID_PIPE)
+ {
+ return false;
+ }
+
+ m_outboundPipe = open(outPipeName, O_WRONLY);
+ if (m_outboundPipe == INVALID_PIPE)
+ {
+ close(m_inboundPipe);
+ m_inboundPipe = INVALID_PIPE;
+ return false;
+ }
+
+ m_state = ServerConnected;
+ return true;
+}
+
+// Reads data from pipe. Returns number of bytes read or a negative number in case of an error.
+// use GetLastError() for more details
+int TwoWayPipe::Read(void *buffer, DWORD bufferSize)
+{
+ _ASSERTE(m_state == ServerConnected || m_state == ClientConnected);
+ return (int)read(m_inboundPipe, buffer, bufferSize);
+}
+
+// Writes data to pipe. Returns number of bytes written or a negative number in case of an error.
+// use GetLastError() for more details
+int TwoWayPipe::Write(const void *data, DWORD dataSize)
+{
+ _ASSERTE(m_state == ServerConnected || m_state == ClientConnected);
+ return (int)write(m_outboundPipe, data, dataSize);
+}
+
+// Disconnect server or client side of the pipe.
+// true - success, false - failure (use GetLastError() for more details)
+bool TwoWayPipe::Disconnect()
+{
+
+ if (m_outboundPipe != INVALID_PIPE)
+ {
+ close(m_outboundPipe);
+ m_outboundPipe = INVALID_PIPE;
+ }
+
+ if (m_inboundPipe != INVALID_PIPE)
+ {
+ close(m_inboundPipe);
+ m_inboundPipe = INVALID_PIPE;
+ }
+
+ if (m_state == ServerConnected || m_state == Created)
+ {
+
+ char inPipeName[PATH_MAX];
+ GetPipeName(inPipeName, m_id, "in");
+ remove(inPipeName);
+
+ char outPipeName[PATH_MAX];
+ GetPipeName(outPipeName, m_id, "out");
+ remove(outPipeName);
+ }
+
+ m_state = NotInitialized;
+ return true;
+}
+
diff --git a/src/debug/debug-pal/unix/windefs.h b/src/debug/debug-pal/unix/windefs.h
new file mode 100644
index 0000000000..482ef61d89
--- /dev/null
+++ b/src/debug/debug-pal/unix/windefs.h
@@ -0,0 +1,13 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+// It'd be nice to be able to include some existing header from the main PAL,
+// but they tend to pull too much stuff that breaks everything.
+
+#include <cstddef>
+#include <assert.h>
+#define _ASSERTE assert
+
+typedef unsigned int DWORD;
diff --git a/src/debug/debug-pal/win/.gitmirror b/src/debug/debug-pal/win/.gitmirror
new file mode 100644
index 0000000000..f507630f94
--- /dev/null
+++ b/src/debug/debug-pal/win/.gitmirror
@@ -0,0 +1 @@
+Only contents of this folder, excluding subfolders, will be mirrored by the Git-TFS Mirror. \ No newline at end of file
diff --git a/src/debug/debug-pal/win/twowaypipe.cpp b/src/debug/debug-pal/win/twowaypipe.cpp
new file mode 100644
index 0000000000..49876871c0
--- /dev/null
+++ b/src/debug/debug-pal/win/twowaypipe.cpp
@@ -0,0 +1,211 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+#include <windows.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <assert.h>
+#include "twowaypipe.h"
+
+#define _ASSERTE assert
+
+// This file contains implementation of a simple IPC mechanism - bidirectional named pipe.
+// It is implemented on top of two one-directional names pipes (fifos on UNIX)
+
+
+// Creates a server side of the pipe.
+// Id is used to create pipes names and uniquely identify the pipe on the machine.
+// true - success, false - failure (use GetLastError() for more details)
+bool TwoWayPipe::CreateServer(DWORD id)
+{
+ _ASSERTE(m_state == NotInitialized);
+ if (m_state != NotInitialized)
+ return false;
+
+ m_inboundPipe = CreateOneWayPipe(id, true);
+ if (m_inboundPipe == INVALID_HANDLE_VALUE)
+ {
+ return false;
+ }
+
+ m_outboundPipe = CreateOneWayPipe(id, false);
+ if (m_outboundPipe == INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(m_inboundPipe);
+ m_inboundPipe = INVALID_HANDLE_VALUE;
+ return false;
+ }
+
+ m_state = Created;
+ return true;
+}
+
+
+// Connects to a previously opened server side of the pipe.
+// Id is used to locate the pipe on the machine.
+// true - success, false - failure (use GetLastError() for more details)
+bool TwoWayPipe::Connect(DWORD id)
+{
+ _ASSERTE(m_state == NotInitialized);
+ if (m_state != NotInitialized)
+ return false;
+
+ m_inboundPipe = OpenOneWayPipe(id, true);
+ if (m_inboundPipe == INVALID_HANDLE_VALUE)
+ {
+ return false;
+ }
+
+ m_outboundPipe = OpenOneWayPipe(id, false);
+ if (m_outboundPipe == INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(m_inboundPipe);
+ m_inboundPipe = INVALID_HANDLE_VALUE;
+ return false;
+ }
+
+ m_state = ClientConnected;
+ return true;
+
+}
+
+// Waits for incoming client connections, assumes GetState() == Created
+// true - success, false - failure (use GetLastError() for more details)
+bool TwoWayPipe::WaitForConnection()
+{
+ _ASSERTE(m_state == Created);
+ if (m_state != Created)
+ return false;
+
+ if (!ConnectNamedPipe(m_inboundPipe, NULL))
+ {
+ auto error = GetLastError();
+ if (error != ERROR_PIPE_CONNECTED)
+ return false;
+ }
+
+ if (!ConnectNamedPipe(m_outboundPipe, NULL))
+ {
+ auto error = GetLastError();
+ if (error != ERROR_PIPE_CONNECTED)
+ return false;
+ }
+
+ m_state = ServerConnected;
+ return true;
+}
+
+// Reads data from pipe. Returns number of bytes read or a negative number in case of an error.
+// use GetLastError() for more details
+int TwoWayPipe::Read(void *buffer, DWORD bufferSize)
+{
+ _ASSERTE(m_state == ServerConnected || m_state == ClientConnected);
+ DWORD bytesRead;
+ BOOL ok = ReadFile(m_inboundPipe, buffer, bufferSize, &bytesRead, NULL);
+
+ if (ok)
+ {
+ return (int)bytesRead;
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+// Writes data to pipe. Returns number of bytes written or a negative number in case of an error.
+// use GetLastError() for more details
+int TwoWayPipe::Write(const void *data, DWORD dataSize)
+{
+ _ASSERTE(m_state == ServerConnected || m_state == ClientConnected);
+ DWORD bytesWritten;
+ BOOL ok = WriteFile(m_outboundPipe, data, dataSize, &bytesWritten, NULL);
+
+ if (ok)
+ {
+ FlushFileBuffers(m_outboundPipe);
+ return (int)bytesWritten;
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+// Disconnect server or client side of the pipe.
+// true - success, false - failure (use GetLastError() for more details)
+bool TwoWayPipe::Disconnect()
+{
+ if (m_state == ServerConnected)
+ {
+ DisconnectNamedPipe(m_outboundPipe);
+ DisconnectNamedPipe(m_inboundPipe);
+ CloseHandle(m_outboundPipe);
+ m_outboundPipe = INVALID_HANDLE_VALUE;
+ CloseHandle(m_inboundPipe);
+ m_inboundPipe = INVALID_HANDLE_VALUE;
+ m_state = NotInitialized;
+ return true;
+ }
+ else if (m_state == ClientConnected)
+ {
+ CloseHandle(m_outboundPipe);
+ m_outboundPipe = INVALID_HANDLE_VALUE;
+ CloseHandle(m_inboundPipe);
+ m_inboundPipe = INVALID_HANDLE_VALUE;
+ m_state = NotInitialized;
+ return true;
+ }
+ else
+ {
+ // nothign to do
+ return true;
+ }
+}
+
+#define PIPE_NAME_FORMAT_STR L"\\\\.\\pipe\\clr-debug-pipe-%d-%s"
+
+// Connects to a one sided pipe previously created by CreateOneWayPipe.
+// In order to successfully connect id and inbound flag should be the same.
+HANDLE TwoWayPipe::OpenOneWayPipe(DWORD id, bool inbound)
+{
+ WCHAR fullName[MAX_PATH];
+ // "in" and "out" are deliberately switched because we're opening a client side connection
+ int chars = swprintf_s(fullName, MAX_PATH, PIPE_NAME_FORMAT_STR, id, inbound ? L"out" : L"in");
+ _ASSERTE(chars > 0);
+
+ HANDLE handle = CreateFileW(
+ fullName,
+ inbound ? GENERIC_READ : GENERIC_WRITE,
+ 0, // no sharing
+ NULL, // default security attributes
+ OPEN_EXISTING, // opens existing pipe
+ 0, // default attributes
+ NULL); // no template file
+
+ return handle;
+}
+
+
+// Creates a one way pipe, id and inboud flag are used for naming.
+// Created pipe is supposed to be connected to by OpenOneWayPipe.
+HANDLE TwoWayPipe::CreateOneWayPipe(DWORD id, bool inbound)
+{
+ WCHAR fullName[MAX_PATH];
+ int chars = swprintf_s(fullName, MAX_PATH, PIPE_NAME_FORMAT_STR, id, inbound ? L"in" : L"out");
+ _ASSERTE(chars > 0);
+
+ HANDLE handle = CreateNamedPipeW(fullName,
+ (inbound ? PIPE_ACCESS_INBOUND : PIPE_ACCESS_OUTBOUND) | FILE_FLAG_FIRST_PIPE_INSTANCE,
+ PIPE_TYPE_BYTE | PIPE_WAIT | PIPE_REJECT_REMOTE_CLIENTS,
+ 1, // max number of instances
+ 4000, //in buffer size
+ 4000, //out buffer size
+ 0, // default timeout
+ NULL); // default security
+
+ return handle;
+}
+
diff --git a/src/debug/di/CMakeLists.txt b/src/debug/di/CMakeLists.txt
index 6546b69920..b360aa4e97 100644
--- a/src/debug/di/CMakeLists.txt
+++ b/src/debug/di/CMakeLists.txt
@@ -13,9 +13,11 @@ set(CORDBDI_SOURCES
breakpoint.cpp
cordb.cpp
divalue.cpp
+ dbgtransportmanager.cpp
hash.cpp
module.cpp
nativepipeline.cpp
+ eventredirectionpipeline.cpp
platformspecific.cpp
process.cpp
rsappdomain.cpp
diff --git a/src/debug/di/cordb.cpp b/src/debug/di/cordb.cpp
index 1267748fc5..cb3efca81a 100644
--- a/src/debug/di/cordb.cpp
+++ b/src/debug/di/cordb.cpp
@@ -210,7 +210,12 @@ BOOL WINAPI DbgDllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
#endif
#if defined(FEATURE_DBGIPC_TRANSPORT_DI)
- g_pDbgTransportManager = NULL;
+ g_pDbgTransportTarget = new (nothrow) DbgTransportTarget();
+ if (g_pDbgTransportTarget == NULL)
+ return FALSE;
+
+ if (FAILED(g_pDbgTransportTarget->Init()))
+ return FALSE;
#endif // FEATURE_DBGIPC_TRANSPORT_DI
}
break;
@@ -238,58 +243,31 @@ BOOL WINAPI DbgDllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
TlsFree(DbgRSThread::s_TlsSlot);
DbgRSThread::s_TlsSlot = TLS_OUT_OF_INDEXES;
#endif
- }
- break;
- }
-
- return TRUE;
-}
#if defined(FEATURE_DBGIPC_TRANSPORT_DI)
-// Routines to initialize and shutdown the debugger transport manager. Can't do these operations from DllMain
-// since they perform blocking network operations which can easily cause deadlocks on the loader lock.
-// Note: These routines are *not* thread safe (it's assumed the caller implements its own serialization).
-extern "C" HRESULT __stdcall InitDbgTransportManager()
-{
- if (g_pDbgTransportManager)
- return S_OK;
-
- DbgTransportManager *pManager = new (nothrow) DbgTransportManager();
- if (pManager == NULL)
- return E_OUTOFMEMORY;
+ if (g_pDbgTransportTarget != NULL)
+ {
+ g_pDbgTransportTarget->Shutdown();
+ delete g_pDbgTransportTarget;
+ g_pDbgTransportTarget = NULL;
+ }
+#endif // FEATURE_DBGIPC_TRANSPORT_DI
- HRESULT hr = pManager->Init();
- if (FAILED(hr))
- {
- pManager->Shutdown();
- delete pManager;
- return hr;
+ }
+ break;
}
- _ASSERTE(g_pDbgTransportManager == NULL);
- g_pDbgTransportManager = pManager;
-
- return S_OK;
+ return TRUE;
}
-extern "C" void __stdcall ShutdownDbgTransportManager()
-{
- if (g_pDbgTransportManager)
- {
- g_pDbgTransportManager->Shutdown();
- delete g_pDbgTransportManager;
- g_pDbgTransportManager = NULL;
- }
-}
-#endif // FEATURE_DBGIPC_TRANSPORT_DI
// The obsolete v1 CLSID - see comment above for details.
static const GUID CLSID_CorDebug_V1 = {0x6fef44d0,0x39e7,0x4c77, { 0xbe,0x8e,0xc9,0xf8,0xcf,0x98,0x86,0x30}};
#if defined(FEATURE_DBGIPC_TRANSPORT_DI)
-// include the GUID for Mac SilverLight debugging
-#include <maccoreclrdebugguids.h>
+// GUID for Mac SilverLight debugging
+const GUID CLSID_CorDebug_Mac_SilverLight = {0x8bd1daae, 0x188e, 0x42f4, {0xb0, 0x09, 0x08, 0xfa, 0xfd, 0x17, 0x81, 0x3b}};
// The debug engine needs to implement an internal Visual Studio debugger interface (defined by the CPDE)
// which augments launch and attach requests so that we can obtain information from the port supplier (the
@@ -571,7 +549,7 @@ DbiSetThreadContext(HANDLE hThread,
*ctx = *(CONTEXT*)lpContext;
res = ::SetThreadContext(hThread, ctx);
_aligned_free(ctx);
- }
+ }
else
{
// malloc does not set the last error, but the caller of SetThreadContext
diff --git a/src/debug/di/dbgtransportmanager.cpp b/src/debug/di/dbgtransportmanager.cpp
index e00e3f9c82..e9b619de18 100644
--- a/src/debug/di/dbgtransportmanager.cpp
+++ b/src/debug/di/dbgtransportmanager.cpp
@@ -3,185 +3,16 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-
#include "stdafx.h"
#include "dbgtransportsession.h"
#include "dbgtransportmanager.h"
#include "coreclrremotedebugginginterfaces.h"
-#ifdef FEATURE_DBGIPC_TRANSPORT_DI
-
-//
-// Provides access to various process enumeration and control facilities for a remote machine.
-//
-
-// The one and only instance of the DbgTransportManager in the process.
-DbgTransportManager *g_pDbgTransportManager = NULL;
-
-DbgTransportManager::DbgTransportManager()
-{
- memset(this, 0, sizeof(*this));
-}
-
-// Startup/shutdown calls. These are ref-counted (cordbg, for instance, is constructed in such a way that
-// the command shell will attempt to load mscordbi and initialize an associated DbgTransportManager
-// multiple times).
-HRESULT DbgTransportManager::Init()
-{
- if (InterlockedIncrement(&m_lRefCount) == 1)
- {
- m_sLock.Init("DbgTransportManager Lock", RSLock::cLockFlat, RSLock::LL_DBG_TRANSPORT_MANAGER_LOCK);
- m_pTargets = NULL;
- }
-
- return S_OK;
-}
-
-void DbgTransportManager::Shutdown()
-{
- if (InterlockedDecrement(&m_lRefCount) == 0)
- {
- m_sLock.Destroy();
-
- while (m_pTargets)
- {
- TargetRef *pTargetRef = m_pTargets;
- m_pTargets = pTargetRef->m_pNext;
-
- pTargetRef->m_pTarget->Shutdown();
- delete pTargetRef->m_pTarget;
-
- delete pTargetRef;
- }
- }
-}
-
-// Attempt to connect to a debugging proxy on the machine at the given address and with the specified port
-// number. If the port number is given as zero use the port stored in user debugger configuration. On success
-// a pointer to a DbgTransportTarget object will be returned.
-HRESULT DbgTransportManager::ConnectToTarget(DWORD dwIPAddress, USHORT usPort, DbgTransportTarget **ppTarget)
-{
- RSLockHolder lock(&m_sLock);
-
- // Look for an existing target with matching IP address and port number.
- TargetRef *pTargetRef = m_pTargets;
- while (pTargetRef)
- {
- // Matches must have identical IP address and port number and must also be in a good connection state
- // (otherwise we're looking at a target that hit a network error and is just waiting until outstanding
- // references to it have been released -- in these circumstances we allow a new target to be allocated
- // in order to re-attempt connection to the proxy).
- if (pTargetRef->m_dwIPAddress == dwIPAddress &&
- pTargetRef->m_usPort == usPort &&
- !pTargetRef->m_pTarget->IsProxyConnectionBad())
- {
- pTargetRef->m_dwRefCount++;
- *ppTarget = pTargetRef->m_pTarget;
- return S_OK;
- }
-
- pTargetRef = pTargetRef->m_pNext;
- }
- // If we get here there wasn't an appropriate existing entry, so create one.
-
- // First the reference structure used to track the target.
- pTargetRef = new (nothrow) TargetRef();
- if (pTargetRef == NULL)
- return E_OUTOFMEMORY;
-
- // Then the target object itself.
- DbgTransportTarget *pTarget = new (nothrow) DbgTransportTarget();
- if (pTargetRef == NULL)
- {
- delete pTargetRef;
- return E_OUTOFMEMORY;
- }
-
- // Initialize the target (this will attempt a connection to the proxy immediately).
- HRESULT hr = pTarget->Init(dwIPAddress, usPort);
- if (FAILED(hr))
- {
- pTarget->Shutdown();
- delete pTarget;
- delete pTargetRef;
- return hr;
- }
-
- // Everything's good, go ahead and initialize and link in the target reference.
- pTargetRef->m_dwRefCount = 1;
- pTargetRef->m_pTarget = pTarget;
- pTargetRef->m_dwIPAddress = dwIPAddress;
- pTargetRef->m_usPort = usPort;
-
- pTargetRef->m_pNext = m_pTargets;
- m_pTargets = pTargetRef;
-
- *ppTarget = pTarget;
- return S_OK;
-}
-
-// Add another reference to a target already acquired by ConnectToTarget (used by clients when they want
-// to hand a target out to independent code).
-void DbgTransportManager::ReferenceTarget(DbgTransportTarget *pTarget)
-{
- RSLockHolder lock(&m_sLock);
-
- // We need to locate the target reference for this target.
- TargetRef *pTargetRef = m_pTargets;
- while (pTargetRef)
- {
- if (pTargetRef->m_pTarget == pTarget)
- {
- pTargetRef->m_dwRefCount++;
- return;
- }
- pTargetRef = pTargetRef->m_pNext;
- }
-
- // Shouldn't get here.
- _ASSERTE(FALSE);
-}
-
-// Release reference to a DbgTransportTarget. If this is the last active reference then the connection to the
-// proxy will be severed and the object deallocated.
-void DbgTransportManager::ReleaseTarget(DbgTransportTarget *pTarget)
-{
- RSLockHolder lock(&m_sLock);
-
- // We need to locate the target reference for this target (and the previous reference so we can perform
- // the fixup to remove the entry from the queue if this was the last reference to the target).
- TargetRef *pTargetRef = m_pTargets;
- TargetRef *pLastRef = NULL;
- while (pTargetRef)
- {
- if (pTargetRef->m_pTarget == pTarget)
- {
- pTargetRef->m_dwRefCount--;
- if (pTargetRef->m_dwRefCount == 0)
- {
- // This was the last reference to this particular target. Remove it from the queue and
- // deallocate it.
- if (pLastRef)
- pLastRef->m_pNext = pTargetRef->m_pNext;
- else
- m_pTargets = pTargetRef->m_pNext;
-
- delete pTargetRef;
-
- pTarget->Shutdown();
- delete pTarget;
- }
- return;
- }
- pLastRef = pTargetRef;
- pTargetRef = pTargetRef->m_pNext;
- }
+#ifdef FEATURE_DBGIPC_TRANSPORT_DI
- // Shouldn't get here.
- _ASSERTE(FALSE);
-}
+DbgTransportTarget *g_pDbgTransportTarget = NULL;
DbgTransportTarget::DbgTransportTarget()
{
@@ -189,136 +20,9 @@ DbgTransportTarget::DbgTransportTarget()
}
// Initialization routine called only by the DbgTransportManager.
-HRESULT DbgTransportTarget::Init(DWORD dwIPAddress, USHORT usPort)
+HRESULT DbgTransportTarget::Init()
{
- m_ullLastUpdate = 0;
- m_fShutdown = false;
-
- // Target platform is initially unknown. This gets set when the proxy replies to our initial GetSystemInfo
- // message.
- m_ePlatform = DTP_Unknown;
-
- // If a port number hasn't been specified query the debugger configuration for the current user, this will
- // give us the default.
- if (usPort == 0)
- {
- DbgConfiguration sDbgConfig;
- if (!GetDebuggerConfiguration(&sDbgConfig))
- {
- DbgTransportLog(LC_Always, "Failed to locate debugger configuration");
- return CORDBG_E_REMOTE_INVALID_CONFIG;
- }
- _ASSERTE(sDbgConfig.m_fEnabled); // Debugging is always enabled on right side.
- m_usProxyPort = sDbgConfig.m_usProxyPort;
- }
- else
- m_usProxyPort = usPort;
-
- // Do the same for IP address except the fallback is an environment variable (and after that 127.0.0.1 for
- // local debugging).
- if (dwIPAddress == 0)
- {
- LPWSTR wszProxyIP = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgTransportProxyAddress);
- if (wszProxyIP != NULL)
- {
- int cbReq = WszWideCharToMultiByte(CP_UTF8, 0, wszProxyIP, -1, 0, 0, 0, 0);
- char *szProxyIP = new (nothrow) char[cbReq + 1];
- if (szProxyIP != NULL)
- {
- WszWideCharToMultiByte(CP_UTF8, 0, wszProxyIP, -1, szProxyIP, cbReq + 1, 0,0);
- m_dwProxyIP = DBGIPC_NTOHL(inet_addr(szProxyIP));
- }
-
- REGUTIL::FreeConfigString(wszProxyIP);
- }
- if (m_dwProxyIP == 0)
- m_dwProxyIP = DBGIPC_NTOHL(inet_addr("127.0.0.1"));
- }
- else
- m_dwProxyIP = dwIPAddress;
-
- // Allocate the connection manager and initialize it.
- m_pConnectionManager = AllocateSecConnMgr();
- if (m_pConnectionManager == NULL)
- return E_OUTOFMEMORY;
-
- SecConnStatus eStatus = m_pConnectionManager->Initialize();
- if (eStatus != SCS_Success)
- {
- DbgTransportLog(LC_Always, "Failed to initialize connection manager with %u", eStatus);
- switch (eStatus)
- {
- case SCS_OutOfMemory:
- return E_OUTOFMEMORY;
- case SCS_InvalidConfiguration:
- return CORDBG_E_REMOTE_INVALID_CONFIG;
- default:
- return E_FAIL;
- }
- }
-
m_sLock.Init("DbgTransportTarget Lock", RSLock::cLockFlat, RSLock::LL_DBG_TRANSPORT_TARGET_LOCK);
- m_fInitLock = true;
-
- // Outgoing requests are identified with a monotonically increasing ID starting from 1.
- m_dwNextRequestID = 1;
-
- // We store a singly-linked list of requests to the proxy that haven't been replied yet.
- m_pRequestList = NULL;
-
- // Attempt to contact the proxy and form a connection to it.
- eStatus = m_pConnectionManager->AllocateConnection(m_dwProxyIP, m_usProxyPort, &m_pConnection);
- if (eStatus == SCS_Success)
- eStatus = m_pConnection->Connect();
- if (eStatus != SCS_Success)
- {
- DbgTransportLog(LC_Always, "Failed to connect to proxy with %u", eStatus);
- switch (eStatus)
- {
- case SCS_OutOfMemory:
- return E_OUTOFMEMORY;
- case SCS_UnknownTarget:
- return CORDBG_E_REMOTE_UNKNOWN_TARGET;
- case SCS_NoListener:
- return CORDBG_E_REMOTE_NO_LISTENER;
- case SCS_NetworkFailure:
- return CORDBG_E_REMOTE_NETWORK_FAILURE;
- case SCS_MismatchedCerts:
- return CORDBG_E_REMOTE_MISMATCHED_CERTS;
- default:
- return E_ABORT;
- }
- }
-
- // Create a thread used to monitor remote process state.
- m_hProcessEventThread = CreateThread(NULL, 0, ProcessEventWorkerStatic, this, 0, NULL);
- if (m_hProcessEventThread == NULL)
- return E_OUTOFMEMORY;
-
- // Send the initial message to the proxy which informs it of our protocol version and queries the target
- // platform and protocol version. This must be done after the thread above is started since we rely on
- // this thread to process replies.
- DWORD dwProxyMajorVersion;
- DWORD dwProxyMinorVersion;
- HRESULT hr = MakeProxyRequest(DPMT_GetSystemInfo,
- &dwProxyMajorVersion,
- &dwProxyMinorVersion,
- &m_ePlatform);
- if (FAILED(hr))
- {
- DbgTransportLog(LC_Always, "GetSystemInfo request to proxy failed with %08X", hr);
- return hr;
- }
-
- // Check that we can deal with the proxy's protocol.
- if (dwProxyMajorVersion != kCurrentMajorVersion)
- {
- DbgTransportLog(LC_Always, "Don't understand proxy protocol v%u.%u",
- dwProxyMajorVersion, dwProxyMinorVersion);
- return CORDBG_E_REMOTE_MISMATCHED_PROTOCOLS;
- }
-
- m_fProxyConnectionBad = false;
return S_OK;
}
@@ -328,89 +32,19 @@ void DbgTransportTarget::Shutdown()
{
DbgTransportLog(LC_Always, "DbgTransportTarget shutting down");
- m_fShutdown = true;
- m_fProxyConnectionBad = true;
-
- if (m_hProcessEventThread)
- {
- // Unwedge the process event thread if it's blocked in a Receive().
- m_pConnection->CancelReceive();
-
- // Wait for the process event thread to see the shutdown status and close itself down.
- WaitForSingleObject(m_hProcessEventThread, INFINITE);
- CloseHandle(m_hProcessEventThread);
- }
-
- // Cleanup process list.
- DeallocateProcessList(m_pProcessList);
-
- if (m_pConnection)
- m_pConnection->Destroy();
-
- if (m_pConnectionManager)
- m_pConnectionManager->Destroy();
-
- if (m_fInitLock)
- m_sLock.Destroy();
-}
-
-// Indicates when the connection to a proxy has failed: this target object will remain until the last
-// reference to it is released (DbgTransportManager::ReleaseTransport) but will fail all further requests. The
-// manager will then allow a new attempt to create a connection to the proxy to be made (wrapped in a new
-// DbgTransportTarget).
-bool DbgTransportTarget::IsProxyConnectionBad()
-{
- return m_fProxyConnectionBad;
-}
-
-// Fill caller allocated table at pdwProcesses with the pids of processes currently alive on the target
-// system. Return the number of slots filled in *pcProcesses. The size of the table is given by cSlots. If
-// more than this number of processes are alive then *pcProcesses is set to the total number and E_ABORT
-// returned.
-HRESULT DbgTransportTarget::EnumProcesses(DWORD *pdwProcesses, DWORD cSlots, DWORD *pcProcesses)
-{
- if (m_fProxyConnectionBad)
- return E_ABORT;
-
- *pcProcesses = 0;
-
- // Get an up-to-date process list from the proxy.
- UpdateProcessList();
-
- // Must access the process list under the lock.
{
RSLockHolder lock(&m_sLock);
-
- // Populate the output table from the new process list.
- DWORD i = 0;
- DWORD cSlotsLeft = cSlots;
-
- // Fill the output table with as many process IDs as we have (or until we run out of slots). Carry on
- // to the end of the process regardless so we can report how many processes there actually are.
- for (ProcessEntry *pProcess = m_pProcessList; pProcess; pProcess = pProcess->m_pNext)
+ while (m_pProcessList)
{
- // Entries for dead processes can persist until an associated transport is released. Don't report
- // these.
- if (pProcess->m_fExited)
- continue;
-
- if (cSlotsLeft)
- {
- pdwProcesses[i] = pProcess->m_dwPID;
- cSlotsLeft--;
- }
-
- i++;
+ ProcessEntry *pDelProcess = m_pProcessList;
+ m_pProcessList = m_pProcessList->m_pNext;
+ delete pDelProcess;
}
-
- // Return total count to caller.
- *pcProcesses = i;
-
- } // Leave lock
-
- return *pcProcesses > cSlots ? E_ABORT : S_OK;
+ }
+ m_sLock.Destroy();
}
+
// Given a PID attempt to find or create a DbgTransportSession instance to manage a connection to a runtime in
// that process. Returns E_UNEXPECTED if the process can't be found. Also returns a handle that can be waited
// on for process termination.
@@ -418,455 +52,167 @@ HRESULT DbgTransportTarget::GetTransportForProcess(DWORD dwPID
DbgTransportSession **ppTransport,
HANDLE *phProcessHandle)
{
- if (m_fProxyConnectionBad)
- return E_ABORT;
+ RSLockHolder lock(&m_sLock);
+ HRESULT hr = S_OK;
- // Get an up-to-date process list from the proxy.
- UpdateProcessList();
+ ProcessEntry *entry = LocateProcessByPID(dwPID);
- // Process list can only be examined under the lock.
+ if (entry == NULL)
{
- RSLockHolder lock(&m_sLock);
-
- // Scan each process in the list.
- ProcessEntry *pProcess = m_pProcessList;
- while (pProcess)
- {
- if (pProcess->m_dwPID == dwPID)
- {
- // We've found a match.
- if (pProcess->m_fExited)
- {
- // But it was for a dead process. Don't report this one (though we know the process is dead so
- // return E_UNEXPECTED).
- return E_UNEXPECTED;
- }
- RetryTransport:
- // If we already know about runtimes in this process then attempt to attach to the first one.
- // CORECLRTODO: In the next version we'll wire up the additional logic to enable the caller to
- // indicate which runtime they want to target within a single process.
- if (pProcess->m_pRuntimes)
- {
- RuntimeEntry *pRuntime = pProcess->m_pRuntimes;
+ NewHolder<ProcessEntry> newEntry = new(nothrow) ProcessEntry();
+ if (newEntry == NULL)
+ return E_OUTOFMEMORY;
- // If we have a runtime entry already then the LS is already present and we know the port
- // to connect to. If there's already a transport in place then we can (and must) use that.
- // Otherwise we can allocate and initialize one based on the port information.
- DbgTransportSession *pTransport = pRuntime->m_pDbgTransport;
- if (pTransport == NULL)
- {
- // No transport yet, allocate one.
- pTransport = new (nothrow) DbgTransportSession();
- if (pTransport == NULL)
- return E_OUTOFMEMORY;
+ NewHolder<DbgTransportSession> transport = new(nothrow) DbgTransportSession();
+ if (transport == NULL)
+ {
+ return E_OUTOFMEMORY;
+ }
- // Initialize it (this immediately starts the remote connection process).
- HRESULT hr = pTransport->Init(m_dwProxyIP, pRuntime->m_usPort, pProcess->m_hExitedEvent);
- if (FAILED(hr))
- {
- lock.Release();
- pTransport->Shutdown();
- delete pTransport;
- return hr;
- }
- pRuntime->m_pDbgTransport = pTransport;
- }
+ HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
+ if (hProcess == NULL)
+ {
+ return HRESULT_FROM_GetLastError();
+ }
- // One more caller knows about this transport instance. (Which in turn is another reason
- // the process can't be deleted yet).
- pRuntime->m_cTransportRef++;
- pProcess->m_cProcessRef++;
+ // Initialize it (this immediately starts the remote connection process).
+ hr = transport->Init(dwPID, hProcess);
+ if (FAILED(hr))
+ {
+ transport->Shutdown();
+ CloseHandle(hProcess);
+ return hr;
+ }
- *ppTransport = pTransport;
- if (!DuplicateHandle(GetCurrentProcess(),
- pProcess->m_hExitedEvent,
- GetCurrentProcess(),
- phProcessHandle,
- 0, // ignored since we are going to pass DUPLICATE_SAME_ACCESS
- FALSE,
- DUPLICATE_SAME_ACCESS))
- {
- lock.Release();
- return HRESULT_FROM_GetLastError();
- }
- return S_OK;
- }
+ entry = newEntry;
+ newEntry.SuppressRelease();
+ entry->m_dwPID = dwPID;
+ entry->m_hProcess = hProcess;
+ entry->m_transport = transport;
+ transport.SuppressRelease();
+ entry->m_cProcessRef = 0;
- // If we get here we've found the process record but there's no known runtime yet. The proxy
- // will send us an event if either a runtime starts up or the process dies, so we'll wait on
- // both of these. We can't wait with the lock held so increment the ref count on the process
- // (to keep the entry and the events we're about to wait on valid) and drop the lock first.
-
- pProcess->m_cProcessRef++;
- lock.Release();
-
- // We need to send an early attach notification to the proxy so that when the next runtime
- // starts up and registers it will know to suspend itself until we attach (i.e. this is the
- // early attach). Obviously we're racing with runtime startup here but that's by definition.
- bool fProcessExited;
- HRESULT hr = MakeProxyRequest(DPMT_EarlyAttach, pProcess->m_pruidProcess, &fProcessExited);
- if (FAILED(hr))
- {
- lock.Acquire();
- pProcess->m_cProcessRef--;
- return hr;
- }
-
- // The process might have managed to exit before we even built a process entry for it on this
- // side. In that case a process termination might have been missed. Checking for the exit
- // status again with the EarlyAttach request above closes the hole (we establish a process
- // entry and lock it in place so any termination events from that point on will be caught,
- // then we fire an EarlyAttach and check the current status).
- if (fProcessExited)
- {
- lock.Acquire();
- pProcess->m_cProcessRef--;
- pProcess->m_fExited = true;
- SetEvent(pProcess->m_hExitedEvent);
- return E_UNEXPECTED;
- }
-
- DbgTransportLog(LC_Always, "Waiting on runtime starting or process termination for %08X(%u, %u)",
- pProcess, pProcess->m_dwPID, pProcess->m_pruidProcess);
-
- HANDLE rgEvents[] = { pProcess->m_hRuntimeStartedEvent, pProcess->m_hExitedEvent };
- DWORD dwResult = WaitForMultipleObjectsEx(2, rgEvents, FALSE, INFINITE, FALSE);
- _ASSERTE(dwResult == WAIT_OBJECT_0 || dwResult == (WAIT_OBJECT_0 + 1));
-
- DbgTransportLog(LC_Always, " %s", dwResult == WAIT_OBJECT_0 ? "Runtime started" : "Process terminated");
-
- // Take the lock again and determine what our status is.
- lock.Acquire();
-
- // We have no further need to keep this process record alive (once we drop the lock).
- _ASSERTE(pProcess->m_cProcessRef > 0);
- pProcess->m_cProcessRef--;
-
- // If the process terminated then exit with E_UNEXPECTED. Note that this might be a zombie
- // entry marked with m_fExited = true in this case, but rather than duplicate entry cleanup
- // code we'll let the next process list update flush this record (now that the ref count has
- // been decremented).
- if (dwResult == (WAIT_OBJECT_0 + 1))
- return E_UNEXPECTED;
-
- // We should have at least one runtime entry now; just jump back to the code that knows how to
- // re-use or allocate a transport on it.
- _ASSERTE(pProcess->m_pRuntimes);
- goto RetryTransport;
- }
-
- pProcess = pProcess->m_pNext;
- }
- } // Leave lock
-
- // Didn't find a process with a matching PID.
- return E_UNEXPECTED;
-}
+ // Adding new entry to the list.
+ entry->m_pNext = m_pProcessList;
+ m_pProcessList = entry;
+ }
-// Returns true if the given PID identifies a running process which is hosting at least one CoreCLR
-// runtime.
-bool DbgTransportTarget::IsManagedProcess(DWORD dwPID)
-{
- // Maybe we already know the process is managed.
+ entry->m_cProcessRef++;
+ _ASSERTE(entry->m_cProcessRef > 0);
+ _ASSERTE(entry->m_transport != NULL);
+ _ASSERTE(entry->m_hProcess > 0);
+
+ *ppTransport = entry->m_transport;
+ if (!DuplicateHandle(GetCurrentProcess(),
+ entry->m_hProcess,
+ GetCurrentProcess(),
+ phProcessHandle,
+ 0, // ignored since we are going to pass DUPLICATE_SAME_ACCESS
+ FALSE,
+ DUPLICATE_SAME_ACCESS))
{
- RSLockHolder lock(&m_sLock);
- ProcessEntry *pProcess = LocateProcessByPID(dwPID);
-#ifdef _PREFAST_
-#pragma warning(push)
-#pragma warning(disable:6011) // Prefast doesn't understand the guard to avoid de-referencing a NULL pointer below.
-#endif // _PREFAST_
- if (pProcess && pProcess->m_pRuntimes)
- return true;
-#ifdef _PREFAST_
-#pragma warning(pop)
-#endif // _PREFAST_
- } // Leave lock
-
- // Get an up-to-date process list from the proxy in case we've haven't done this for a while and a runtime
- // has started up in the meantime.
- UpdateProcessList();
+ return HRESULT_FROM_GetLastError();
+ }
- // Try once again.
- {
- RSLockHolder lock(&m_sLock);
- ProcessEntry *pProcess = LocateProcessByPID(dwPID);
- return pProcess ? pProcess->m_pRuntimes != NULL : false;
- } // Leave lock
+ return hr;
}
+
// Release another reference to the transport associated with dwPID. Once all references are gone (modulo the
// manager's own weak reference) clean up the transport and deallocate it.
void DbgTransportTarget::ReleaseTransport(DbgTransportSession *pTransport)
{
- DbgTransportSession *pTransportToShutdown = NULL;
-
- // Process list can only be examined under the lock.
- {
- RSLockHolder lock(&m_sLock);
-
- // Scan all processes we know about.
- ProcessEntry *pProcess = m_pProcessList;
- while (pProcess)
- {
- // Scan each runtime we know about in the current process.
- RuntimeEntry *pRuntime = pProcess->m_pRuntimes;
- while (pRuntime)
- {
- if (pRuntime->m_pDbgTransport == pTransport)
- {
- // Found it.
+ RSLockHolder lock(&m_sLock);
- // Decrement the transport ref count. This is also one less reason to hold onto the
- // process record.
- _ASSERTE(pRuntime->m_cTransportRef > 0 && pProcess->m_cProcessRef > 0);
- pRuntime->m_cTransportRef--;
- pProcess->m_cProcessRef--;
+ ProcessEntry *entry = m_pProcessList;
- // If nobody references this transport any more we can shut it down and delete it. Don't
- // do this under the lock however.
- if (pRuntime->m_cTransportRef == 0)
- {
- pTransportToShutdown = pRuntime->m_pDbgTransport;
- pRuntime->m_pDbgTransport = NULL;
- }
+ // Pointer to the pointer that points to *entry.
+ // It either points to m_pProcessList or m_pNext of some entry.
+ // It is used to fix the linked list after deletion of an entry.
+ ProcessEntry **prevPtr = &m_pProcessList;
- lock.Release();
+ // Looking for ProcessEntry with a given transport
+ while (entry)
+ {
- // If we made the transport inaccessible above we can shut it down and deallocate it now.
- if (pTransportToShutdown)
- {
- pTransportToShutdown->Shutdown();
- delete pTransportToShutdown;
- }
+ _ASSERTE(entry->m_cProcessRef > 0);
+ _ASSERTE(entry->m_transport != NULL);
+ _ASSERTE(entry->m_hProcess > 0);
- return;
- }
+ if (entry->m_transport == pTransport)
+ {
+ // Mark that it has one less holder now
+ entry->m_cProcessRef--;
- pRuntime = pRuntime->m_pNext;
+ // If no more holders remove the entry from the list and free resources
+ if (entry->m_cProcessRef == 0)
+ {
+ *prevPtr = entry->m_pNext;
+ delete entry;
}
-
- pProcess = pProcess->m_pNext;
+ return;
}
- } // Leave lock
+ prevPtr = &entry->m_pNext;
+ entry = entry->m_pNext;
+ }
- _ASSERTE(!"Failed to find ProcessEntry to release transport reference");
+ _ASSERTE(!"Trying to release transport that doesn't belong to this DbgTransportTarget");
+ pTransport->Shutdown();
+ delete pTransport;
}
-// Run the command line given on the remote machine to create a process. Return the PID of this process. When
-// and if the process starts a runtime and registers with the proxy it will be told to halt and wait for a
-// debugger attach.
-HRESULT DbgTransportTarget::CreateProcess(LPCWSTR wszCommand,
- LPCWSTR wszArgs,
- LPCWSTR wszCurrentDirectory,
- LPVOID pvEnvironment,
- DWORD *pdwPID)
+HRESULT DbgTransportTarget::CreateProcess(LPCWSTR lpApplicationName,
+ LPCWSTR lpCommandLine,
+ LPSECURITY_ATTRIBUTES lpProcessAttributes,
+ LPSECURITY_ATTRIBUTES lpThreadAttributes,
+ BOOL bInheritHandles,
+ DWORD dwCreationFlags,
+ LPVOID lpEnvironment,
+ LPCWSTR lpCurrentDirectory,
+ LPSTARTUPINFOW lpStartupInfo,
+ LPPROCESS_INFORMATION lpProcessInformation)
{
- if (m_fProxyConnectionBad)
- return E_ABORT;
- DWORD cchCommand = wszCommand ? wcslen(wszCommand) : 0;
- DWORD cchArgs = wszArgs ? wcslen(wszArgs) : 0;
+ BOOL result = WszCreateProcess(lpApplicationName,
+ lpCommandLine,
+ lpProcessAttributes,
+ lpThreadAttributes,
+ bInheritHandles,
+ dwCreationFlags,
+ lpEnvironment,
+ lpCurrentDirectory,
+ lpStartupInfo,
+ lpProcessInformation);
- // Proxy expects the command line as a single string.
- LPWSTR wszCommandLine = (LPWSTR)_alloca((cchCommand + 1 + cchArgs + 1) * sizeof(WCHAR));
- wszCommandLine[0] = W('\0');
- if (wszCommand)
+ if (!result)
{
- wcscat(wszCommandLine, wszCommand);
- wcscat(wszCommandLine, W(" "));
+ return HRESULT_FROM_GetLastError();
}
- if (wszArgs)
- wcscat(wszCommandLine, wszArgs);
- // Check how big a UTF8 version of the command line would be.
- int cbReqd = WszWideCharToMultiByte(CP_UTF8, 0, wszCommandLine, -1, 0, 0, 0, 0);
-
- LPSTR szCommandLine = (LPSTR)_alloca(cbReqd);
-
- // Do the conversion from 16-bit.
- WszWideCharToMultiByte(CP_UTF8, 0, wszCommandLine, -1, szCommandLine, cbReqd, 0, 0);
-
- // If a default directory is supplied then convert it to UTF8.
- LPSTR szCurrentDirectory = NULL;
- if (wszCurrentDirectory)
- {
- cbReqd = WszWideCharToMultiByte(CP_UTF8, 0, wszCurrentDirectory, -1, 0, 0, 0, 0);
- szCurrentDirectory = (LPSTR)_alloca(cbReqd);
- WszWideCharToMultiByte(CP_UTF8, 0, wszCurrentDirectory, -1, szCurrentDirectory, cbReqd, 0, 0);
- }
-
- // Prepare to format an attribute block containing all the launch parameters we'll send to the proxy.
- // There are two phases: first we plan how much space will be required in the block then we allocate the
- // block and fill it in.
- DbgAttributeBlockWriter sAttrWriter;
-
- sAttrWriter.ScheduleStringValue(szCommandLine);
-
- if (szCurrentDirectory)
- sAttrWriter.ScheduleStringValue(szCurrentDirectory);
-
- // Determine how large the environment block is (if it's supplied).
- DWORD cbEnvironment = 0;
- if (pvEnvironment)
- {
- char *szEnv = (char *)pvEnvironment;
-
- // The environment is a series of nul-terminated strings followed by a final nul.
- while (*szEnv)
- {
- DWORD cbString = strlen(szEnv) + 1;
- cbEnvironment += cbString;
- szEnv += cbString;
- }
-
- // Account for final nul.
- cbEnvironment++;
- }
-
- if (cbEnvironment)
- sAttrWriter.ScheduleValue(cbEnvironment);
-
- // By now we know how large an attribute block we need.
- DWORD cbAttributeBlock = sAttrWriter.GetRequiredBufferSize();
- BYTE *pbAttributeBlock = new (nothrow) BYTE[cbAttributeBlock];
- if (pbAttributeBlock == NULL)
- return E_OUTOFMEMORY;
-
- // Initialize the attribute block.
- sAttrWriter.BeginFormatting((char*)pbAttributeBlock);
-
- sAttrWriter.AddStringValue(DAT_CommandLine, szCommandLine);
- if (szCurrentDirectory)
- sAttrWriter.AddStringValue(DAT_DefaultDirectory, szCurrentDirectory);
- if (cbEnvironment)
- sAttrWriter.AddValue(DAT_Environment, (char*)pvEnvironment, cbEnvironment);
-
- // Allocate a new process entry up front (but don't link it into the list until we know we've created the
- // remote process).
- ProcessEntry *pProcess = new (nothrow) ProcessEntry();
- if (pProcess == NULL)
- {
- delete [] pbAttributeBlock;
- return E_OUTOFMEMORY;
- }
- memset(pProcess, 0, sizeof(ProcessEntry));
-
- strncpy(pProcess->m_szCommandLine, szCommandLine, kMaxCommandLine);
- pProcess->m_szCommandLine[kMaxCommandLine - 1] = '\0';
-
- pProcess->m_hExitedEvent = WszCreateEvent(NULL, TRUE, FALSE, NULL); // Manual reset, not signalled
- if (pProcess->m_hExitedEvent == NULL)
- {
- delete [] pbAttributeBlock;
- delete pProcess;
- return E_OUTOFMEMORY;
- }
-
- pProcess->m_hRuntimeStartedEvent = WszCreateEvent(NULL, TRUE, FALSE, NULL); // Manual reset, not signalled
- if (pProcess->m_hRuntimeStartedEvent == NULL)
- {
- delete [] pbAttributeBlock;
- delete pProcess;
- return E_OUTOFMEMORY;
- }
-
- // Send the launch request to the proxy. It will reply with a PID or an hresult on failure.
- HRESULT hr = MakeProxyRequest(DPMT_LaunchProcess,
- pbAttributeBlock,
- &pProcess->m_dwPID,
- &pProcess->m_pruidProcess);
-
- delete [] pbAttributeBlock;
-
- if (SUCCEEDED(hr))
- {
- // The remote process has been created.
- *pdwPID = pProcess->m_dwPID;
-
- // Take the lock and check whether we already have an entry for this process (this can happen due to
- // an EnumProcesses from another thread).
- {
- RSLockHolder lock(&m_sLock);
- ProcessEntry *pSearchProcess = m_pProcessList;
- while (pSearchProcess)
- {
- if (pSearchProcess->m_pruidProcess == pProcess->m_pruidProcess)
- break;
- pSearchProcess = pSearchProcess->m_pNext;
- }
-
- if (pSearchProcess)
- {
- // Someone else has already made the update. Discard our unneeded copy.
- delete pProcess;
- }
- else
- {
- // No current entry for this process, link it in.
- pProcess->m_pNext = m_pProcessList;
- m_pProcessList = pProcess;
- }
- } // Leave lock
- }
- else
- {
- // The process was not created, throw away the process entry we'd prepared.
- delete pProcess;
- }
-
- return hr;
+ return S_OK;
}
// Kill the process identified by PID.
void DbgTransportTarget::KillProcess(DWORD dwPID)
{
- if (m_fProxyConnectionBad)
- return;
-
- PRUID pruidTarget = 0;
-
- // Look up the process by PID so we can find the corresponding PRUID (which is the proxy's version of the
- // PID).
- {
- RSLockHolder lock(&m_sLock);
- ProcessEntry *pProcess = LocateProcessByPID(dwPID);
- if (pProcess)
- pruidTarget = pProcess->m_pruidProcess;
- } // Leave lock
-
- if (pruidTarget)
+ HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
+ if (hProcess != NULL)
{
- HRESULT hr = MakeProxyRequest(DPMT_TerminateProcess, pruidTarget);
- if (FAILED(hr))
- {
- // Network failure could prevent our terminate from getting through. We don't currently support
- // rebuilding a network connection and retrying, so report the process as dead to prevent a hang
- // in the debugger on this end.
- RSLockHolder lock(&m_sLock);
- ProcessEntry *pProcess = LocateProcessByPID(dwPID);
- if (pProcess)
- {
- pProcess->m_fExited = true;
- SetEvent(pProcess->m_hExitedEvent);
- }
- } // Leave lock
+ TerminateProcess(hProcess, 0);
+ CloseHandle(hProcess);
}
}
-// Ask the remote debugger proxy for an updated list of processes and reflect these changes into our local
-// process list. Any failure will leave the current process list state unchanged.
-void DbgTransportTarget::UpdateProcessList()
+DbgTransportTarget::ProcessEntry::~ProcessEntry()
{
- // As an optimization, don't update the process list more than once a second.
- if ((CLRGetTickCount64() - m_ullLastUpdate) <= 1000)
- return;
- m_ullLastUpdate = CLRGetTickCount64();
+ CloseHandle(m_hProcess);
+ m_hProcess = NULL;
- // Send message to the proxy asking for a list of processes and CoreCLR instances. By the time the
- // MakeProxyRequest request call below completes the process/runtime database will have been updated.
- MakeProxyRequest(DPMT_EnumProcesses);
+ m_transport->Shutdown();
+ delete m_transport;
+ m_transport = NULL;
}
// Locate a process entry by PID. Assumes the lock is already held.
@@ -884,1031 +230,4 @@ DbgTransportTarget::ProcessEntry *DbgTransportTarget::LocateProcessByPID(DWORD d
return NULL;
}
-DbgTransportTarget::RuntimeEntry::~RuntimeEntry()
-{
- // If there's still a transport attached to the remote runtime shut it down and delete it.
- if (m_pDbgTransport)
- {
- m_pDbgTransport->Shutdown();
- delete m_pDbgTransport;
- }
-}
-
-DbgTransportTarget::ProcessEntry::~ProcessEntry()
-{
- // Clean up any records for runtimes hosted within this process.
- while (m_pRuntimes)
- {
- RuntimeEntry *pDelRuntime = m_pRuntimes;
- m_pRuntimes = m_pRuntimes->m_pNext;
- delete pDelRuntime;
- }
-
- if (m_hExitedEvent)
- CloseHandle(m_hExitedEvent);
-
- if (m_hRuntimeStartedEvent)
- CloseHandle(m_hRuntimeStartedEvent);
-}
-
-// Deallocate all resources associated with a process list.
-void DbgTransportTarget::DeallocateProcessList(ProcessEntry *pProcessList)
-{
- while (pProcessList)
- {
- ProcessEntry *pDelProcess = pProcessList;
- pProcessList = pProcessList->m_pNext;
- delete pDelProcess;
- }
-}
-
-// Format and send a request to the proxy then wait on a reply (if appropriate) and return results to the
-// caller.
-HRESULT DbgTransportTarget::MakeProxyRequest(DbgProxyMessageType eType, ...)
-{
- va_list args;
-
- va_start(args, eType);
-
- // We allocate space for some request related context on the stack. For the duration of the request (until
- // a reply is received) this context is linked on a global request queue so the process event thread can
- // handle matching replies to requests.
- Request sRequest;
- sRequest.m_pNext = NULL;
- sRequest.m_hrResult = S_OK;
-
- // DPMT_TerminateProcess requests don't expect a reply.
- if (eType != DPMT_TerminateProcess)
- {
- sRequest.m_hCompletionEvent = WszCreateEvent(NULL, FALSE, FALSE, NULL); // Auto-reset, not signalled
- if (sRequest.m_hCompletionEvent == NULL)
- return E_OUTOFMEMORY;
- }
- else
- sRequest.m_hCompletionEvent = NULL;
-
- // Space for the message header.
- DbgProxyMessageHeader sMessage;
-
- // Format common message fields.
- memset(&sMessage, 0, sizeof(sMessage));
- sMessage.m_eType = eType;
-
- // Based on request type fill in the remainder of the request fields and record the addresses of the
- // caller's output buffer(s) if any.
- BYTE *pbAttributeBlock = NULL;
- DWORD cbAttributeBlock = 0;
- switch (eType)
- {
- case DPMT_GetSystemInfo:
- DbgTransportLog(LC_Always, "Sending 'GetSystemInfo'");
- sMessage.VariantData.GetSystemInfo.m_uiMajorVersion = kCurrentMajorVersion;
- sMessage.VariantData.GetSystemInfo.m_uiMinorVersion = kCurrentMinorVersion;
- sRequest.OutputBuffers.GetSystemInfo.m_pdwMajorVersion = va_arg(args, DWORD*);
- sRequest.OutputBuffers.GetSystemInfo.m_pdwMinorVersion = va_arg(args, DWORD*);
- sRequest.OutputBuffers.GetSystemInfo.m_pePlatform = va_arg(args, DbgTargetPlatform*);
- break;
-
- case DPMT_EnumProcesses:
- DbgTransportLog(LC_Always, "Sending 'EnumProcesses'");
- break;
-
- case DPMT_LaunchProcess:
- {
- DbgTransportLog(LC_Always, "Sending 'LaunchProcess'");
- pbAttributeBlock = va_arg(args, BYTE*);
- DbgAttributeBlockReader sAttrReader((char*)pbAttributeBlock);
- cbAttributeBlock = sAttrReader.GetBlockSize();
- sMessage.VariantData.LaunchProcess.m_cbAttributeBlock = cbAttributeBlock;
- sRequest.OutputBuffers.LaunchProcess.m_pdwPID = va_arg(args, DWORD*);
- sRequest.OutputBuffers.LaunchProcess.m_ppruidProcess = va_arg(args, PRUID*);
- break;
- }
-
- case DPMT_EarlyAttach:
- DbgTransportLog(LC_Always, "Sending 'EarlyAttach'");
- sMessage.VariantData.EarlyAttach.m_pruidProcess = va_arg(args, DWORD);
- sRequest.OutputBuffers.EarlyAttach.m_pfProcessExited = va_arg(args, bool*);
- break;
-
- case DPMT_TerminateProcess:
- DbgTransportLog(LC_Always, "Sending 'TerminateProcess'");
- sMessage.VariantData.TerminateProcess.m_pruidProcess = va_arg(args, DWORD);
- break;
-
- default:
- _ASSERTE(!"Illegal message type for MakeProxyRequest");
- va_end(args);
- return E_FAIL;
- }
- va_end(args);
-
- // We must hold the lock in order to send messages, allocate request IDs or touch the request queue.
- {
- RSLockHolder lock(&m_sLock);
-
- // While under the lock we can check the connection state without races. We either see the connection
- // state is bad and abort the operation now or we successfully queue the request (in which case it is
- // the process event thread's responsibility to abort the request if an error occurs).
- if (m_fProxyConnectionBad)
- {
- if (sRequest.m_hCompletionEvent)
- CloseHandle(sRequest.m_hCompletionEvent);
- return E_ABORT;
- }
-
- // Allocate a request ID and add the request to the queue (except for messages that don't expect a
- // reply).
- if (sRequest.m_hCompletionEvent != NULL)
- {
- // Allocate a unique ID for this request. This will allow us to match the reply that comes back.
- sRequest.m_dwID = sMessage.m_uiRequestID = m_dwNextRequestID++;
-
- // The request queue is not ordered, so just place the new request at the head.
- sRequest.m_pNext = m_pRequestList;
- m_pRequestList = &sRequest;
- }
- else
- sMessage.m_uiRequestID = 0;
-
- // Now the type and request ID have been filled in we can calculate the value of the magic field used
- // as an extra layer of validation in the message format.
- sMessage.m_uiMagic = DBGPROXY_MAGIC_VALUE(&sMessage);
-
- // Send the message header.
- if (!m_pConnection->Send((unsigned char*)&sMessage, sizeof(sMessage)))
- {
- DbgTransportLog(LC_Always, "DbgTransportTarget::MakeProxyRequest(): Send() failed");
- if (sRequest.m_hCompletionEvent)
- {
- m_pRequestList = sRequest.m_pNext;
- CloseHandle(sRequest.m_hCompletionEvent);
- }
-
- return E_ABORT;
- }
-
- // Launch requests have additional data (an attribute block).
- if (eType == DPMT_LaunchProcess)
- {
- _ASSERTE(pbAttributeBlock && cbAttributeBlock);
-
- if (!m_pConnection->Send(pbAttributeBlock, cbAttributeBlock))
- {
- DbgTransportLog(LC_Always, "DbgTransportTarget::MakeProxyRequest(): Send() failed");
-
- m_pRequestList = sRequest.m_pNext;
- CloseHandle(sRequest.m_hCompletionEvent);
-
- return E_ABORT;
- }
- }
-
- } // Leave lock
-
- // We're done if we don't expect a reply.
- if (sRequest.m_hCompletionEvent == NULL)
- return S_OK;
-
- // Now wait on the completion event (this will be signalled by the process event thread once it has
- // matched a reply to our request successfully).
- WaitForSingleObject(sRequest.m_hCompletionEvent, INFINITE);
-
- // No more need for the completionm event.
- CloseHandle(sRequest.m_hCompletionEvent);
-
- // Return the completion result from the transmission record.
- return sRequest.m_hrResult;
-}
-
-// Static entry point for the process event thread.
-DWORD WINAPI DbgTransportTarget::ProcessEventWorkerStatic(LPVOID lpvContext)
-{
- // Just dispatch straight to the version that's an instance method.
- ((DbgTransportTarget*)lpvContext)->ProcessEventWorker();
- return 0;
-}
-
-// Instance method version of the worker, called from ProcessEventWorkerStatic().
-void DbgTransportTarget::ProcessEventWorker()
-{
- // Loop handling requests until we're told to shutdown or hit a network error.
- while (!m_fShutdown)
- {
- // How the worker reacts to the incoming data is driven by shared state set up by other threads in
- // this process calling MakeProxyRequest(). These calls cause a message to be sent directly to the
- // proxy but also set up state so that this thread will know how to dispatch replies from the proxy
- // back to the originating thread.
-
- // There are three sizes of message that we can receive: most messages will fit in the common message
- // header but DPMT_RuntimeStarted needs something a little larger (an additional DbgProxyRuntimeInfo
- // structure) and DPMT_ProcessList includes an variable sized list of process and runtime records.
- // Allocate storage for a common header on the stack and always receive the header into this. We'll
- // handle any extra data required on a case by case basis (which is easy since there's no requirement
- // to actually assemble the incoming message into a single contiguous buffer at any point).
- DbgProxyMessageHeader sMessage;
-
- if (!m_pConnection->Receive((unsigned char *)&sMessage, sizeof(sMessage)))
- {
- DbgTransportLog(LC_Always, "DbgTransportTarget: Receive() failed");
- goto NetworkError;
- }
-
- // Validate the magic number in the header that we use as an additional check of the messages's
- // integrity (this makes it much harder to launch a network attack based on sending random data).
- if (sMessage.m_uiMagic != DBGPROXY_MAGIC_VALUE(&sMessage))
- {
- DbgTransportLog(LC_Always, "DbgTransportTarget: message failed magic number test");
- goto NetworkError;
- }
-
- // Most of the incoming messages are replies to requests that we have on our request queue. Locate the
- // original request (keyed off the ID returned in the reply).
- Request *pRequest = NULL;
- if (sMessage.m_eType != DPMT_RuntimeStarted &&
- sMessage.m_eType != DPMT_ProcessTerminated)
- {
- pRequest = LocateOriginalRequest(&sMessage);
- if (pRequest == NULL)
- {
- DbgTransportLog(LC_Always, "DbgTransportTarget: can't find request for reply %u",
- (unsigned)sMessage.m_uiRequestID);
- goto NetworkError;
- }
- }
-
- // Process the rest of the message based on the type.
- switch (sMessage.m_eType)
- {
- case DPMT_SystemInfo:
- DbgTransportLog(LC_Always, "Received 'SystemInfo'");
- PREFIX_ASSUME(pRequest != NULL);
-
- *pRequest->OutputBuffers.GetSystemInfo.m_pdwMajorVersion =
- sMessage.VariantData.SystemInfo.m_uiMajorVersion;
- *pRequest->OutputBuffers.GetSystemInfo.m_pdwMinorVersion =
- sMessage.VariantData.SystemInfo.m_uiMinorVersion;
- *pRequest->OutputBuffers.GetSystemInfo.m_pePlatform =
- sMessage.VariantData.SystemInfo.m_ePlatform;
- break;
-
- case DPMT_ProcessList:
- DbgTransportLog(LC_Always, "Received 'ProcessList(%u, %u)'",
- (unsigned)sMessage.VariantData.ProcessList.m_uiProcessRecords,
- (unsigned)sMessage.VariantData.ProcessList.m_uiRuntimeRecords);
- PREFIX_ASSUME(pRequest != NULL);
-
- ProcessProcessList(&sMessage, pRequest);
- if (FAILED(pRequest->m_hrResult))
- goto NetworkError;
- break;
-
- case DPMT_ProcessLaunched:
- DbgTransportLog(LC_Always, "Received 'ProcessLaunched'");
- PREFIX_ASSUME(pRequest != NULL);
-
- // We successfully launched a process remotely (or an error code indicating why we could not).
- // On success copy PID and PRUID of the new process back to the requester.
- switch (sMessage.VariantData.ProcessLaunched.m_eResult)
- {
- case DPLR_Success:
- pRequest->m_hrResult = S_OK;
- *pRequest->OutputBuffers.LaunchProcess.m_pdwPID =
- sMessage.VariantData.ProcessLaunched.m_uiPID;
- *pRequest->OutputBuffers.LaunchProcess.m_ppruidProcess =
- sMessage.VariantData.ProcessLaunched.m_pruidProcess;
- break;
- case DPLR_OutOfMemory:
- pRequest->m_hrResult = E_OUTOFMEMORY;
- break;
- case DPLR_Denied:
- pRequest->m_hrResult = E_ACCESSDENIED;
- break;
- case DPLR_NotFound:
- pRequest->m_hrResult = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
- break;
- case DPLR_UnspecifiedError:
- pRequest->m_hrResult = E_FAIL;
- break;
- default:
- _ASSERTE(!"Unknown ProcessLaunched result code");
- pRequest->m_hrResult = E_FAIL;
- }
- break;
-
- case DPMT_RuntimeStarted:
- {
- DbgTransportLog(LC_Always, "Received 'RuntimeStarted'");
-
- // RuntimeStarted sends a process info block as well as runtime info (in case the process is new
- // as well).
-
- // Read DbgProxyProcessInfo structure.
- DbgProxyProcessInfo sProcessInfo;
- if (!m_pConnection->Receive((unsigned char *)&sProcessInfo, sizeof(sProcessInfo)))
- {
- DbgTransportLog(LC_Always, "DbgTransportTarget: Receive() failed");
- goto NetworkError;
- }
-
- // Read DbgProxyRuntimeInfo structure.
- DbgProxyRuntimeInfo sRuntimeInfo;
- if (!m_pConnection->Receive((unsigned char *)&sRuntimeInfo, sizeof(sRuntimeInfo)))
- {
- DbgTransportLog(LC_Always, "DbgTransportTarget: Receive() failed");
- goto NetworkError;
- }
-
- // A runtime has started up in some process on the target machine.
- // Add a runtime record to our database (if it's not already there).
- if (!ProcessRuntimeStarted(&sProcessInfo, &sRuntimeInfo))
- goto NetworkError;
- break;
- }
-
- case DPMT_ProcessTerminated:
- {
- DbgTransportLog(LC_Always, "Received 'ProcessTerminated'");
-
- // A process has terminated on the target machine.
- // See if we were tracking the process on our side and if so either delete the entry (if it's
- // not being used) or fire the process termination event.
- {
- RSLockHolder lock(&m_sLock);
-
- ProcessEntry *pProcess = m_pProcessList;
- ProcessEntry *pLastProcess = NULL;
- while (pProcess)
- {
- if (pProcess->m_pruidProcess == sMessage.VariantData.ProcessTerminated.m_pruidProcess)
- {
- // Found a matching entry. Is it in use?
- if (pProcess->m_cProcessRef > 0)
- {
- // Can't delete the entry. Signal the process exited event (which will move some
- // users off).
- SetEvent(pProcess->m_hExitedEvent);
- pProcess->m_fExited = true;
- }
- else
- {
- // Nobody's using this process entry, we can unlink and deallocate it.
- if (pLastProcess)
- pLastProcess->m_pNext = pProcess->m_pNext;
- else
- m_pProcessList = pProcess->m_pNext;
- delete pProcess;
- }
- break;
- }
- pLastProcess = pProcess;
- pProcess = pProcess->m_pNext;
- }
- } // Leave lock
- break;
- }
-
- case DPMT_EarlyAttachDone:
- DbgTransportLog(LC_Always, "Received 'EarlyAttachDone(%s)'",
- sMessage.VariantData.EarlyAttachDone.m_fProcessExited ? "dead" : "alive");
- PREFIX_ASSUME(pRequest != NULL);
-
- // The only thing we need to do here is pass back the indication of whether the process
- // managed to exit before the attach was registered.
- *pRequest->OutputBuffers.EarlyAttach.m_pfProcessExited =
- sMessage.VariantData.EarlyAttachDone.m_fProcessExited;
- break;
-
- default:
- _ASSERTE(!"Invalid message typr");
- }
-
- // If this was a reply then the original request has been updated at this point. We only need to
- // remove it from the global queue and signal the completion event to unblock the requesting thread.
- if (pRequest)
- {
- RSLockHolder lock(&m_sLock);
-
- // Look for the previous item in the queue.
- Request *pSearchRequest = m_pRequestList;
- while (pSearchRequest)
- {
- if (pSearchRequest->m_pNext == pRequest)
- {
- pSearchRequest->m_pNext = pRequest->m_pNext;
- break;
- }
- pSearchRequest = pSearchRequest->m_pNext;
- }
-
- // No match, maybe the transmission was at the head of the queue.
- if (pSearchRequest == NULL)
- {
- _ASSERTE(m_pRequestList == pRequest);
- m_pRequestList = pRequest->m_pNext;
- }
-
- // Now complete the request to the caller.
- SetEvent(pRequest->m_hCompletionEvent);
- } // Leave lock
-
- // Loop round for the next message.
- }
-
- NetworkError:
-
- // We get here if we were asked to shutdown or hit a network error.
- m_fProxyConnectionBad = true;
-
- // Abort any outstanding requests.
- {
- RSLockHolder lock(&m_sLock);
-
- Request *pRequest = m_pRequestList;
- while (pRequest)
- {
- Request *pAbortRequest = pRequest;
- pRequest = pRequest->m_pNext;
-
- pAbortRequest->m_hrResult = E_ABORT;
- SetEvent(pAbortRequest->m_hCompletionEvent);
- }
- } // Leave lock
-
- // If this isn't shutdown (i.e. we got here as the result of a network error) run through the process list
- // and report them all as terminated (better than having the debugger time-out some request and then hang
- // forever as it tries to terminate the process itself).
- if (!m_fShutdown)
- {
- for (ProcessEntry *pProcess = m_pProcessList; pProcess; pProcess = pProcess->m_pNext)
- {
- if (!pProcess->m_fExited)
- {
- pProcess->m_fExited = true;
- SetEvent(pProcess->m_hExitedEvent);
- }
- }
- }
-}
-
-// If this message is a reply to a right-side request locate that request. Otherwise return NULL.
-DbgTransportTarget::Request *DbgTransportTarget::LocateOriginalRequest(DbgProxyMessageHeader *pMessage)
-{
- // Search the request queue for a matching ID.
- Request *pRequest;
- {
- RSLockHolder lock(&m_sLock);
-
- pRequest = m_pRequestList;
- while (pRequest)
- {
- if (pRequest->m_dwID == pMessage->m_uiRequestID)
- break;
- pRequest = pRequest->m_pNext;
- }
- } // Leave lock
-
- return pRequest;
-}
-
-// Process an incoming ProcessList message.
-void DbgTransportTarget::ProcessProcessList(DbgProxyMessageHeader *pMessage,
- Request *pRequest)
-{
- // The message header is followed by a sequence of DbgProxyProcessInfo records then a sequence of
- // DbgProxyRuntimeInfo records. The lengths of both of these sequences are provided in the header.
- DWORD cProcessRecords = pMessage->VariantData.ProcessList.m_uiProcessRecords;
- DWORD cRuntimeRecords = pMessage->VariantData.ProcessList.m_uiRuntimeRecords;
-
- // Impose some reasonable bounds to catch badly formed replies (and so we don't have to worry about
- // integer overflow in the allocation code that follows).
- if (cProcessRecords > 1024 || cRuntimeRecords > 1024)
- {
- _ASSERTE(!"Badly formed ProcessList message");
- pRequest->m_hrResult = E_UNEXPECTED;
- return;
- }
-
- // Allocate space for all the process and runtime records in one contiguous block.
- DWORD cbRecordBuffer = (cProcessRecords * sizeof(DbgProxyProcessInfo)) +
- (cRuntimeRecords * sizeof(DbgProxyRuntimeInfo));
- BYTE *pbRecordBuffer = new (nothrow) BYTE[cbRecordBuffer];
- if (pbRecordBuffer == NULL)
- {
- DbgTransportLog(LC_Always, "Failed to allocate memory for %u process records and %u runtime records",
- cProcessRecords, cRuntimeRecords);
- pRequest->m_hrResult = E_OUTOFMEMORY;
- return;
- }
-
- DbgProxyProcessInfo *pProcessRecords = (DbgProxyProcessInfo*)pbRecordBuffer;
- DbgProxyRuntimeInfo *pRuntimeRecords = (DbgProxyRuntimeInfo*)(pProcessRecords + cProcessRecords);
-
- // If we've gotten to this point we believe the message looks valid and we have all resources
- // allocated necessary to receive the response for this portion of the reply.
- if (!m_pConnection->Receive(pbRecordBuffer, cbRecordBuffer))
- {
- DbgTransportLog(LC_Always, "ProcessProcessList: Receive() failed");
- pRequest->m_hrResult = E_FAIL;
- return;
- }
-
- // Now parse the records and make any necessary updates to the cached process/runtime state we already
- // have.
- {
- RSLockHolder lock(&m_sLock);
-
- // First we walk the current list of processes and mark each entry as potentially removeable. This is
- // part of the algorithm to detect processes which have terminated, see the next stage for the rest.
- ProcessEntry *pProcess = m_pProcessList;
- while (pProcess)
- {
- pProcess->m_fRemove = true;
- pProcess = pProcess->m_pNext;
- }
-
- // Next we traverse the incoming list of process records, determining which we already know about
- // (and marking the corresponding ProcessEntry) and those that are new (for which we create new
- // ProcessEntry structures).
- for (DWORD i = 0; i < cProcessRecords; i++)
- {
- // See if we can locate an existing ProcessEntry (i.e. one with the same PRUID as the current
- // process record).
- pProcess = m_pProcessList;
- while (pProcess)
- {
- if (pProcess->m_pruidProcess == pProcessRecords[i].m_pruidProcess)
- {
- _ASSERTE(pProcess->m_dwPID == pProcessRecords[i].m_uiPID);
-
- // We've found a match so we indicate that this ProcessEntry is still live.
- pProcess->m_fRemove = false;
- break;
- }
-
- pProcess = pProcess->m_pNext;
- }
-
- // If we didn't find a matching ProcessEntry create one now.
- if (pProcess == NULL)
- {
- pProcess = new (nothrow) ProcessEntry();
- if (pProcess == NULL)
- goto FailedUpdate;
-
- pProcess->m_pNext = m_pProcessList;
- pProcess->m_dwPID = pProcessRecords[i].m_uiPID;
- pProcess->m_pruidProcess = pProcessRecords[i].m_pruidProcess;
- strcpy_s(pProcess->m_szCommandLine, kMaxCommandLine, pProcessRecords[i].m_szCommandLine);
- pProcess->m_pRuntimes = NULL;
- pProcess->m_hExitedEvent = NULL;
- pProcess->m_hRuntimeStartedEvent = NULL;
- pProcess->m_fExited = false;
- pProcess->m_fRemove = false;
- pProcess->m_cProcessRef = 0;
-
- // Allocate event used to signal this process' termination.
- pProcess->m_hExitedEvent = WszCreateEvent(NULL, TRUE, FALSE, NULL); // Manual reset, not signalled
- if (pProcess->m_hExitedEvent == NULL)
- {
- delete pProcess;
- goto FailedUpdate;
- }
-
- // Allocate event used to signal the first runtime has started within this process.
- pProcess->m_hRuntimeStartedEvent = WszCreateEvent(NULL, TRUE, FALSE, NULL); // Manual reset, not signalled
- if (pProcess->m_hRuntimeStartedEvent == NULL)
- {
- delete pProcess;
- goto FailedUpdate;
- }
-
- // Link the new process entry to the database.
- m_pProcessList = pProcess;
- }
- }
-
- // Now walk the updated ProcessEntry structures. Each that wasn't marked as being present in the
- // incoming process infos indicates a dead process. We either remove such entries or, if they're being
- // used currently (have a connected debugger session etc.), we simply mark them as dead so they won't
- // appear in process enumerations and we'll delete them as soon as their use count falls to zero.
- pProcess = m_pProcessList;
- ProcessEntry *pLastProcess = NULL;
- while (pProcess)
- {
- if (pProcess->m_fRemove)
- {
- // The process has terminated. Can we release the ProcessEntry yet?
- if (pProcess->m_cProcessRef == 0)
- {
- // Nobody is using the process, we can get rid of it.
-
- // Unlink the entry from the list.
- if (pLastProcess)
- pLastProcess->m_pNext = pProcess->m_pNext;
- else
- m_pProcessList = pProcess->m_pNext;
-
- // Since we've removed this entry from the list the last entry remains the same for the
- // next iteration of the loop. We have to extract the next entry from the current one
- // before we deallocate it.
- ProcessEntry *pDeleteEntry = pProcess;
- pProcess = pProcess->m_pNext;
-
- // Finally we can delete the current entry (this automatically takes care of any runtime
- // entries and other process entry owned resources).
- delete pDeleteEntry;
-
- continue;
- }
- else
- {
- // Process is in use. Simply mark it as exited for now.
- pProcess->m_fExited = true;
- SetEvent(pProcess->m_hExitedEvent);
- }
- }
-
- pLastProcess = pProcess;
- pProcess = pProcess->m_pNext;
- }
-
- // Next we walk the incoming runtime records. Here we're just looking for new runtimes to add since we
- // don't currently support shutting down a runtime without terminating the process.
- for (DWORD i = 0; i < cRuntimeRecords; i++)
- {
- // First find the parent ProcessEntry record. This must exist (if the proxy sent a runtime record
- // it must send the parent process record).
- pProcess = m_pProcessList;
- while (pProcess)
- {
- if (pProcess->m_pruidProcess == pRuntimeRecords[i].m_pruidProcess)
- {
- pProcess->m_fRemove = false;
- break;
- }
-
- pProcess = pProcess->m_pNext;
- }
- PREFIX_ASSUME(pProcess != NULL);
-
- // Walk the list of RuntimeEntry records associated with this ProcessEntry to see if we already
- // have this entry.
- RuntimeEntry *pRuntime = pProcess->m_pRuntimes;
- while (pRuntime)
- {
- if (pRuntime->m_pruidRuntime == pRuntimeRecords[i].m_pruidRuntime)
- {
- // We already have this entry.
- _ASSERTE(pRuntime->m_usPort == pRuntimeRecords[i].m_usPort);
- break;
- }
-
- pRuntime = pRuntime->m_pNext;
- }
-
- // If this is a new runtime add a corresponding RuntimeEntry.
- if (pRuntime == NULL)
- {
- pRuntime = new (nothrow) RuntimeEntry();
- if (pRuntime == NULL)
- goto FailedUpdate;
-
- pRuntime->m_pruidRuntime = pRuntimeRecords[i].m_pruidRuntime;
- pRuntime->m_usPort = pRuntimeRecords[i].m_usPort;
- pRuntime->m_pDbgTransport = NULL;
- pRuntime->m_cTransportRef = 0;
-
- // Link the runtime entry onto the process.
- pRuntime->m_pNext = pProcess->m_pRuntimes;
- pProcess->m_pRuntimes = pRuntime;
-
- // Since there's at least one runtime for this process make sure the runtime started event is set.
- SetEvent(pProcess->m_hRuntimeStartedEvent);
- }
- }
- }
-
- // We're done, all incoming data has been consumed.
- delete [] pbRecordBuffer;
- return;
-
- FailedUpdate:
- pRequest->m_hrResult = E_OUTOFMEMORY;
- delete [] pbRecordBuffer;
-}
-
-// Process an incoming RuntimeStarted datagram.
-bool DbgTransportTarget::ProcessRuntimeStarted(DbgProxyProcessInfo *pProcessInfo,
- DbgProxyRuntimeInfo *pRuntimeInfo)
-{
- // A runtime has started up in some process on the target machine.
- // Add a runtime record to our database (if it's not already there).
- {
- RSLockHolder lock(&m_sLock);
-
- // Search for the parent process in our list.
- ProcessEntry *pProcess = m_pProcessList;
- while (pProcess)
- {
- if (pProcess->m_pruidProcess == pRuntimeInfo->m_pruidProcess)
- break;
- pProcess = pProcess->m_pNext;
- }
-
- DbgTransportLog(LC_Always, "Processing 'RuntimeStarted' for (%u, %u, %u)",
- (unsigned)pProcessInfo->m_uiPID,
- (PRUID)pRuntimeInfo->m_pruidProcess,
- (PRUID)pRuntimeInfo->m_pruidRuntime);
-
- // If we haven't recorded the process yet create an entry for it.
- if (pProcess == NULL)
- {
- pProcess = new (nothrow) ProcessEntry();
- if (pProcess == NULL)
- return false;
-
- DbgTransportLog(LC_Always, " No existing process record, created %08X", pProcess);
-
- memset(pProcess, 0, sizeof(ProcessEntry));
- pProcess->m_dwPID = pProcessInfo->m_uiPID;
- pProcess->m_pruidProcess = pProcessInfo->m_pruidProcess;
- strcpy(pProcess->m_szCommandLine, pProcessInfo->m_szCommandLine);
-
- pProcess->m_hExitedEvent = WszCreateEvent(NULL, TRUE, FALSE, NULL); // Manual reset, not signalled
- if (pProcess->m_hExitedEvent == NULL)
- {
- delete pProcess;
- return false;
- }
-
- pProcess->m_hRuntimeStartedEvent = WszCreateEvent(NULL, TRUE, FALSE, NULL); // Manual reset, not signalled
- if (pProcess->m_hRuntimeStartedEvent == NULL)
- {
- delete pProcess;
- return false;
- }
-
- // Link the new process entry into the list.
- pProcess->m_pNext = m_pProcessList;
- m_pProcessList = pProcess;
- }
- else
- DbgTransportLog(LC_Always, " Found existing process record %08X", pProcess);
-
- // Now we have a process record we can look for a runtime entry.
- RuntimeEntry *pRuntime = pProcess->m_pRuntimes;
- while (pRuntime)
- {
- if (pRuntime->m_pruidRuntime == pRuntimeInfo->m_pruidRuntime)
- break;
- pRuntime = pRuntime->m_pNext;
- }
-
- // If we didn't have an entry for this runtime create one now.
- if (pRuntime == NULL)
- {
- pRuntime = new (nothrow) RuntimeEntry();
- if (pRuntime == NULL)
- return false;
-
- DbgTransportLog(LC_Always, " No existing runtime record, created %08X", pRuntime);
-
- pRuntime->m_pruidRuntime = pRuntimeInfo->m_pruidRuntime;
- pRuntime->m_usPort = pRuntimeInfo->m_usPort;
- pRuntime->m_pDbgTransport = NULL;
- pRuntime->m_cTransportRef = 0;
-
- // Link the runtime entry onto the process.
- pRuntime->m_pNext = pProcess->m_pRuntimes;
- pProcess->m_pRuntimes = pRuntime;
-
- // Since there's at least one runtime for this process make sure the runtime started event is set.
- SetEvent(pProcess->m_hRuntimeStartedEvent);
- }
- else
- DbgTransportLog(LC_Always, " Found existing runtime record %08X", pRuntime);
- } // Leave lock
-
- return true;
-}
-
-// A version of EnumProcesses used when we're controlled by the Visual Studio debugger. This API is exposed to
-// our port supplier implementation via the ICoreClrDebugTarget interface implemented by the
-// CoreClrDebugTarget class implemented in DbgTransportManager.cpp.
-HRESULT DbgTransportTarget::EnumProcessesForVS(DWORD *pcProcs, CoreClrDebugProcInfo **ppProcs)
-{
- *pcProcs = 0;
- *ppProcs = NULL;
-
- // Update our process and runtime view from the remote target.
- UpdateProcessList();
-
- // Acquire the lock to get a consistent view of current state.
- {
- RSLockHolder lock(&m_sLock);
-
- ProcessEntry *pProcess;
- DWORD cProcesses = 0;
-
- // Count the number of processes we know about.
- for (pProcess = m_pProcessList; pProcess; pProcess = pProcess->m_pNext)
- {
- // Skip reporting of processes that have already exited (and we're waiting to clean up).
- if (pProcess->m_fExited)
- continue;
- cProcesses++;
- }
-
- // We're done if there aren't any.
- if (cProcesses == 0)
- return S_OK;
-
- // Otherwise allocate an array large enough to hold information about each process.
- CoreClrDebugProcInfo *pProcInfos = new (nothrow) CoreClrDebugProcInfo[cProcesses];
- if (pProcInfos == NULL)
- return E_OUTOFMEMORY;
-
- // Iterate over the processes again, this time filling in the data for each one in the output array.
- DWORD idxCurrentProc = 0;
- for (pProcess = m_pProcessList; pProcess; pProcess = pProcess->m_pNext)
- {
- // Skip reporting of processes that have already exited (and we're waiting to clean up).
- if (pProcess->m_fExited)
- continue;
-
- pProcInfos[idxCurrentProc].m_dwPID = pProcess->m_dwPID;
- pProcInfos[idxCurrentProc].m_dwInternalID = pProcess->m_pruidProcess;
-
- if (MultiByteToWideChar(CP_UTF8, 0, pProcess->m_szCommandLine, -1, pProcInfos[idxCurrentProc].m_wszName, kMaxCommandLine) == 0)
- {
- delete [] pProcInfos;
- return E_OUTOFMEMORY;
- }
-
- idxCurrentProc++;
- }
-
- *pcProcs = cProcesses;
- *ppProcs = pProcInfos;
- }
-
- return S_OK;
-}
-
-// A similar API for VS that enumerates runtimes running within the given process. Returns S_FALSE if
-// there are none.
-HRESULT DbgTransportTarget::EnumRuntimesForVS(PRUID pruidProcess, DWORD *pcRuntimes, CoreClrDebugRuntimeInfo **ppRuntimes)
-{
- *pcRuntimes = 0;
- *ppRuntimes = NULL;
-
- // Update our process and runtime view from the remote target.
- UpdateProcessList();
-
- // Acquire the lock to get a consistent view of current state.
- {
- RSLockHolder lock(&m_sLock);
-
- // Look for the process record with the matching PRUID.
- ProcessEntry *pProcess;
- for (pProcess = m_pProcessList; pProcess; pProcess = pProcess->m_pNext)
- {
- if (pProcess->m_fExited)
- continue;
- if (pProcess->m_pruidProcess == pruidProcess)
- break;
- }
-
- // We couldn't find a match -- the process must have terminated so it certainly doesn't have any
- // runtimes.
- if (pProcess == NULL)
- return S_FALSE;
-
- // Count the runtime instances running in the process.
- DWORD cRuntimes = 0;
- RuntimeEntry *pRuntime;
- for (pRuntime = pProcess->m_pRuntimes; pRuntime; pRuntime = pRuntime->m_pNext)
- cRuntimes++;
-
- // We're done if there aren't any.
- if (cRuntimes == 0)
- return S_OK;
-
- // Otherwise allocate an array large enough to hold information about each runtime.
- CoreClrDebugRuntimeInfo *pRuntimeInfos = new (nothrow) CoreClrDebugRuntimeInfo[cRuntimes];
- if (pRuntimeInfos == NULL)
- return E_OUTOFMEMORY;
-
- // Iterate over the runtimes again, this time filling in data for each one in the output array.
- DWORD idxCurrentRuntime = 0;
- for (pRuntime = pProcess->m_pRuntimes; pRuntime; pRuntime = pRuntime->m_pNext)
- {
- pRuntimeInfos[idxCurrentRuntime].m_dwInternalID = pRuntime->m_pruidRuntime;
- idxCurrentRuntime++;
- }
-
- *pcRuntimes = cRuntimes;
- *ppRuntimes = pRuntimeInfos;
- }
-
- return S_OK;
-}
-
-
-// When we're being driven by the Visual Studio debugger CoreCLR supplies an entity known as a port supplier
-// to handle interactions between VS and the remote system when setting up debug sessions. The port supplier
-// implements the connection to the remote proxy by talking to DbgTransportTarget instances controlled via the
-// following class through a psuedo-COM interface, ICoreClrDebugTarget, described in
-// debug\inc\CoreClrRemoteDebuggingInterfaces.h.
-class CoreClrDebugTarget : public ICoreClrDebugTarget
-{
-public:
- CoreClrDebugTarget(DWORD dwAddress) :
- m_lRefCount(1),
- m_dwAddress(dwAddress),
- m_pTarget(NULL)
- {
- }
-
- ~CoreClrDebugTarget()
- {
- if (m_pTarget)
- g_pDbgTransportManager->ReleaseTarget(m_pTarget);
- }
-
- STDMETHODIMP_(void) AddRef()
- {
- InterlockedIncrement(&m_lRefCount);
- }
-
- STDMETHODIMP_(void) Release()
- {
- LONG lRef = InterlockedDecrement(&m_lRefCount);
- if (lRef == 0)
- delete this;
- }
-
- // Enumerate all processes on the target system (whether they have managed code or not). The memory
- // returned is deallocated via FreeMemory().
- STDMETHODIMP EnumProcesses(DWORD *pcProcs, CoreClrDebugProcInfo **ppProcs)
- {
- return m_pTarget->EnumProcessesForVS(pcProcs, ppProcs);
- }
-
- // Enumerate all runtimes running in the given process on the target system. The memory returned is
- // deallocated via FreeMemory().
- STDMETHODIMP EnumRuntimes(DWORD dwInternalProcessID, DWORD *pcRuntimes, CoreClrDebugRuntimeInfo **ppRuntimes)
- {
- return m_pTarget->EnumRuntimesForVS((PRUID)dwInternalProcessID, pcRuntimes, ppRuntimes);
- }
-
- // Free memory allocated via EnumProcesses or EnumRuntimes.
- STDMETHODIMP_(void) FreeMemory(void *pMemory)
- {
- delete [] (BYTE*)pMemory;
- }
-
- // Non-exported method used by CreateCoreClrDebugTarget below to connect an instance of DbgTransportTarget
- // to the remote system's proxy process.
- HRESULT Init()
- {
- HRESULT hr = g_pDbgTransportManager->ConnectToTarget(m_dwAddress, 0, &m_pTarget);
- if (FAILED(hr))
- return hr;
-
- return S_OK;
- }
-
-private:
- LONG m_lRefCount; // COM-style ref count
- DWORD m_dwAddress; // IPv4 address of target system
- DbgTransportTarget *m_pTarget; // Currently connected DbgTransportTarget
-};
-
-// Function exported by mscordbi_mac* to allow the port supplier used by Visual Studio to query remote system
-// state.
-extern "C" HRESULT __stdcall CreateCoreClrDebugTarget(DWORD dwAddress, ICoreClrDebugTarget **ppTarget)
-{
- HRESULT hr;
-
- *ppTarget = NULL;
-
- // Allocate a new object implementing ICoreClrDebugTarget.
- CoreClrDebugTarget *pTarget = new (nothrow) CoreClrDebugTarget(dwAddress);
- if (pTarget == NULL)
- return E_OUTOFMEMORY;
-
- // Attempt to connect it to the remote system.
- hr = pTarget->Init();
- if (FAILED(hr))
- {
- delete pTarget;
- return hr;
- }
-
- *ppTarget = static_cast<ICoreClrDebugTarget*>(pTarget);
- return S_OK;
-}
-
#endif // FEATURE_DBGIPC_TRANSPORT_DI
diff --git a/src/debug/di/dbgtransportmanager.h b/src/debug/di/dbgtransportmanager.h
index a28d1c718a..c94083595d 100644
--- a/src/debug/di/dbgtransportmanager.h
+++ b/src/debug/di/dbgtransportmanager.h
@@ -9,35 +9,32 @@
#ifdef FEATURE_DBGIPC_TRANSPORT_DI
-#include "dbgproxy.h"
#include "coreclrremotedebugginginterfaces.h"
-//
-// Provides access to various process enumeration and control facilities for a remote machine.
-//
-// The top-level entity is a DbgTransportManager. Usually one of these will be allocated per debugger process.
-// The manager maintains a pool of DbgTransportTarget objects. Each of these track a connection to the proxy
-// on a single target machine. In addition to managing the proxy connection a collection of
-// DbgTransportSession objects is maintained, each corresponding to a debug session with a specific CoreCLR
-// runtime instance.
-//
-// Target machine specific state.
+// TODO: Ideally we'd like to remove this class and don't do any process related book keeping in DBI.
+
+// This is a registry of all the processes a debugger knows about, different components call it in order to
+// obtain right instance of DbgTransportSession for a given PID. It keeps list of processes and transports for them.
+// It also handles things like creating and killing a process.
+
+// Usual lifecycle looks like this:
+// Debug a new process:
+// * CreateProcess(&pid)
+// * GetTransportForProcess(pid, &transport)
+// * ReleaseTransport(transport)
+// * KillProcess(pid)
+
+// Attach to an existing process:
+// * Obtain pid from a user
+// * GetTransportForProcess(pid, &transport)
+// * ReleaseTransport(transport)
+
class DbgTransportTarget
{
public:
DbgTransportTarget();
- // Fill caller allocated table at pdwProcesses with the pids of processes currently alive on the target
- // system. Return the number of slots filled in *pcProcesses. The size of the table is given by cSlots. If
- // more than this number of processes are alive then *pcProcesses is set to the total number and
- // E_OUTOFMEMORY returned.
- HRESULT EnumProcesses(DWORD *pdwProcesses, DWORD cSlots, DWORD *pcProcesses);
-
- // Returns true if the given PID identifies a running process which is hosting at least one CoreCLR
- // runtime.
- bool IsManagedProcess(DWORD dwPID);
-
// Given a PID attempt to find or create a DbgTransportSession instance to manage a connection to a
// runtime in that process. Returns E_UNEXPECTED if the process can't be found. Also returns a handle that
// can be waited on for process termination.
@@ -47,194 +44,44 @@ public:
// connection at this point).
void ReleaseTransport(DbgTransportSession *pTransport);
- // Run the command line given on the remote machine to create a process. Return the PID of this process.
- // When and if the process starts a runtime and registers with the proxy it will be told to halt and wait
- // for a debugger attach.
- HRESULT CreateProcess(LPCWSTR wszCommand,
- LPCWSTR wszArgs,
- LPCWSTR wszCurrentDirectory,
- LPVOID pvEnvironment,
- DWORD *pdwPID);
+ // When and if the process starts the runtime will be told to halt and wait for a debugger attach.
+ HRESULT CreateProcess(LPCWSTR lpApplicationName,
+ LPCWSTR lpCommandLine,
+ LPSECURITY_ATTRIBUTES lpProcessAttributes,
+ LPSECURITY_ATTRIBUTES lpThreadAttributes,
+ BOOL bInheritHandles,
+ DWORD dwCreationFlags,
+ LPVOID lpEnvironment,
+ LPCWSTR lpCurrentDirectory,
+ LPSTARTUPINFOW lpStartupInfo,
+ LPPROCESS_INFORMATION lpProcessInformation);
// Kill the process identified by PID.
void KillProcess(DWORD dwPID);
- // Indicates when the connection to a proxy has failed: this target object will remain until the last
- // reference to it is released (DbgTransportManager::ReleaseTransport) but will fail all further requests.
- // The manager will then allow a new attempt to create a connection to the proxy to be made (wrapped in a
- // new DbgTransportTarget).
- bool IsProxyConnectionBad();
-
- // A version of EnumProcesses used when we're controlled by the Visual Studio debugger. This API is
- // exposed to our port supplier implementation via the ICoreClrDebugTarget interface implemented by the
- // CoreClrDebugTarget class implemented in DbgTransportManager.cpp.
- HRESULT EnumProcessesForVS(DWORD *pcProcs, CoreClrDebugProcInfo **ppProcs);
-
- // A similar API for VS that enumerates runtimes running within the given process. Returns S_FALSE if
- // there are none.
- HRESULT EnumRuntimesForVS(PRUID pruidProcess, DWORD *pcRuntimes, CoreClrDebugRuntimeInfo **ppRuntimes);
-
-private:
- friend class DbgTransportManager;
-
- // Initialization and shutdown routines called only by the DbgTransportManager.
- HRESULT Init(DWORD dwIPAddress, USHORT usPort);
+ HRESULT Init();
void Shutdown();
- // Data saved for each runtime instance the manager currently knows about. Saved in a singly linked, NULL
- // terminated list on each ProcessEntry (m_pRuntimes).
- struct RuntimeEntry
- {
- RuntimeEntry *m_pNext; // Next entry in the list
- PRUID m_pruidRuntime; // Proxy ID for this specific runtime instance
- USHORT m_usPort; // Port number to connect session to.
- DbgTransportSession *m_pDbgTransport; // Transport to this runtime or NULL
- DWORD m_cTransportRef; // Number of references to the transport still outstanding
-
- ~RuntimeEntry();
- };
-
- // Data saved for each process the manager currently knows about. Saved in a singly linked, NULL
- // terminated list (m_pProcessList).
+private:
struct ProcessEntry
{
ProcessEntry *m_pNext; // Next entry in the list
DWORD m_dwPID; // Process ID for this entry
- PRUID m_pruidProcess; // Proxy's ID for this process
- char m_szCommandLine[kMaxCommandLine]; // Command line process is running
- RuntimeEntry *m_pRuntimes; // Singly linked list of runtimes in process
- HANDLE m_hExitedEvent; // Event signalled once process terminates
- HANDLE m_hRuntimeStartedEvent; //Event signalled when first runtime is created in this process
- bool m_fExited; // Marks processes that have exited but still have a transport
- bool m_fRemove; // Used only during process list updates, see ProcessProcessList
- DWORD m_cProcessRef; // Reasons the process can't be deleted yet
+ HANDLE m_hProcess; // Process handle
+ DbgTransportSession *m_transport; // Debugger's connection to the process
+ DWORD m_cProcessRef; // Ref count
~ProcessEntry();
};
- // Record of outgoing request that requires a reply.
- struct Request
- {
- Request *m_pNext; // Next in queue of outstanding requests
- DWORD m_dwID; // ID assigned to request (to match reply)
- HANDLE m_hCompletionEvent; // Event to signal once the request is completed
- HRESULT m_hrResult; // Completion result of request
- union // Request specific output buffers
- {
- struct
- {
- DWORD *m_pdwMajorVersion; // Protocol version employed by the proxy
- DWORD *m_pdwMinorVersion; // Protocol version employed by the proxy
- DbgTargetPlatform *m_pePlatform; // Platform type of target system
- } GetSystemInfo;
-
- struct
- {
- DWORD *m_pdwPID; // PID of launched process
- PRUID *m_ppruidProcess; // PRUID of launched process
- } LaunchProcess;
-
- struct
- {
- bool *m_pfProcessExited; // Process exited before we could record the attach
- } EarlyAttach;
-
- } OutputBuffers;
- };
-
- ULONGLONG m_ullLastUpdate; // tick count of the last time the process list is updated
- bool m_fInitLock; // Used to track whether we initialized m_sLock in Init()
- DWORD m_dwProxyIP; // Proxy IP address in host byte order
- USHORT m_usProxyPort; // Proxy port number in host byte order
- DbgTargetPlatform m_ePlatform; // Platform type of the target (e.g. MacX86)
ProcessEntry *m_pProcessList; // Head of list of currently alive processes (unsorted)
- RSLock m_sLock; // Lock protecting read and write access to the process list
- bool m_fShutdown; // Flag set once Shutdown() has been called
- HANDLE m_hProcessEventThread; // Handle for the process event thread
- SecConnMgr *m_pConnectionManager; // Factory for network connections
- SecConn *m_pConnection; // Connection to the proxy
- SOCKET m_hSocket; // UDP socket used to communicate with proxy
- DWORD m_dwNextRequestID; // Next ID to be assigned to an outgoing request
- Request *m_pRequestList; // List of requests to proxy that haven't had a reply
- bool m_fProxyConnectionBad; // Initially false, any network failure will transition it
- // to true for good and all further requests on this
- // target will fail.
-
- // Ask the remote debugger proxy for an updated list of processes and reflect these changes into our local
- // process list. Any failure will leave the current process list state unchanged.
- void UpdateProcessList();
+ RSLock m_sLock; // Lock protecting read and write access to the target list
// Locate a process entry by PID. Assumes the lock is already held.
ProcessEntry *LocateProcessByPID(DWORD dwPID);
-
- // Deallocate all resources associated with a process list.
- void DeallocateProcessList(ProcessEntry *pProcessList);
-
- // Format and send a request to the proxy then wait on a reply (if appropriate) and return results to the
- // caller.
- HRESULT MakeProxyRequest(DbgProxyMessageType eType, ...);
-
- // Static entry point for the process event thread.
- static DWORD WINAPI ProcessEventWorkerStatic(LPVOID lpvContext);
-
- // Instance method version of the worker, called from ProcessEventWorkerStatic().
- void ProcessEventWorker();
-
- // If this message is a reply to a right-side request locate that request. Otherwise return NULL.
- Request *LocateOriginalRequest(DbgProxyMessageHeader *pMessage);
-
- // Process an incoming ProcessList message.
- void ProcessProcessList(DbgProxyMessageHeader *pMessage,
- Request *pRequest);
-
- // Process an incoming RuntimeStarted message.
- bool ProcessRuntimeStarted(DbgProxyProcessInfo *pProcessInfo,
- DbgProxyRuntimeInfo *pRuntimeInfo);
-};
-
-// Process level state.
-class DbgTransportManager
-{
-public:
- DbgTransportManager();
-
- // Startup/shutdown calls. These are ref-counted (cordbg, for instance, is constructed in such a way that
- // the command shell will attempt to load mscordbi and initialize an associated DbgTransportManager
- // multiple times).
- HRESULT Init();
- void Shutdown();
-
- // Attempt to connect to a debugging proxy on the machine at the given address and with the specified port
- // number. If the port number is given as zero use the port stored in user debugger configuration. On
- // success a pointer to a DbgTransportTarget object will be returned.
- HRESULT ConnectToTarget(DWORD dwIPAddress, USHORT usPort, DbgTransportTarget **ppTarget);
-
- // Add another reference to a target already acquired by ConnectToTarget (used by clients when they want
- // to hand a target out to independent code).
- void ReferenceTarget(DbgTransportTarget *pTarget);
-
- // Release reference to a DbgTransportTarget. If this is the last active reference then the connection to
- // the proxy will be severed and the object deallocated.
- void ReleaseTarget(DbgTransportTarget *pTarget);
-
-private:
- // Private structure used to track references to DbgTransportTargets we've allocated.
- struct TargetRef
- {
- TargetRef *m_pNext; // Next target in singly linked list (or NULL for end of list)
- DbgTransportTarget *m_pTarget; // The actual target object
- DWORD m_dwIPAddress; // IP address of the target machine
- USHORT m_usPort; // TCP port of the proxy on the machine
- DWORD m_dwRefCount; // Number of clients with a reference to this target
- };
-
- LONG m_lRefCount; // Number of references to this manager outstanding
- TargetRef *m_pTargets; // Singly linked list of targets allocated so far
- RSLock m_sLock; // Lock protecting read and write access to the target list
};
-// The one and only instance of the DbgTransportManager in the process.
-extern DbgTransportManager *g_pDbgTransportManager;
+extern DbgTransportTarget *g_pDbgTransportTarget;
#endif // FEATURE_DBGIPC_TRANSPORT_DI
diff --git a/src/debug/di/dbgtransportpipeline.cpp b/src/debug/di/dbgtransportpipeline.cpp
index b03e59e6c8..9fd1d9090b 100644
--- a/src/debug/di/dbgtransportpipeline.cpp
+++ b/src/debug/di/dbgtransportpipeline.cpp
@@ -137,11 +137,6 @@ private:
m_pProxy->ReleaseTransport(m_pTransport);
}
m_pTransport = NULL;
-
- if (m_pProxy)
- {
- g_pDbgTransportManager->ReleaseTarget(m_pProxy);
- }
m_pProxy = NULL;
}
@@ -209,16 +204,17 @@ HRESULT DbgTransportPipeline::CreateProcessUnderDebugger(
// Connect to the debugger proxy on the remote machine and ask it to create a process for us.
HRESULT hr = E_FAIL;
- // Establish a connection to the proxy of the remote machine.
- hr = g_pDbgTransportManager->ConnectToTarget(machineInfo.GetIPAddress(), machineInfo.GetPort(), &m_pProxy);
- if (SUCCEEDED(hr))
- {
- hr = m_pProxy->CreateProcess(lpApplicationName,
- lpCommandLine,
- lpCurrentDirectory,
- lpEnvironment,
- &(lpProcessInformation->dwProcessId));
- }
+ m_pProxy = g_pDbgTransportTarget;
+ hr = m_pProxy->CreateProcess(lpApplicationName,
+ lpCommandLine,
+ lpProcessAttributes,
+ lpThreadAttributes,
+ bInheritHandles,
+ dwCreationFlags,
+ lpEnvironment,
+ lpCurrentDirectory,
+ lpStartupInfo,
+ lpProcessInformation);
if (SUCCEEDED(hr))
{
@@ -288,25 +284,23 @@ HRESULT DbgTransportPipeline::DebugActiveProcess(MachineInfo machineInfo, DWORD
HRESULT hr = E_FAIL;
- // Establish a connection to the proxy of the remote machine.
- hr = g_pDbgTransportManager->ConnectToTarget(machineInfo.GetIPAddress(), machineInfo.GetPort(), &m_pProxy);
+ m_pProxy = g_pDbgTransportTarget;
+
+ // Establish a connection to the actual runtime to be debugged.
+ hr = m_pProxy->GetTransportForProcess(processId, &m_pTransport, &m_hProcess);
if (SUCCEEDED(hr))
{
- // Establish a connection to the actual runtime to be debugged.
- hr = m_pProxy->GetTransportForProcess(processId, &m_pTransport, &m_hProcess);
- if (SUCCEEDED(hr))
+ // TODO: Pass this timeout as a parameter all the way from debugger
+ // Wait for the connection to become useable (or time out).
+ if (!m_pTransport->WaitForSessionToOpen(10000))
{
- // Wait for the connection to become useable (or time out).
- if (!m_pTransport->WaitForSessionToOpen(10000))
- {
- hr = CORDBG_E_TIMEOUT;
- }
- else
+ hr = CORDBG_E_TIMEOUT;
+ }
+ else
+ {
+ if (!m_pTransport->UseAsDebugger(&m_ticket))
{
- if (!m_pTransport->UseAsDebugger(&m_ticket))
- {
- hr = CORDBG_E_DEBUGGER_ALREADY_ATTACHED;
- }
+ hr = CORDBG_E_DEBUGGER_ALREADY_ATTACHED;
}
}
}
diff --git a/src/debug/di/ddpack.cpp b/src/debug/di/ddpack.cpp
deleted file mode 100644
index 5f68c6a34a..0000000000
--- a/src/debug/di/ddpack.cpp
+++ /dev/null
@@ -1,3731 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-// DDPack.cpp
-// Implementation of DDMarshal.
-// Lives on DI side. Packs DDInterface calls into a byte stream.
-//
-// Note that this file is generated by ndp\clr\src\Debug\tools\BuildDDMarshal\.
-// Changes should be made to output\DDPack_template.cpp in that directory.
-//
-
-
-#include "stdafx.h"
-
-#ifdef FEATURE_DBGIPC_TRANSPORT_DI
-#include "dacdbiinterface.h"
-
-#include "ddpack.h"
-
-#include "rspriv.h" // for StringCopyHolder
-
-#include "ddshared.h"
-
-// Get common marshaling utilities
-#include "ddmarshalutil.h"
-
-
-// Suppress PREFast warning about overly large function
-// These functions are automatically generated.
-#if defined(_PREFAST_)
-#pragma warning(disable:21000)
-#endif
-
-/*
-// Called in Real DacDbi-Implementation space. Part of the unpacking stubs.
-// Needs
-//void HandleDDMessage(ReadBuffer * pSend, WriteBuffer * pResult);
-
-// Called by Packing stubs from Right-side.
-void DDMarshal::SendDDMessage(WriteBuffer * pSend, ReadBuffer * pResult)
-{
- // For now, this is an in-memory transport. Simulate sending an event.
- // When this becomes IPC events, we'll need a CordbProcess*
- ReadBuffer pSend2;
- pSend2.Open(pSend);
-
- WriteBuffer pResult2;
- m_pUnpack->HandleDDMessage(&pSend2, &pResult2);
- pResult->Open(&pResult2);
-}
-*/
-
-HRESULT DDMarshal::Init()
-{
- HandleHolder hDummy;
- HRESULT hr = E_FAIL;
-
- MachineInfo machineInfo = m_pProcess->GetShim()->GetMachineInfo();
-
- hr = g_pDbgTransportManager->ConnectToTarget(machineInfo.GetIPAddress(), machineInfo.GetPort(), &m_pProxy);
- if (FAILED(hr))
- {
- goto Label_Exit;
- }
-
- hr = m_pProxy->GetTransportForProcess(m_pProcess->GetPid(), &m_pTransport, &hDummy);
- if (FAILED(hr))
- {
- goto Label_Exit;
- }
-
- if (!m_pTransport->WaitForSessionToOpen(10000))
- {
- hr = CORDBG_E_TIMEOUT;
- goto Label_Exit;
- }
-
-Label_Exit:
- if (FAILED(hr))
- {
- if (m_pTransport != NULL)
- {
- m_pProxy->ReleaseTransport(m_pTransport);
- }
-
- if (m_pProxy != NULL)
- {
- g_pDbgTransportManager->ReleaseTarget(m_pProxy);
- }
- }
- return hr;
-}
-
-void DDMarshal::Destroy()
-{
- // The LS DAC resources will be cleaned up when InProcDac is destructed.
- if (m_pTransport != NULL)
- {
- m_pProxy->ReleaseTransport(m_pTransport);
- }
-
- if (m_pProxy != NULL)
- {
- g_pDbgTransportManager->ReleaseTarget(m_pProxy);
- }
-}
-
-
-
-// {%PackImpls%}
-
-//
-// Impls
-//
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::CheckDbiVersion
-HRESULT DDMarshal::CheckDbiVersion(const DbiVersion * pVersion)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_CheckDbiVersion); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, pVersion);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method CheckDbiVersion
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetLocalInterfaceHashAndTimestamp
-void DDMarshal::GetLocalInterfaceHashAndTimestamp(DWORD & hash1, DWORD & hash2, DWORD & hash3, DWORD & hash4, DWORD & timestamp1, DWORD & timestamp2)
-{
- hash1 = 0xe5ffdbe6;
- hash2 = 0xf26b43be;
- hash3 = 0x6c9685ac;
- hash4 = 0xdd723940;
- timestamp1 = 0x1cc67fb;
- timestamp2 = 0xe3ad5a06;
-} // end method GetLocalInterfaceHashAndTimestamp
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetRemoteInterfaceHashAndTimestamp
-void DDMarshal::GetRemoteInterfaceHashAndTimestamp(DWORD & hash1, DWORD & hash2, DWORD & hash3, DWORD & hash4, DWORD & timestamp1, DWORD & timestamp2)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetRemoteInterfaceHashAndTimestamp); // message id
- // Copy in-parameters to the send-buffer
- // hash1 does not need to be copied on input
- // hash2 does not need to be copied on input
- // hash3 does not need to be copied on input
- // hash4 does not need to be copied on input
- // timestamp1 does not need to be copied on input
- // timestamp2 does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, hash1);
- ReadFromBuffer(&bRecv, hash2);
- ReadFromBuffer(&bRecv, hash3);
- ReadFromBuffer(&bRecv, hash4);
- ReadFromBuffer(&bRecv, timestamp1);
- ReadFromBuffer(&bRecv, timestamp2);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetRemoteInterfaceHashAndTimestamp
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::FlushCache
-HRESULT DDMarshal::FlushCache()
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_FlushCache); // message id
- // Copy in-parameters to the send-buffer
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method FlushCache
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::DacSetTargetConsistencyChecks
-void DDMarshal::DacSetTargetConsistencyChecks(bool fEnableAsserts)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_DacSetTargetConsistencyChecks); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, fEnableAsserts);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method DacSetTargetConsistencyChecks
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsLeftSideInitialized
-BOOL DDMarshal::IsLeftSideInitialized()
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsLeftSideInitialized); // message id
- // Copy in-parameters to the send-buffer
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsLeftSideInitialized
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetAppDomainFromId
-VMPTR_AppDomain DDMarshal::GetAppDomainFromId(ULONG appdomainId)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetAppDomainFromId); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, appdomainId);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_AppDomain _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetAppDomainFromId
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetAppDomainId
-ULONG DDMarshal::GetAppDomainId(VMPTR_AppDomain vmAppDomain)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetAppDomainId); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAppDomain);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- ULONG _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetAppDomainId
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetAppDomainObject
-VMPTR_OBJECTHANDLE DDMarshal::GetAppDomainObject(VMPTR_AppDomain vmAppDomain)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetAppDomainObject); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAppDomain);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_OBJECTHANDLE _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetAppDomainObject
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsDefaultDomain
-BOOL DDMarshal::IsDefaultDomain(VMPTR_AppDomain vmAppDomain)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsDefaultDomain); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAppDomain);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsDefaultDomain
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetAssemblyFromDomainAssembly
-void DDMarshal::GetAssemblyFromDomainAssembly(VMPTR_DomainAssembly vmDomainAssembly, VMPTR_Assembly * vmAssembly)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetAssemblyFromDomainAssembly); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmDomainAssembly);
- // vmAssembly does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, vmAssembly);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetAssemblyFromDomainAssembly
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsAssemblyFullyTrusted
-BOOL DDMarshal::IsAssemblyFullyTrusted(VMPTR_DomainAssembly vmDomainAssembly)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsAssemblyFullyTrusted); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmDomainAssembly);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsAssemblyFullyTrusted
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetAppDomainFullName
-void DDMarshal::GetAppDomainFullName(VMPTR_AppDomain vmAppDomain, IStringHolder * pStrName)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetAppDomainFullName); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAppDomain);
- // pStrName does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pStrName);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetAppDomainFullName
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetModuleSimpleName
-void DDMarshal::GetModuleSimpleName(VMPTR_Module vmModule, IStringHolder * pStrFilename)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetModuleSimpleName); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmModule);
- // pStrFilename does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pStrFilename);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetModuleSimpleName
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetAssemblyPath
-BOOL DDMarshal::GetAssemblyPath(VMPTR_Assembly vmAssembly, IStringHolder * pStrFilename)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetAssemblyPath); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAssembly);
- // pStrFilename does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pStrFilename);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetAssemblyPath
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::ResolveTypeReference
-void DDMarshal::ResolveTypeReference(const TypeRefData * pTypeRefInfo, TypeRefData * pTargetRefInfo)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_ResolveTypeReference); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, pTypeRefInfo);
- WriteToBuffer(&bSend, pTargetRefInfo);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pTargetRefInfo);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method ResolveTypeReference
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetModulePath
-BOOL DDMarshal::GetModulePath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetModulePath); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmModule);
- // pStrFilename does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pStrFilename);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetModulePath
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetModuleNGenPath
-BOOL DDMarshal::GetModuleNGenPath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetModuleNGenPath); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmModule);
- // pStrFilename does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pStrFilename);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetModuleNGenPath
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetMetadata
-void DDMarshal::GetMetadata(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetMetadata); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmModule);
- // pTargetBuffer does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pTargetBuffer);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetMetadata
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetSymbolsBuffer
-void DDMarshal::GetSymbolsBuffer(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer, IDacDbiInterface::SymbolFormat * pSymbolFormat)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetSymbolsBuffer); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmModule);
- // pTargetBuffer does not need to be copied on input
- // pSymbolFormat does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pTargetBuffer);
- ReadFromBuffer(&bRecv, pSymbolFormat);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetSymbolsBuffer
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetModuleData
-void DDMarshal::GetModuleData(VMPTR_Module vmModule, ModuleInfo * pData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetModuleData); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmModule);
- // pData does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pData);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetModuleData
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetDomainFileData
-void DDMarshal::GetDomainFileData(VMPTR_DomainFile vmDomainFile, DomainFileInfo * pData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetDomainFileData); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmDomainFile);
- // pData does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pData);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetDomainFileData
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetModuleForDomainFile
-void DDMarshal::GetModuleForDomainFile(VMPTR_DomainFile vmDomainFile, VMPTR_Module * pModule)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetModuleForDomainFile); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmDomainFile);
- // pModule does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pModule);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetModuleForDomainFile
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetAddressType
-IDacDbiInterface::AddressType DDMarshal::GetAddressType(CORDB_ADDRESS address)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetAddressType); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, address);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- IDacDbiInterface::AddressType _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetAddressType
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsTransitionStub
-BOOL DDMarshal::IsTransitionStub(CORDB_ADDRESS address)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsTransitionStub); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, address);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsTransitionStub
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetCompilerFlags
-void DDMarshal::GetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL * pfAllowJITOpts, BOOL * pfEnableEnC)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetCompilerFlags); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmDomainFile);
- // pfAllowJITOpts does not need to be copied on input
- // pfEnableEnC does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pfAllowJITOpts);
- ReadFromBuffer(&bRecv, pfEnableEnC);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetCompilerFlags
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::SetCompilerFlags
-HRESULT DDMarshal::SetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL fAllowJitOpts, BOOL fEnableEnC)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_SetCompilerFlags); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmDomainFile);
- WriteToBuffer(&bSend, fAllowJitOpts);
- WriteToBuffer(&bSend, fEnableEnC);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method SetCompilerFlags
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::EnumerateAppDomains
-void DDMarshal::EnumerateAppDomains(IDacDbiInterface::FP_APPDOMAIN_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_EnumerateAppDomains); // message id
- // Copy in-parameters to the send-buffer
- // fpCallback does not need to be copied on input
- // pUserData does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- // Result buffer contains the entire enumeration. Now iterate through that
- // locally and invoke the user's callback.
- while (true)
- {
- // Check status word before each element.
- // 1 means there's another item. 2 means it's the end of the enumeration.
- DWORD dw;
- ReadFromBuffer(&bRecv, dw);
- if (dw == 2)
- break;
- _ASSERTE(dw == 1);
-
- VMPTR_AppDomain data;
- ReadFromBuffer(&bRecv, data);
-
- // Invoke user callback. This may throw.
- fpCallback(data, pUserData);
- }
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method EnumerateAppDomains
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::EnumerateAssembliesInAppDomain
-void DDMarshal::EnumerateAssembliesInAppDomain(VMPTR_AppDomain vmAppDomain, IDacDbiInterface::FP_ASSEMBLY_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_EnumerateAssembliesInAppDomain); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAppDomain);
- // fpCallback does not need to be copied on input
- // pUserData does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- // Result buffer contains the entire enumeration. Now iterate through that
- // locally and invoke the user's callback.
- while (true)
- {
- // Check status word before each element.
- // 1 means there's another item. 2 means it's the end of the enumeration.
- DWORD dw;
- ReadFromBuffer(&bRecv, dw);
- if (dw == 2)
- break;
- _ASSERTE(dw == 1);
-
- VMPTR_DomainAssembly data;
- ReadFromBuffer(&bRecv, data);
-
- // Invoke user callback. This may throw.
- fpCallback(data, pUserData);
- }
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method EnumerateAssembliesInAppDomain
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::EnumerateModulesInAssembly
-void DDMarshal::EnumerateModulesInAssembly(VMPTR_DomainAssembly vmAssembly, IDacDbiInterface::FP_MODULE_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_EnumerateModulesInAssembly); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAssembly);
- // fpCallback does not need to be copied on input
- // pUserData does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- // Result buffer contains the entire enumeration. Now iterate through that
- // locally and invoke the user's callback.
- while (true)
- {
- // Check status word before each element.
- // 1 means there's another item. 2 means it's the end of the enumeration.
- DWORD dw;
- ReadFromBuffer(&bRecv, dw);
- if (dw == 2)
- break;
- _ASSERTE(dw == 1);
-
- VMPTR_DomainFile data;
- ReadFromBuffer(&bRecv, data);
-
- // Invoke user callback. This may throw.
- fpCallback(data, pUserData);
- }
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method EnumerateModulesInAssembly
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::RequestSyncAtEvent
-void DDMarshal::RequestSyncAtEvent()
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_RequestSyncAtEvent); // message id
- // Copy in-parameters to the send-buffer
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method RequestSyncAtEvent
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::MarkDebuggerAttachPending
-void DDMarshal::MarkDebuggerAttachPending()
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_MarkDebuggerAttachPending); // message id
- // Copy in-parameters to the send-buffer
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method MarkDebuggerAttachPending
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::MarkDebuggerAttached
-void DDMarshal::MarkDebuggerAttached(BOOL fAttached)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_MarkDebuggerAttached); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, fAttached);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method MarkDebuggerAttached
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::Hijack
-void DDMarshal::Hijack(VMPTR_Thread vmThread, ULONG32 dwThreadId, const EXCEPTION_RECORD * pRecord, T_CONTEXT * pOriginalContext, ULONG32 cbSizeContext, EHijackReason::EHijackReason reason, void * pUserData, CORDB_ADDRESS * pRemoteContextAddr)
-{
- _ASSERTE(!"Calling unimplemented callback:Hijack");
-} // end method Hijack
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::EnumerateConnections
-void DDMarshal::EnumerateConnections(IDacDbiInterface::FP_CONNECTION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-{
- _ASSERTE(!"Calling unimplemented callback:EnumerateConnections");
-} // end method EnumerateConnections
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::EnumerateThreads
-void DDMarshal::EnumerateThreads(IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_EnumerateThreads); // message id
- // Copy in-parameters to the send-buffer
- // fpCallback does not need to be copied on input
- // pUserData does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- // Result buffer contains the entire enumeration. Now iterate through that
- // locally and invoke the user's callback.
- while (true)
- {
- // Check status word before each element.
- // 1 means there's another item. 2 means it's the end of the enumeration.
- DWORD dw;
- ReadFromBuffer(&bRecv, dw);
- if (dw == 2)
- break;
- _ASSERTE(dw == 1);
-
- VMPTR_Thread data;
- ReadFromBuffer(&bRecv, data);
-
- // Invoke user callback. This may throw.
- fpCallback(data, pUserData);
- }
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method EnumerateThreads
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsThreadMarkedDead
-bool DDMarshal::IsThreadMarkedDead(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsThreadMarkedDead); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- bool _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsThreadMarkedDead
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetThreadHandle
-HANDLE DDMarshal::GetThreadHandle(VMPTR_Thread vmThread)
-{
- _ASSERTE(!"Calling unimplemented callback:GetThreadHandle");
- ThrowHR(E_NOTIMPL);
-} // end method GetThreadHandle
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetThreadObject
-VMPTR_OBJECTHANDLE DDMarshal::GetThreadObject(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetThreadObject); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_OBJECTHANDLE _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetThreadObject
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::SetDebugState
-void DDMarshal::SetDebugState(VMPTR_Thread vmThread, CorDebugThreadState debugState)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_SetDebugState); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
- WriteToBuffer(&bSend, debugState);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method SetDebugState
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::HasUnhandledException
-BOOL DDMarshal::HasUnhandledException(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_HasUnhandledException); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method HasUnhandledException
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetUserState
-CorDebugUserState DDMarshal::GetUserState(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetUserState); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- CorDebugUserState _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetUserState
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetConnectionID
-CONNID DDMarshal::GetConnectionID(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetConnectionID); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- CONNID _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetConnectionID
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetTaskID
-TASKID DDMarshal::GetTaskID(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetTaskID); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- TASKID _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetTaskID
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::TryGetVolatileOSThreadID
-DWORD DDMarshal::TryGetVolatileOSThreadID(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_TryGetVolatileOSThreadID); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- DWORD _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method TryGetVolatileOSThreadID
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetUniqueThreadID
-DWORD DDMarshal::GetUniqueThreadID(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetUniqueThreadID); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- DWORD _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetUniqueThreadID
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetCurrentException
-VMPTR_OBJECTHANDLE DDMarshal::GetCurrentException(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetCurrentException); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_OBJECTHANDLE _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetCurrentException
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetCurrentCustomDebuggerNotification
-VMPTR_OBJECTHANDLE DDMarshal::GetCurrentCustomDebuggerNotification(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetCurrentCustomDebuggerNotification); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_OBJECTHANDLE _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetCurrentCustomDebuggerNotification
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetCurrentAppDomain
-VMPTR_AppDomain DDMarshal::GetCurrentAppDomain(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetCurrentAppDomain); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_AppDomain _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetCurrentAppDomain
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::ResolveAssembly
-VMPTR_DomainAssembly DDMarshal::ResolveAssembly(VMPTR_DomainFile vmScope, mdToken tkAssemblyRef)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_ResolveAssembly); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmScope);
- WriteToBuffer(&bSend, tkAssemblyRef);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_DomainAssembly _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method ResolveAssembly
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetNativeCodeSequencePointsAndVarInfo
-void DDMarshal::GetNativeCodeSequencePointsAndVarInfo(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS startAddress, BOOL fCodeAvailabe, NativeVarData * pNativeVarData, SequencePoints * pSequencePoints)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetNativeCodeSequencePointsAndVarInfo); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmMethodDesc);
- WriteToBuffer(&bSend, startAddress);
- WriteToBuffer(&bSend, fCodeAvailabe);
- // pNativeVarData does not need to be copied on input
- // pSequencePoints does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pNativeVarData);
- ReadFromBuffer(&bRecv, pSequencePoints);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetNativeCodeSequencePointsAndVarInfo
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetManagedStoppedContext
-VMPTR_CONTEXT DDMarshal::GetManagedStoppedContext(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetManagedStoppedContext); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_CONTEXT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetManagedStoppedContext
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::CreateStackWalk
-void DDMarshal::CreateStackWalk(VMPTR_Thread vmThread, DT_CONTEXT * pInternalContextBuffer, StackWalkHandle * ppSFIHandle)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_CreateStackWalk); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
- WriteToBuffer(&bSend, pInternalContextBuffer);
- // ppSFIHandle does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pInternalContextBuffer);
- ReadFromBuffer(&bRecv, ppSFIHandle);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method CreateStackWalk
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::DeleteStackWalk
-void DDMarshal::DeleteStackWalk(StackWalkHandle ppSFIHandle)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_DeleteStackWalk); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, ppSFIHandle);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method DeleteStackWalk
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetStackWalkCurrentContext
-void DDMarshal::GetStackWalkCurrentContext(StackWalkHandle pSFIHandle, DT_CONTEXT * pContext)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetStackWalkCurrentContext); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, pSFIHandle);
- WriteToBuffer(&bSend, pContext);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pContext);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetStackWalkCurrentContext
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::SetStackWalkCurrentContext
-void DDMarshal::SetStackWalkCurrentContext(VMPTR_Thread vmThread, StackWalkHandle pSFIHandle, CorDebugSetContextFlag flag, DT_CONTEXT * pContext)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_SetStackWalkCurrentContext); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
- WriteToBuffer(&bSend, pSFIHandle);
- WriteToBuffer(&bSend, flag);
- WriteToBuffer(&bSend, pContext);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pContext);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method SetStackWalkCurrentContext
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::UnwindStackWalkFrame
-BOOL DDMarshal::UnwindStackWalkFrame(StackWalkHandle pSFIHandle)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_UnwindStackWalkFrame); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, pSFIHandle);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method UnwindStackWalkFrame
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::CheckContext
-HRESULT DDMarshal::CheckContext(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_CheckContext); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
- WriteToBuffer(&bSend, pContext);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method CheckContext
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetStackWalkCurrentFrameInfo
-IDacDbiInterface::FrameType DDMarshal::GetStackWalkCurrentFrameInfo(StackWalkHandle pSFIHandle, DebuggerIPCE_STRData * pFrameData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetStackWalkCurrentFrameInfo); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, pSFIHandle);
- DebuggerIPCE_STRData temp_pFrameData; // backing storage for optional parameter
- if (pFrameData == NULL)
- pFrameData = &temp_pFrameData;
- WriteToBuffer(&bSend, pFrameData);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pFrameData);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- IDacDbiInterface::FrameType _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetStackWalkCurrentFrameInfo
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetCountOfInternalFrames
-ULONG32 DDMarshal::GetCountOfInternalFrames(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetCountOfInternalFrames); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- ULONG32 _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetCountOfInternalFrames
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::EnumerateInternalFrames
-void DDMarshal::EnumerateInternalFrames(VMPTR_Thread vmThread, IDacDbiInterface::FP_INTERNAL_FRAME_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_EnumerateInternalFrames); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
- // fpCallback does not need to be copied on input
- // pUserData does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- // Result buffer contains the entire enumeration. Now iterate through that
- // locally and invoke the user's callback.
- while (true)
- {
- // Check status word before each element.
- // 1 means there's another item. 2 means it's the end of the enumeration.
- DWORD dw;
- ReadFromBuffer(&bRecv, dw);
- if (dw == 2)
- break;
- _ASSERTE(dw == 1);
-
- DebuggerIPCE_STRData data;
- ReadFromBuffer(&bRecv, data);
-
- // Invoke user callback. This may throw.
- fpCallback(&data, pUserData);
- }
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method EnumerateInternalFrames
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsMatchingParentFrame
-BOOL DDMarshal::IsMatchingParentFrame(FramePointer fpToCheck, FramePointer fpParent)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsMatchingParentFrame); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, fpToCheck);
- WriteToBuffer(&bSend, fpParent);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsMatchingParentFrame
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetStackParameterSize
-ULONG32 DDMarshal::GetStackParameterSize(CORDB_ADDRESS controlPC)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetStackParameterSize); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, controlPC);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- ULONG32 _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetStackParameterSize
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetFramePointer
-FramePointer DDMarshal::GetFramePointer(StackWalkHandle pSFIHandle)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetFramePointer); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, pSFIHandle);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- FramePointer _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetFramePointer
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsLeafFrame
-BOOL DDMarshal::IsLeafFrame(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsLeafFrame); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
- WriteToBuffer(&bSend, pContext);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsLeafFrame
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetContext
-void DDMarshal::GetContext(VMPTR_Thread vmThread, DT_CONTEXT * pContextBuffer)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetContext); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
- WriteToBuffer(&bSend, pContextBuffer);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pContextBuffer);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetContext
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::ConvertContextToDebuggerRegDisplay
-void DDMarshal::ConvertContextToDebuggerRegDisplay(const DT_CONTEXT * pInContext, DebuggerREGDISPLAY * pOutDRD, BOOL fActive)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_ConvertContextToDebuggerRegDisplay); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, pInContext);
- WriteToBuffer(&bSend, pOutDRD);
- WriteToBuffer(&bSend, fActive);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pOutDRD);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method ConvertContextToDebuggerRegDisplay
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsILStubOrLCGMethod
-IDacDbiInterface::DynamicMethodType DDMarshal::IsILStubOrLCGMethod(VMPTR_MethodDesc vmMethodDesc)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsILStubOrLCGMethod); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmMethodDesc);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- IDacDbiInterface::DynamicMethodType _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsILStubOrLCGMethod
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetVarArgSig
-TargetBuffer DDMarshal::GetVarArgSig(CORDB_ADDRESS VASigCookieAddr, CORDB_ADDRESS * pArgBase)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetVarArgSig); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, VASigCookieAddr);
- // pArgBase does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pArgBase);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- TargetBuffer _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetVarArgSig
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::RequiresAlign8
-BOOL DDMarshal::RequiresAlign8(VMPTR_TypeHandle thExact)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_RequiresAlign8); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, thExact);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method RequiresAlign8
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::ResolveExactGenericArgsToken
-GENERICS_TYPE_TOKEN DDMarshal::ResolveExactGenericArgsToken(DWORD dwExactGenericArgsTokenIndex, GENERICS_TYPE_TOKEN rawToken)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_ResolveExactGenericArgsToken); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, dwExactGenericArgsTokenIndex);
- WriteToBuffer(&bSend, rawToken);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- GENERICS_TYPE_TOKEN _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method ResolveExactGenericArgsToken
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetILCodeAndSig
-void DDMarshal::GetILCodeAndSig(VMPTR_DomainFile vmDomainFile, mdToken functionToken, TargetBuffer * pCodeInfo, mdToken * pLocalSigToken)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetILCodeAndSig); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmDomainFile);
- WriteToBuffer(&bSend, functionToken);
- // pCodeInfo does not need to be copied on input
- // pLocalSigToken does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pCodeInfo);
- ReadFromBuffer(&bRecv, pLocalSigToken);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetILCodeAndSig
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetNativeCodeInfo
-void DDMarshal::GetNativeCodeInfo(VMPTR_DomainFile vmDomainFile, mdToken functionToken, NativeCodeFunctionData * pCodeInfo)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetNativeCodeInfo); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmDomainFile);
- WriteToBuffer(&bSend, functionToken);
- // pCodeInfo does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pCodeInfo);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetNativeCodeInfo
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetNativeCodeInfoForAddr
-void DDMarshal::GetNativeCodeInfoForAddr(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS hotCodeStartAddr, NativeCodeFunctionData * pCodeInfo)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetNativeCodeInfoForAddr); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmMethodDesc);
- WriteToBuffer(&bSend, hotCodeStartAddr);
- WriteToBuffer(&bSend, pCodeInfo);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pCodeInfo);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetNativeCodeInfoForAddr
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetClassInfo
-void DDMarshal::GetClassInfo(VMPTR_AppDomain vmAppDomain, VMPTR_Module vmModule, mdTypeDef metadataToken, VMPTR_TypeHandle thExact, VMPTR_TypeHandle thApprox, ClassInfo * pData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetClassInfo); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAppDomain);
- WriteToBuffer(&bSend, vmModule);
- WriteToBuffer(&bSend, metadataToken);
- WriteToBuffer(&bSend, thExact);
- WriteToBuffer(&bSend, thApprox);
- WriteToBuffer(&bSend, pData);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pData);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetClassInfo
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetInstantiationFieldInfo
-void DDMarshal::GetInstantiationFieldInfo(VMPTR_DomainFile vmDomainFile, mdTypeDef metadataToken, VMPTR_TypeHandle vmThExact, VMPTR_TypeHandle vmThApprox, DacDbiArrayList<FieldData> * pFieldList, SIZE_T * pObjectSize)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetInstantiationFieldInfo); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmDomainFile);
- WriteToBuffer(&bSend, metadataToken);
- WriteToBuffer(&bSend, vmThExact);
- WriteToBuffer(&bSend, vmThApprox);
- // pFieldList does not need to be copied on input
- // pObjectSize does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pFieldList);
- ReadFromBuffer(&bRecv, pObjectSize);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetInstantiationFieldInfo
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::TypeHandleToExpandedTypeInfo
-void DDMarshal::TypeHandleToExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_TypeHandleToExpandedTypeInfo); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, boxed);
- WriteToBuffer(&bSend, vmAppDomain);
- WriteToBuffer(&bSend, vmTypeHandle);
- WriteToBuffer(&bSend, pTypeInfo);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pTypeInfo);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method TypeHandleToExpandedTypeInfo
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetObjectExpandedTypeInfo
-void DDMarshal::GetObjectExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, CORDB_ADDRESS addr, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetObjectExpandedTypeInfo); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, boxed);
- WriteToBuffer(&bSend, vmAppDomain);
- WriteToBuffer(&bSend, addr);
- // pTypeInfo does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pTypeInfo);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetObjectExpandedTypeInfo
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetObjectExpandedTypeInfoFromID
-void DDMarshal::GetObjectExpandedTypeInfoFromID(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, COR_TYPEID id, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetObjectExpandedTypeInfoFromID); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, boxed);
- WriteToBuffer(&bSend, vmAppDomain);
- WriteToBuffer(&bSend, id);
- // pTypeInfo does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pTypeInfo);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetObjectExpandedTypeInfoFromID
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetApproxTypeHandle
-VMPTR_TypeHandle DDMarshal::GetApproxTypeHandle(TypeInfoList * pTypeData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetApproxTypeHandle); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, pTypeData);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pTypeData);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_TypeHandle _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetApproxTypeHandle
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetExactTypeHandle
-HRESULT DDMarshal::GetExactTypeHandle(DebuggerIPCE_ExpandedTypeData * pTypeData, ArgInfoList * pArgInfo, VMPTR_TypeHandle & vmTypeHandle)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetExactTypeHandle); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, pTypeData);
- WriteToBuffer(&bSend, pArgInfo);
- WriteToBuffer(&bSend, vmTypeHandle);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pTypeData);
- ReadFromBuffer(&bRecv, pArgInfo);
- ReadFromBuffer(&bRecv, vmTypeHandle);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetExactTypeHandle
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetMethodDescParams
-void DDMarshal::GetMethodDescParams(VMPTR_AppDomain vmAppDomain, VMPTR_MethodDesc vmMethodDesc, GENERICS_TYPE_TOKEN genericsToken, UINT32 * pcGenericClassTypeParams, TypeParamsList * pGenericTypeParams)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetMethodDescParams); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAppDomain);
- WriteToBuffer(&bSend, vmMethodDesc);
- WriteToBuffer(&bSend, genericsToken);
- // pcGenericClassTypeParams does not need to be copied on input
- // pGenericTypeParams does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pcGenericClassTypeParams);
- ReadFromBuffer(&bRecv, pGenericTypeParams);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetMethodDescParams
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetThreadOrContextStaticAddress
-CORDB_ADDRESS DDMarshal::GetThreadOrContextStaticAddress(VMPTR_FieldDesc vmField, VMPTR_Thread vmRuntimeThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetThreadOrContextStaticAddress); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmField);
- WriteToBuffer(&bSend, vmRuntimeThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- CORDB_ADDRESS _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetThreadOrContextStaticAddress
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetCollectibleTypeStaticAddress
-CORDB_ADDRESS DDMarshal::GetCollectibleTypeStaticAddress(VMPTR_FieldDesc vmField, VMPTR_AppDomain vmAppDomain)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetCollectibleTypeStaticAddress); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmField);
- WriteToBuffer(&bSend, vmAppDomain);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- CORDB_ADDRESS _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetCollectibleTypeStaticAddress
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetEnCHangingFieldInfo
-void DDMarshal::GetEnCHangingFieldInfo(const EnCHangingFieldInfo * pEnCFieldInfo, FieldData * pFieldData, BOOL * pfStatic)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetEnCHangingFieldInfo); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, pEnCFieldInfo);
- // pFieldData does not need to be copied on input
- // pfStatic does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pFieldData);
- ReadFromBuffer(&bRecv, pfStatic);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetEnCHangingFieldInfo
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetTypeHandleParams
-void DDMarshal::GetTypeHandleParams(VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, TypeParamsList * pParams)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetTypeHandleParams); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAppDomain);
- WriteToBuffer(&bSend, vmTypeHandle);
- // pParams does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pParams);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetTypeHandleParams
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetSimpleType
-void DDMarshal::GetSimpleType(VMPTR_AppDomain vmAppDomain, CorElementType simpleType, mdTypeDef * pMetadataToken, VMPTR_Module * pVmModule, VMPTR_DomainFile * pVmDomainFile)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetSimpleType); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAppDomain);
- WriteToBuffer(&bSend, simpleType);
- // pMetadataToken does not need to be copied on input
- // pVmModule does not need to be copied on input
- // pVmDomainFile does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pMetadataToken);
- ReadFromBuffer(&bRecv, pVmModule);
- ReadFromBuffer(&bRecv, pVmDomainFile);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetSimpleType
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsExceptionObject
-BOOL DDMarshal::IsExceptionObject(VMPTR_Object vmObject)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsExceptionObject); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmObject);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsExceptionObject
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetStackFramesFromException
-void DDMarshal::GetStackFramesFromException(VMPTR_Object vmObject, DacDbiArrayList<DacExceptionCallStackData> & dacStackFrames)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetStackFramesFromException); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmObject);
- WriteToBuffer(&bSend, dacStackFrames);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, dacStackFrames);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetStackFramesFromException
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsRcw
-BOOL DDMarshal::IsRcw(VMPTR_Object vmObject)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsRcw); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmObject);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsRcw
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetRcwCachedInterfaceTypes
-void DDMarshal::GetRcwCachedInterfaceTypes(VMPTR_Object vmObject, VMPTR_AppDomain vmAppDomain, BOOL bIInspectableOnly, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pDacInterfaces)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetRcwCachedInterfaceTypes); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmObject);
- WriteToBuffer(&bSend, vmAppDomain);
- WriteToBuffer(&bSend, bIInspectableOnly);
- // pDacInterfaces does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pDacInterfaces);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetRcwCachedInterfaceTypes
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetRcwCachedInterfacePointers
-void DDMarshal::GetRcwCachedInterfacePointers(VMPTR_Object vmObject, BOOL bIInspectableOnly, DacDbiArrayList<CORDB_ADDRESS> * pDacItfPtrs)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetRcwCachedInterfacePointers); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmObject);
- WriteToBuffer(&bSend, bIInspectableOnly);
- // pDacItfPtrs does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pDacItfPtrs);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetRcwCachedInterfacePointers
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetCachedWinRTTypesForIIDs
-void DDMarshal::GetCachedWinRTTypesForIIDs(VMPTR_AppDomain vmAppDomain, DacDbiArrayList<GUID> & iids, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetCachedWinRTTypesForIIDs); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAppDomain);
- WriteToBuffer(&bSend, iids);
- // pTypes does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, iids);
- ReadFromBuffer(&bRecv, pTypes);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetCachedWinRTTypesForIIDs
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetCachedWinRTTypes
-void DDMarshal::GetCachedWinRTTypes(VMPTR_AppDomain vmAppDomain, DacDbiArrayList<GUID> * piids, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetCachedWinRTTypes); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmAppDomain);
- // piids does not need to be copied on input
- // pTypes does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, piids);
- ReadFromBuffer(&bRecv, pTypes);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetCachedWinRTTypes
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetTypedByRefInfo
-void DDMarshal::GetTypedByRefInfo(CORDB_ADDRESS pTypedByRef, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetTypedByRefInfo); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, pTypedByRef);
- WriteToBuffer(&bSend, vmAppDomain);
- WriteToBuffer(&bSend, pObjectData);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pObjectData);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetTypedByRefInfo
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetStringData
-void DDMarshal::GetStringData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetStringData); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, objectAddress);
- WriteToBuffer(&bSend, pObjectData);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pObjectData);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetStringData
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetArrayData
-void DDMarshal::GetArrayData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetArrayData); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, objectAddress);
- WriteToBuffer(&bSend, pObjectData);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pObjectData);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetArrayData
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetBasicObjectInfo
-void DDMarshal::GetBasicObjectInfo(CORDB_ADDRESS objectAddress, CorElementType type, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetBasicObjectInfo); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, objectAddress);
- WriteToBuffer(&bSend, type);
- WriteToBuffer(&bSend, vmAppDomain);
- WriteToBuffer(&bSend, pObjectData);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pObjectData);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetBasicObjectInfo
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::TestCrst
-void DDMarshal::TestCrst(VMPTR_Crst vmCrst)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_TestCrst); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmCrst);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method TestCrst
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::TestRWLock
-void DDMarshal::TestRWLock(VMPTR_SimpleRWLock vmRWLock)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_TestRWLock); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmRWLock);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method TestRWLock
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetDebuggerControlBlockAddress
-CORDB_ADDRESS DDMarshal::GetDebuggerControlBlockAddress()
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetDebuggerControlBlockAddress); // message id
- // Copy in-parameters to the send-buffer
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- CORDB_ADDRESS _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetDebuggerControlBlockAddress
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetObjectFromRefPtr
-VMPTR_Object DDMarshal::GetObjectFromRefPtr(CORDB_ADDRESS ptr)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetObjectFromRefPtr); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, ptr);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_Object _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetObjectFromRefPtr
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetObject
-VMPTR_Object DDMarshal::GetObject(CORDB_ADDRESS ptr)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetObject); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, ptr);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_Object _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetObject
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::EnableNGENPolicy
-HRESULT DDMarshal::EnableNGENPolicy(CorDebugNGENPolicy ePolicy)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_EnableNGENPolicy); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, ePolicy);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method EnableNGENPolicy
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetVmObjectHandle
-VMPTR_OBJECTHANDLE DDMarshal::GetVmObjectHandle(CORDB_ADDRESS handleAddress)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetVmObjectHandle); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, handleAddress);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- VMPTR_OBJECTHANDLE _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetVmObjectHandle
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsVmObjectHandleValid
-BOOL DDMarshal::IsVmObjectHandleValid(VMPTR_OBJECTHANDLE vmHandle)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsVmObjectHandleValid); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmHandle);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- BOOL _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsVmObjectHandleValid
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsWinRTModule
-HRESULT DDMarshal::IsWinRTModule(VMPTR_Module vmModule, BOOL & isWinRT)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsWinRTModule); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmModule);
- WriteToBuffer(&bSend, isWinRT);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, isWinRT);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsWinRTModule
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetAppDomainIdFromVmObjectHandle
-ULONG DDMarshal::GetAppDomainIdFromVmObjectHandle(VMPTR_OBJECTHANDLE vmHandle)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetAppDomainIdFromVmObjectHandle); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmHandle);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- ULONG _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetAppDomainIdFromVmObjectHandle
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetHandleAddressFromVmHandle
-CORDB_ADDRESS DDMarshal::GetHandleAddressFromVmHandle(VMPTR_OBJECTHANDLE vmHandle)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetHandleAddressFromVmHandle); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmHandle);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- CORDB_ADDRESS _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetHandleAddressFromVmHandle
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetObjectContents
-TargetBuffer DDMarshal::GetObjectContents(VMPTR_Object obj)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetObjectContents); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, obj);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- TargetBuffer _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetObjectContents
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::EnumerateBlockingObjects
-void DDMarshal::EnumerateBlockingObjects(VMPTR_Thread vmThread, IDacDbiInterface::FP_BLOCKINGOBJECT_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_EnumerateBlockingObjects); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
- // fpCallback does not need to be copied on input
- // pUserData does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- // Result buffer contains the entire enumeration. Now iterate through that
- // locally and invoke the user's callback.
- while (true)
- {
- // Check status word before each element.
- // 1 means there's another item. 2 means it's the end of the enumeration.
- DWORD dw;
- ReadFromBuffer(&bRecv, dw);
- if (dw == 2)
- break;
- _ASSERTE(dw == 1);
-
- DacBlockingObject data;
- ReadFromBuffer(&bRecv, data);
-
- // Invoke user callback. This may throw.
- fpCallback(data, pUserData);
- }
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method EnumerateBlockingObjects
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetThreadOwningMonitorLock
-MonitorLockInfo DDMarshal::GetThreadOwningMonitorLock(VMPTR_Object vmObject)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetThreadOwningMonitorLock); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmObject);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- MonitorLockInfo _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetThreadOwningMonitorLock
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::EnumerateMonitorEventWaitList
-void DDMarshal::EnumerateMonitorEventWaitList(VMPTR_Object vmObject, IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_EnumerateMonitorEventWaitList); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmObject);
- // fpCallback does not need to be copied on input
- // pUserData does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- // Result buffer contains the entire enumeration. Now iterate through that
- // locally and invoke the user's callback.
- while (true)
- {
- // Check status word before each element.
- // 1 means there's another item. 2 means it's the end of the enumeration.
- DWORD dw;
- ReadFromBuffer(&bRecv, dw);
- if (dw == 2)
- break;
- _ASSERTE(dw == 1);
-
- VMPTR_Thread data;
- ReadFromBuffer(&bRecv, data);
-
- // Invoke user callback. This may throw.
- fpCallback(data, pUserData);
- }
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method EnumerateMonitorEventWaitList
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetAttachStateFlags
-CLR_DEBUGGING_PROCESS_FLAGS DDMarshal::GetAttachStateFlags()
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetAttachStateFlags); // message id
- // Copy in-parameters to the send-buffer
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- CLR_DEBUGGING_PROCESS_FLAGS _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetAttachStateFlags
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetMetaDataFileInfoFromPEFile
-bool DDMarshal::GetMetaDataFileInfoFromPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwImageSize, bool & isNGEN, IStringHolder * pStrFilename)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetMetaDataFileInfoFromPEFile); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmPEFile);
- WriteToBuffer(&bSend, dwTimeStamp);
- WriteToBuffer(&bSend, dwImageSize);
- WriteToBuffer(&bSend, isNGEN);
- // pStrFilename does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, dwTimeStamp);
- ReadFromBuffer(&bRecv, dwImageSize);
- ReadFromBuffer(&bRecv, isNGEN);
- ReadFromBuffer(&bRecv, pStrFilename);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- bool _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetMetaDataFileInfoFromPEFile
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetILImageInfoFromNgenPEFile
-bool DDMarshal::GetILImageInfoFromNgenPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwSize, IStringHolder * pStrFilename)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetILImageInfoFromNgenPEFile); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmPEFile);
- WriteToBuffer(&bSend, dwTimeStamp);
- WriteToBuffer(&bSend, dwSize);
- // pStrFilename does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, dwTimeStamp);
- ReadFromBuffer(&bRecv, dwSize);
- ReadFromBuffer(&bRecv, pStrFilename);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- bool _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetILImageInfoFromNgenPEFile
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsThreadSuspendedOrHijacked
-bool DDMarshal::IsThreadSuspendedOrHijacked(VMPTR_Thread vmThread)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsThreadSuspendedOrHijacked); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, vmThread);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- bool _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsThreadSuspendedOrHijacked
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::AreGCStructuresValid
-bool DDMarshal::AreGCStructuresValid()
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_AreGCStructuresValid); // message id
- // Copy in-parameters to the send-buffer
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- bool _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method AreGCStructuresValid
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::CreateHeapWalk
-HRESULT DDMarshal::CreateHeapWalk(HeapWalkHandle * pHandle)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_CreateHeapWalk); // message id
- // Copy in-parameters to the send-buffer
- // pHandle does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pHandle);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method CreateHeapWalk
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::DeleteHeapWalk
-void DDMarshal::DeleteHeapWalk(HeapWalkHandle handle)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_DeleteHeapWalk); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, handle);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method DeleteHeapWalk
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::WalkHeap
-HRESULT DDMarshal::WalkHeap(HeapWalkHandle handle, ULONG count, COR_HEAPOBJECT * objects, ULONG * pFetched)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_WalkHeap); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, handle);
- WriteToBuffer(&bSend, count);
- // objects does not need to be copied on input
- // pFetched does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, objects);
- ReadFromBuffer(&bRecv, pFetched);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method WalkHeap
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetHeapSegments
-HRESULT DDMarshal::GetHeapSegments(DacDbiArrayList<COR_SEGMENT> * pSegments)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetHeapSegments); // message id
- // Copy in-parameters to the send-buffer
- // pSegments does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pSegments);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetHeapSegments
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::IsValidObject
-bool DDMarshal::IsValidObject(CORDB_ADDRESS obj)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_IsValidObject); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, obj);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- bool _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method IsValidObject
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetAppDomainForObject
-bool DDMarshal::GetAppDomainForObject(CORDB_ADDRESS obj, VMPTR_AppDomain * pApp, VMPTR_Module * pModule, VMPTR_DomainFile * pDomainFile)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetAppDomainForObject); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, obj);
- // pApp does not need to be copied on input
- // pModule does not need to be copied on input
- // pDomainFile does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pApp);
- ReadFromBuffer(&bRecv, pModule);
- ReadFromBuffer(&bRecv, pDomainFile);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- bool _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetAppDomainForObject
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::CreateRefWalk
-HRESULT DDMarshal::CreateRefWalk(RefWalkHandle * pHandle, BOOL walkStacks, BOOL walkFQ, UINT32 handleWalkMask)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_CreateRefWalk); // message id
- // Copy in-parameters to the send-buffer
- // pHandle does not need to be copied on input
- WriteToBuffer(&bSend, walkStacks);
- WriteToBuffer(&bSend, walkFQ);
- WriteToBuffer(&bSend, handleWalkMask);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pHandle);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method CreateRefWalk
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::DeleteRefWalk
-void DDMarshal::DeleteRefWalk(RefWalkHandle handle)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_DeleteRefWalk); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, handle);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method DeleteRefWalk
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::WalkRefs
-HRESULT DDMarshal::WalkRefs(RefWalkHandle handle, ULONG count, DacGcReference * refs, ULONG * pFetched)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_WalkRefs); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, handle);
- WriteToBuffer(&bSend, count);
- // refs does not need to be copied on input
- // pFetched does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, refs);
- ReadFromBuffer(&bRecv, pFetched);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method WalkRefs
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetTypeID
-HRESULT DDMarshal::GetTypeID(CORDB_ADDRESS obj, COR_TYPEID * pType)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetTypeID); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, obj);
- WriteToBuffer(&bSend, pType);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pType);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetTypeID
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetObjectFields
-HRESULT DDMarshal::GetObjectFields(COR_TYPEID id, ULONG32 celt, COR_FIELD * layout, ULONG32 * pceltFetched)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetObjectFields); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, id);
- WriteToBuffer(&bSend, celt);
- // layout does not need to be copied on input
- // pceltFetched does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, layout);
- ReadFromBuffer(&bRecv, pceltFetched);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetObjectFields
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetTypeLayout
-HRESULT DDMarshal::GetTypeLayout(COR_TYPEID id, COR_TYPE_LAYOUT * pLayout)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetTypeLayout); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, id);
- WriteToBuffer(&bSend, pLayout);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pLayout);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetTypeLayout
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetArrayLayout
-HRESULT DDMarshal::GetArrayLayout(COR_TYPEID id, COR_ARRAY_LAYOUT * pLayout)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetArrayLayout); // message id
- // Copy in-parameters to the send-buffer
- WriteToBuffer(&bSend, id);
- WriteToBuffer(&bSend, pLayout);
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pLayout);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- // Check return value
- HRESULT _retValue;
- ReadFromBuffer(&bRecv, _retValue);
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
- return _retValue;
-} // end method GetArrayLayout
-
-//---------------------------------------------------------------------
-// Stub for virtual IDacDbiInterface::GetGCHeapInformation
-void DDMarshal::GetGCHeapInformation(COR_HEAPINFO * pHeapInfo)
-{
- WriteBuffer bSend;
- ReadBuffer bRecv;
-
- WriteToBuffer(&bSend, DDID_GetGCHeapInformation); // message id
- // Copy in-parameters to the send-buffer
- // pHeapInfo does not need to be copied on input
-
- SendDDMessage(&bSend, &bRecv);
-
- //Copy out-parameters (including status and return value) from receive buffer
- ReadFromBuffer(&bRecv, pHeapInfo);
-
- // Throw last so that any out-params are still updated.
- HRESULT hrException;
- ReadFromBuffer(&bRecv, hrException);
- IfFailThrow(hrException);
-
- _ASSERTE(bRecv.IsAtEnd()); // ensure buffer is fully read
-} // end method GetGCHeapInformation
-
-
-#endif //FEATURE_DBGIPC_TRANSPORT_DI
-
-// end of file
-
diff --git a/src/debug/di/ddpack.h b/src/debug/di/ddpack.h
deleted file mode 100644
index a83eb1ccb7..0000000000
--- a/src/debug/di/ddpack.h
+++ /dev/null
@@ -1,346 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-// Packer
-//
-// Lives on debugger right-side
-//
-// Note that this file is generated by ndp\clr\src\Debug\tools\BuildDDMarshal\.
-// Changes should be made to output\DDPack_template.h in that directory.
-//
-
-
-#ifndef _DD_PACK_H_
-#define _DD_PACK_H_
-
-#ifdef FEATURE_DBGIPC_TRANSPORT_DI
-
- class WriteBuffer;
- class ReadBuffer;
-
- // Flow is:
- // RS --> DDPack --> byte streams --> DDUnpack --> Real IDacDbiInterface
-
- // PAck up DD interface to a byte-sream.
- class DDMarshal : public IDacDbiInterface
- {
- public:
- /*
- DDMarshal(IDacDbiInterface * pReal, DDUnpack * pUnpack)
- {
- m_pReal = pReal;
- m_pUnpack = pUnpack;
- }
- // Used for trivial wrappers where we can't marshal yet.
- IDacDbiInterface * m_pReal;
-
- // The unpacker that gets called on the other side.
- DDUnpack * m_pUnpack;
-
- */
-
- DDMarshal(CordbProcess * pProcess)
- {
- m_pProcess = pProcess;
- m_sLock.Init("DDMarshal Lock", RSLock::cLockFlat, RSLock::LL_DD_MARSHAL_LOCK);
- }
-
- ~DDMarshal()
- {
- m_sLock.Destroy();
- }
-
- HRESULT Init();
-
- DbgTransportTarget * m_pProxy;
- DbgTransportSession * m_pTransport;
- CordbProcess * m_pProcess;
- RSLock m_sLock;
-
- // Each DD interface boils down to calling Send.
- void SendDDMessage(WriteBuffer * pSend, ReadBuffer * pResult);
-
-
- // Sig without '=0' at end;
- // virtual BOOL IsAssemblyFullyTrusted(VMPTR_DomainAssembly vmDomainAssembly, T* myRef, MyStruct * pStruct);
-//
-// Signature definitions
-//
-virtual HRESULT CheckDbiVersion(const DbiVersion * pVersion);
-
-virtual void GetLocalInterfaceHashAndTimestamp(DWORD & hash1, DWORD & hash2, DWORD & hash3, DWORD & hash4, DWORD & timestamp1, DWORD & timestamp2);
-
-virtual void GetRemoteInterfaceHashAndTimestamp(DWORD & hash1, DWORD & hash2, DWORD & hash3, DWORD & hash4, DWORD & timestamp1, DWORD & timestamp2);
-
-virtual HRESULT FlushCache();
-
-virtual void DacSetTargetConsistencyChecks(bool fEnableAsserts);
-
-virtual void Destroy();
-
-virtual BOOL IsLeftSideInitialized();
-
-virtual VMPTR_AppDomain GetAppDomainFromId(ULONG appdomainId);
-
-virtual ULONG GetAppDomainId(VMPTR_AppDomain vmAppDomain);
-
-virtual VMPTR_OBJECTHANDLE GetAppDomainObject(VMPTR_AppDomain vmAppDomain);
-
-virtual BOOL IsDefaultDomain(VMPTR_AppDomain vmAppDomain);
-
-virtual void GetAssemblyFromDomainAssembly(VMPTR_DomainAssembly vmDomainAssembly, VMPTR_Assembly * vmAssembly);
-
-virtual BOOL IsAssemblyFullyTrusted(VMPTR_DomainAssembly vmDomainAssembly);
-
-virtual void GetAppDomainFullName(VMPTR_AppDomain vmAppDomain, IStringHolder * pStrName);
-
-virtual void GetModuleSimpleName(VMPTR_Module vmModule, IStringHolder * pStrFilename);
-
-virtual BOOL GetAssemblyPath(VMPTR_Assembly vmAssembly, IStringHolder * pStrFilename);
-
-virtual void ResolveTypeReference(const TypeRefData * pTypeRefInfo, TypeRefData * pTargetRefInfo);
-
-virtual BOOL GetModulePath(VMPTR_Module vmModule, IStringHolder * pStrFilename);
-
-virtual BOOL GetModuleNGenPath(VMPTR_Module vmModule, IStringHolder * pStrFilename);
-
-virtual void GetMetadata(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer);
-
-virtual void GetSymbolsBuffer(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer, IDacDbiInterface::SymbolFormat * pSymbolFormat);
-
-virtual void GetModuleData(VMPTR_Module vmModule, ModuleInfo * pData);
-
-virtual void GetDomainFileData(VMPTR_DomainFile vmDomainFile, DomainFileInfo * pData);
-
-virtual void GetModuleForDomainFile(VMPTR_DomainFile vmDomainFile, VMPTR_Module * pModule);
-
-virtual IDacDbiInterface::AddressType GetAddressType(CORDB_ADDRESS address);
-
-virtual BOOL IsTransitionStub(CORDB_ADDRESS address);
-
-virtual void GetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL * pfAllowJITOpts, BOOL * pfEnableEnC);
-
-virtual HRESULT SetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL fAllowJitOpts, BOOL fEnableEnC);
-
-virtual void EnumerateAppDomains(IDacDbiInterface::FP_APPDOMAIN_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData);
-
-virtual void EnumerateAssembliesInAppDomain(VMPTR_AppDomain vmAppDomain, IDacDbiInterface::FP_ASSEMBLY_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData);
-
-virtual void EnumerateModulesInAssembly(VMPTR_DomainAssembly vmAssembly, IDacDbiInterface::FP_MODULE_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData);
-
-virtual void RequestSyncAtEvent();
-
-virtual void MarkDebuggerAttachPending();
-
-virtual void MarkDebuggerAttached(BOOL fAttached);
-
-virtual void Hijack(VMPTR_Thread vmThread, ULONG32 dwThreadId, const EXCEPTION_RECORD * pRecord, T_CONTEXT * pOriginalContext, ULONG32 cbSizeContext, EHijackReason::EHijackReason reason, void * pUserData, CORDB_ADDRESS * pRemoteContextAddr);
-
-virtual void EnumerateConnections(IDacDbiInterface::FP_CONNECTION_CALLBACK fpCallback, CALLBACK_DATA pUserData);
-
-virtual void EnumerateThreads(IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData);
-
-virtual bool IsThreadMarkedDead(VMPTR_Thread vmThread);
-
-virtual HANDLE GetThreadHandle(VMPTR_Thread vmThread);
-
-virtual VMPTR_OBJECTHANDLE GetThreadObject(VMPTR_Thread vmThread);
-
-virtual void SetDebugState(VMPTR_Thread vmThread, CorDebugThreadState debugState);
-
-virtual BOOL HasUnhandledException(VMPTR_Thread vmThread);
-
-virtual CorDebugUserState GetUserState(VMPTR_Thread vmThread);
-
-virtual CONNID GetConnectionID(VMPTR_Thread vmThread);
-
-virtual TASKID GetTaskID(VMPTR_Thread vmThread);
-
-virtual DWORD TryGetVolatileOSThreadID(VMPTR_Thread vmThread);
-
-virtual DWORD GetUniqueThreadID(VMPTR_Thread vmThread);
-
-virtual VMPTR_OBJECTHANDLE GetCurrentException(VMPTR_Thread vmThread);
-
-virtual VMPTR_OBJECTHANDLE GetCurrentCustomDebuggerNotification(VMPTR_Thread vmThread);
-
-virtual VMPTR_AppDomain GetCurrentAppDomain(VMPTR_Thread vmThread);
-
-virtual VMPTR_DomainAssembly ResolveAssembly(VMPTR_DomainFile vmScope, mdToken tkAssemblyRef);
-
-virtual void GetNativeCodeSequencePointsAndVarInfo(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS startAddress, BOOL fCodeAvailabe, NativeVarData * pNativeVarData, SequencePoints * pSequencePoints);
-
-virtual VMPTR_CONTEXT GetManagedStoppedContext(VMPTR_Thread vmThread);
-
-virtual void CreateStackWalk(VMPTR_Thread vmThread, DT_CONTEXT * pInternalContextBuffer, StackWalkHandle * ppSFIHandle);
-
-virtual void DeleteStackWalk(StackWalkHandle ppSFIHandle);
-
-virtual void GetStackWalkCurrentContext(StackWalkHandle pSFIHandle, DT_CONTEXT * pContext);
-
-virtual void SetStackWalkCurrentContext(VMPTR_Thread vmThread, StackWalkHandle pSFIHandle, CorDebugSetContextFlag flag, DT_CONTEXT * pContext);
-
-virtual BOOL UnwindStackWalkFrame(StackWalkHandle pSFIHandle);
-
-virtual HRESULT CheckContext(VMPTR_Thread vmThread, const DT_CONTEXT * pContext);
-
-virtual IDacDbiInterface::FrameType GetStackWalkCurrentFrameInfo(StackWalkHandle pSFIHandle, DebuggerIPCE_STRData * pFrameData);
-
-virtual ULONG32 GetCountOfInternalFrames(VMPTR_Thread vmThread);
-
-virtual void EnumerateInternalFrames(VMPTR_Thread vmThread, IDacDbiInterface::FP_INTERNAL_FRAME_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData);
-
-virtual BOOL IsMatchingParentFrame(FramePointer fpToCheck, FramePointer fpParent);
-
-virtual ULONG32 GetStackParameterSize(CORDB_ADDRESS controlPC);
-
-virtual FramePointer GetFramePointer(StackWalkHandle pSFIHandle);
-
-virtual BOOL IsLeafFrame(VMPTR_Thread vmThread, const DT_CONTEXT * pContext);
-
-virtual void GetContext(VMPTR_Thread vmThread, DT_CONTEXT * pContextBuffer);
-
-virtual void ConvertContextToDebuggerRegDisplay(const DT_CONTEXT * pInContext, DebuggerREGDISPLAY * pOutDRD, BOOL fActive);
-
-virtual IDacDbiInterface::DynamicMethodType IsILStubOrLCGMethod(VMPTR_MethodDesc vmMethodDesc);
-
-virtual TargetBuffer GetVarArgSig(CORDB_ADDRESS VASigCookieAddr, CORDB_ADDRESS * pArgBase);
-
-virtual BOOL RequiresAlign8(VMPTR_TypeHandle thExact);
-
-virtual GENERICS_TYPE_TOKEN ResolveExactGenericArgsToken(DWORD dwExactGenericArgsTokenIndex, GENERICS_TYPE_TOKEN rawToken);
-
-virtual void GetILCodeAndSig(VMPTR_DomainFile vmDomainFile, mdToken functionToken, TargetBuffer * pCodeInfo, mdToken * pLocalSigToken);
-
-virtual void GetNativeCodeInfo(VMPTR_DomainFile vmDomainFile, mdToken functionToken, NativeCodeFunctionData * pCodeInfo);
-
-virtual void GetNativeCodeInfoForAddr(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS hotCodeStartAddr, NativeCodeFunctionData * pCodeInfo);
-
-virtual void GetClassInfo(VMPTR_AppDomain vmAppDomain, VMPTR_Module vmModule, mdTypeDef metadataToken, VMPTR_TypeHandle thExact, VMPTR_TypeHandle thApprox, ClassInfo * pData);
-
-virtual void GetInstantiationFieldInfo(VMPTR_DomainFile vmDomainFile, mdTypeDef metadataToken, VMPTR_TypeHandle vmThExact, VMPTR_TypeHandle vmThApprox, DacDbiArrayList<FieldData> * pFieldList, SIZE_T * pObjectSize);
-
-virtual void TypeHandleToExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, DebuggerIPCE_ExpandedTypeData * pTypeInfo);
-
-virtual void GetObjectExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, CORDB_ADDRESS addr, DebuggerIPCE_ExpandedTypeData * pTypeInfo);
-
-virtual void GetObjectExpandedTypeInfoFromID(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, COR_TYPEID id, DebuggerIPCE_ExpandedTypeData * pTypeInfo);
-
-virtual VMPTR_TypeHandle GetApproxTypeHandle(TypeInfoList * pTypeData);
-
-virtual HRESULT GetExactTypeHandle(DebuggerIPCE_ExpandedTypeData * pTypeData, ArgInfoList * pArgInfo, VMPTR_TypeHandle & vmTypeHandle);
-
-virtual void GetMethodDescParams(VMPTR_AppDomain vmAppDomain, VMPTR_MethodDesc vmMethodDesc, GENERICS_TYPE_TOKEN genericsToken, UINT32 * pcGenericClassTypeParams, TypeParamsList * pGenericTypeParams);
-
-virtual CORDB_ADDRESS GetThreadOrContextStaticAddress(VMPTR_FieldDesc vmField, VMPTR_Thread vmRuntimeThread);
-
-virtual CORDB_ADDRESS GetCollectibleTypeStaticAddress(VMPTR_FieldDesc vmField, VMPTR_AppDomain vmAppDomain);
-
-virtual void GetEnCHangingFieldInfo(const EnCHangingFieldInfo * pEnCFieldInfo, FieldData * pFieldData, BOOL * pfStatic);
-
-virtual void GetTypeHandleParams(VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, TypeParamsList * pParams);
-
-virtual void GetSimpleType(VMPTR_AppDomain vmAppDomain, CorElementType simpleType, mdTypeDef * pMetadataToken, VMPTR_Module * pVmModule, VMPTR_DomainFile * pVmDomainFile);
-
-virtual BOOL IsExceptionObject(VMPTR_Object vmObject);
-
-virtual void GetStackFramesFromException(VMPTR_Object vmObject, DacDbiArrayList<DacExceptionCallStackData> & dacStackFrames);
-
-virtual BOOL IsRcw(VMPTR_Object vmObject);
-
-virtual void GetRcwCachedInterfaceTypes(VMPTR_Object vmObject, VMPTR_AppDomain vmAppDomain, BOOL bIInspectableOnly, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pDacInterfaces);
-
-virtual void GetRcwCachedInterfacePointers(VMPTR_Object vmObject, BOOL bIInspectableOnly, DacDbiArrayList<CORDB_ADDRESS> * pDacItfPtrs);
-
-virtual void GetCachedWinRTTypesForIIDs(VMPTR_AppDomain vmAppDomain, DacDbiArrayList<GUID> & iids, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes);
-
-virtual void GetCachedWinRTTypes(VMPTR_AppDomain vmAppDomain, DacDbiArrayList<GUID> * piids, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes);
-
-virtual void GetTypedByRefInfo(CORDB_ADDRESS pTypedByRef, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData);
-
-virtual void GetStringData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData);
-
-virtual void GetArrayData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData);
-
-virtual void GetBasicObjectInfo(CORDB_ADDRESS objectAddress, CorElementType type, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData);
-
-virtual void TestCrst(VMPTR_Crst vmCrst);
-
-virtual void TestRWLock(VMPTR_SimpleRWLock vmRWLock);
-
-virtual CORDB_ADDRESS GetDebuggerControlBlockAddress();
-
-virtual VMPTR_Object GetObjectFromRefPtr(CORDB_ADDRESS ptr);
-
-virtual VMPTR_Object GetObject(CORDB_ADDRESS ptr);
-
-virtual HRESULT EnableNGENPolicy(CorDebugNGENPolicy ePolicy);
-
-virtual VMPTR_OBJECTHANDLE GetVmObjectHandle(CORDB_ADDRESS handleAddress);
-
-virtual BOOL IsVmObjectHandleValid(VMPTR_OBJECTHANDLE vmHandle);
-
-virtual HRESULT IsWinRTModule(VMPTR_Module vmModule, BOOL & isWinRT);
-
-virtual ULONG GetAppDomainIdFromVmObjectHandle(VMPTR_OBJECTHANDLE vmHandle);
-
-virtual CORDB_ADDRESS GetHandleAddressFromVmHandle(VMPTR_OBJECTHANDLE vmHandle);
-
-virtual TargetBuffer GetObjectContents(VMPTR_Object obj);
-
-virtual void EnumerateBlockingObjects(VMPTR_Thread vmThread, IDacDbiInterface::FP_BLOCKINGOBJECT_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData);
-
-virtual MonitorLockInfo GetThreadOwningMonitorLock(VMPTR_Object vmObject);
-
-virtual void EnumerateMonitorEventWaitList(VMPTR_Object vmObject, IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData);
-
-virtual CLR_DEBUGGING_PROCESS_FLAGS GetAttachStateFlags();
-
-virtual bool GetMetaDataFileInfoFromPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwImageSize, bool & isNGEN, IStringHolder * pStrFilename);
-
-virtual bool GetILImageInfoFromNgenPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwSize, IStringHolder * pStrFilename);
-
-virtual bool IsThreadSuspendedOrHijacked(VMPTR_Thread vmThread);
-
-virtual bool AreGCStructuresValid();
-
-virtual HRESULT CreateHeapWalk(HeapWalkHandle * pHandle);
-
-virtual void DeleteHeapWalk(HeapWalkHandle handle);
-
-virtual HRESULT WalkHeap(HeapWalkHandle handle, ULONG count, COR_HEAPOBJECT * objects, ULONG * pFetched);
-
-virtual HRESULT GetHeapSegments(DacDbiArrayList<COR_SEGMENT> * pSegments);
-
-virtual bool IsValidObject(CORDB_ADDRESS obj);
-
-virtual bool GetAppDomainForObject(CORDB_ADDRESS obj, VMPTR_AppDomain * pApp, VMPTR_Module * pModule, VMPTR_DomainFile * pDomainFile);
-
-virtual HRESULT CreateRefWalk(RefWalkHandle * pHandle, BOOL walkStacks, BOOL walkFQ, UINT32 handleWalkMask);
-
-virtual void DeleteRefWalk(RefWalkHandle handle);
-
-virtual HRESULT WalkRefs(RefWalkHandle handle, ULONG count, DacGcReference * refs, ULONG * pFetched);
-
-virtual HRESULT GetTypeID(CORDB_ADDRESS obj, COR_TYPEID * pType);
-
-virtual HRESULT GetObjectFields(COR_TYPEID id, ULONG32 celt, COR_FIELD * layout, ULONG32 * pceltFetched);
-
-virtual HRESULT GetTypeLayout(COR_TYPEID id, COR_TYPE_LAYOUT * pLayout);
-
-virtual HRESULT GetArrayLayout(COR_TYPEID id, COR_ARRAY_LAYOUT * pLayout);
-
-virtual void GetGCHeapInformation(COR_HEAPINFO * pHeapInfo);
-
-
-
- };
-
-#endif //FEATURE_DBGIPC_TRANSPORT_DI
-
-
-#endif // _DD_PACK_H_
-
-// end of file
diff --git a/src/debug/di/eventchannel.h b/src/debug/di/eventchannel.h
index 232f6e0a10..9bdd2c7479 100644
--- a/src/debug/di/eventchannel.h
+++ b/src/debug/di/eventchannel.h
@@ -58,7 +58,7 @@
// - LS: code:DebuggerRCThread::SendIPCEvent
//
// In a sense, you can think of the LS and the RS sharing 3 channels: one for debug events (see
-// code:INativeEventPipeline), one for DDI calls (see code:IDacDbiInterface and code:DDMarshal::SendDDMessage),
+// code:INativeEventPipeline), one for DDI calls (see code:IDacDbiInterface),
// and one for "IPC" events. This is the interface for the "IPC" events.
//
diff --git a/src/debug/di/platformspecific.cpp b/src/debug/di/platformspecific.cpp
index b7cdfe228e..1acd4fc186 100644
--- a/src/debug/di/platformspecific.cpp
+++ b/src/debug/di/platformspecific.cpp
@@ -17,8 +17,6 @@
#include "dbgtransportpipeline.cpp"
#include "shimremotedatatarget.cpp"
#include "remoteeventchannel.cpp"
-#include "ddpack.cpp"
-#elif FEATURE_PAL
#else
#include "WindowsPipeline.cpp"
#include "EventRedirectionPipeline.cpp"
diff --git a/src/debug/di/process.cpp b/src/debug/di/process.cpp
index fcf9d8ff35..2653f5627f 100644
--- a/src/debug/di/process.cpp
+++ b/src/debug/di/process.cpp
@@ -1198,6 +1198,7 @@ HRESULT ShimProcess::DebugActiveProcess(
_ASSERTE(SUCCEEDED(hr));
+#if !defined(FEATURE_DBGIPC_TRANSPORT_DI)
// Don't do this when we are remote debugging since we won't be getting the loader breakpoint.
// We don't support JIT attach in remote debugging scenarios anyway.
//
@@ -1229,6 +1230,7 @@ HRESULT ShimProcess::DebugActiveProcess(
// Wait for the completion of marking pending attach bit or debugger detaching
WaitForMultipleObjectsEx(dwHandles, arrHandles, FALSE, INFINITE, FALSE);
}
+#endif //!FEATURE_DBGIPC_TRANSPORT_DI
}
EX_CATCH_HRESULT(hr);
@@ -2138,10 +2140,10 @@ HRESULT CordbProcess::QueryInterface(REFIID id, void **pInterface)
{
*pInterface = static_cast<ICorDebugProcess7*>(this);
}
- else if (id == IID_ICorDebugProcess8)
- {
- *pInterface = static_cast<ICorDebugProcess8*>(this);
- }
+ else if (id == IID_ICorDebugProcess8)
+ {
+ *pInterface = static_cast<ICorDebugProcess8*>(this);
+ }
#ifdef FEATURE_LEGACYNETCF_DBG_HOST_CONTROL
else if (id == IID_ICorDebugLegacyNetCFHostCallbackInvoker_PrivateWindowsPhoneOnly)
{
@@ -7491,7 +7493,7 @@ void CordbProcess::GetEventBlock(BOOL * pfBlockExists)
// Verify that the control block is valid.
// This will throw on error.
VerifyControlBlock();
-
+
*pfBlockExists = true;
}
else
@@ -7654,8 +7656,8 @@ HRESULT CordbProcess::GetRuntimeOffsets()
#elif FEATURE_PAL
m_hHelperThread = NULL; //RS is supposed to be able to live without a helper thread handle.
#else
- m_hHelperThread = OpenThread(SYNCHRONIZE, FALSE, dwHelperTid);
- CONSISTENCY_CHECK_MSGF(m_hHelperThread != NULL, ("Failed to get helper-thread handle. tid=0x%x\n", dwHelperTid));
+ m_hHelperThread = OpenThread(SYNCHRONIZE, FALSE, dwHelperTid);
+ CONSISTENCY_CHECK_MSGF(m_hHelperThread != NULL, ("Failed to get helper-thread handle. tid=0x%x\n", dwHelperTid));
#endif
}
@@ -9825,12 +9827,11 @@ HRESULT CordbProcess::EnsureClrInstanceIdSet()
{
#ifdef FEATURE_CORESYSTEM
- _ASSERTE(m_cordb->GetTargetCLR() != 0);
- if(m_cordb->GetTargetCLR() != 0)
- {
- m_clrInstanceId = PTR_TO_CORDB_ADDRESS(m_cordb->GetTargetCLR());
- return S_OK;
- }
+ if(m_cordb->GetTargetCLR() != 0)
+ {
+ m_clrInstanceId = PTR_TO_CORDB_ADDRESS(m_cordb->GetTargetCLR());
+ return S_OK;
+ }
#endif
// The only case in which we're allowed to request the "default" CLR instance
@@ -11827,26 +11828,26 @@ CordbUnmanagedThread * CordbProcess::GetUnmanagedThreadFromEvent(const DEBUG_EVE
this->GetEventBlock(&fBlockExists);
- // If we have the debugger control block, and if that control block has the address of the thread proc for
- // the helper thread, then we're initialized enough on the Left Side to recgonize the helper thread based on
- // its thread proc's address.
- if (this->GetDCB() != NULL)
- {
- // get the latest LS DCB information
- UpdateRightSideDCB();
- if ((this->GetDCB()->m_helperThreadStartAddr != NULL) && (pUnmanagedThread != NULL))
- {
- void * pStartAddr = GetThreadUserStartAddr(pEvent);
-
- if (pStartAddr == this->GetDCB()->m_helperThreadStartAddr)
- {
- // Remember the ID of the helper thread.
- this->m_helperThreadId = pEvent->dwThreadId;
-
- LOG((LF_CORDB, LL_INFO1000, "W32ET::W32EL: Left Side Helper Thread is 0x%x\n", pEvent->dwThreadId));
- }
- }
- }
+ // If we have the debugger control block, and if that control block has the address of the thread proc for
+ // the helper thread, then we're initialized enough on the Left Side to recgonize the helper thread based on
+ // its thread proc's address.
+ if (this->GetDCB() != NULL)
+ {
+ // get the latest LS DCB information
+ UpdateRightSideDCB();
+ if ((this->GetDCB()->m_helperThreadStartAddr != NULL) && (pUnmanagedThread != NULL))
+ {
+ void * pStartAddr = GetThreadUserStartAddr(pEvent);
+
+ if (pStartAddr == this->GetDCB()->m_helperThreadStartAddr)
+ {
+ // Remember the ID of the helper thread.
+ this->m_helperThreadId = pEvent->dwThreadId;
+
+ LOG((LF_CORDB, LL_INFO1000, "W32ET::W32EL: Left Side Helper Thread is 0x%x\n", pEvent->dwThreadId));
+ }
+ }
+ }
}
EX_CATCH_HRESULT(hr)
{
diff --git a/src/debug/di/remoteeventchannel.cpp b/src/debug/di/remoteeventchannel.cpp
index 7699808f55..f57ecff884 100644
--- a/src/debug/di/remoteeventchannel.cpp
+++ b/src/debug/di/remoteeventchannel.cpp
@@ -101,15 +101,9 @@ HRESULT NewEventChannelForThisPlatform(CORDB_ADDRESS pLeftSideDCB,
RemoteEventChannel * pEventChannel = NULL;
DebuggerIPCControlBlock * pDCBBuffer = NULL;
- DbgTransportTarget * pProxy = NULL;
+ DbgTransportTarget * pProxy = g_pDbgTransportTarget;
DbgTransportSession * pTransport = NULL;
- hr = g_pDbgTransportManager->ConnectToTarget(machineInfo.GetIPAddress(), machineInfo.GetPort(), &pProxy);
- if (FAILED(hr))
- {
- goto Label_Exit;
- }
-
hr = pProxy->GetTransportForProcess(dwProcessId, &pTransport, &hDummy);
if (FAILED(hr))
{
@@ -154,12 +148,6 @@ Label_Exit:
{
pProxy->ReleaseTransport(pTransport);
}
-
- if (pProxy != NULL)
- {
- g_pDbgTransportManager->ReleaseTarget(pProxy);
- }
-
if (pDCBBuffer != NULL)
{
delete pDCBBuffer;
@@ -222,11 +210,6 @@ void RemoteEventChannel::Delete()
m_pProxy->ReleaseTransport(m_pTransport);
}
- if (m_pProxy != NULL)
- {
- g_pDbgTransportManager->ReleaseTarget(m_pProxy);
- }
-
delete this;
}
@@ -315,7 +298,7 @@ HRESULT RemoteEventChannel::SendEventToLeftSide(DebuggerIPCEvent * pEvent, SIZE_
HRESULT RemoteEventChannel::GetReplyFromLeftSide(DebuggerIPCEvent * pReplyEvent, SIZE_T eventSize)
{
// Delegate to the transport.
- m_pTransport->GetNextEvent(pReplyEvent, eventSize);
+ m_pTransport->GetNextEvent(pReplyEvent, (DWORD)eventSize);
return S_OK;
}
diff --git a/src/debug/di/shimlocaldatatarget.cpp b/src/debug/di/shimlocaldatatarget.cpp
index 66dd64a02d..45d0b6cebe 100644
--- a/src/debug/di/shimlocaldatatarget.cpp
+++ b/src/debug/di/shimlocaldatatarget.cpp
@@ -80,6 +80,9 @@ private:
// Note: throws
BOOL CompatibleHostAndTargetPlatforms(HANDLE hTargetProcess)
{
+#if defined(FEATURE_PAL)
+ return TRUE;
+#else
// get the platform for the host process
BOOL fHostProcessIsWow64 = FALSE;
BOOL fSuccess = FALSE;
@@ -118,6 +121,7 @@ BOOL CompatibleHostAndTargetPlatforms(HANDLE hTargetProcess)
{
return TRUE;
}
+#endif
} // CompatibleHostAndTargetPlatforms
// Helper macro to check for failure conditions at the start of data-target methods.
diff --git a/src/debug/di/shimpriv.h b/src/debug/di/shimpriv.h
index a402abf503..c3a505175c 100644
--- a/src/debug/di/shimpriv.h
+++ b/src/debug/di/shimpriv.h
@@ -518,10 +518,8 @@ protected:
HANDLE m_markAttachPendingEvent;
HANDLE m_terminatingEvent;
-#if !defined(FEATURE_CORESYSTEM)
- // Finds the base address of mscorwks.dll
+ // Finds the base address of [core]clr.dll
CORDB_ADDRESS GetCLRInstanceBaseAddress();
-#endif // !defined(FEATURE_CORESYSTEM)
//
// Event Queues
diff --git a/src/debug/di/shimprocess.cpp b/src/debug/di/shimprocess.cpp
index d289923302..49e4a3af4c 100644
--- a/src/debug/di/shimprocess.cpp
+++ b/src/debug/di/shimprocess.cpp
@@ -19,7 +19,11 @@
#include <limits.h>
#include "shimpriv.h"
+#if defined(FEATURE_PAL)
+#include "debug-pal.h"
+#else
#include <tlhelp32.h>
+#endif
//---------------------------------------------------------------------------------------
//
@@ -1083,8 +1087,8 @@ HRESULT ShimProcess::QueueFakeThreadAttachEventsNoOrder()
HRESULT ShimProcess::QueueFakeThreadAttachEventsNativeOrder()
{
#ifdef FEATURE_CORESYSTEM
- _ASSERTE("NYI");
- return E_FAIL;
+ _ASSERTE("NYI");
+ return E_FAIL;
#else
ICorDebugProcess * pProcess = GetProcess();
@@ -1731,22 +1735,22 @@ void ShimProcess::PreDispatchEvent(bool fRealCreateProcessEvent /*= false*/)
}
-#if !defined(FEATURE_CORESYSTEM)
-
// ----------------------------------------------------------------------------
// ShimProcess::GetCLRInstanceBaseAddress
-// Finds the base address of mscorwks.dll
+// Finds the base address of [core]clr.dll
// Arguments: none
-// Return value: returns the base address of mscorwks.dll if possible or NULL otherwise
+// Return value: returns the base address of [core]clr.dll if possible or NULL otherwise
//
CORDB_ADDRESS ShimProcess::GetCLRInstanceBaseAddress()
{
- // get a "snapshot" of all modules in the target
+ CORDB_ADDRESS baseAddress = CORDB_ADDRESS(NULL);
DWORD dwPid = m_pLiveDataTarget->GetPid();
+#if defined(FEATURE_PAL)
+ baseAddress = PTR_TO_CORDB_ADDRESS (GetDynamicLibraryAddressInProcess(dwPid, MAKEDLLNAME_A(MAIN_CLR_MODULE_NAME_A)));
+#else //FEATURE_PAL
+ // get a "snapshot" of all modules in the target
HandleHolder hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPid);
MODULEENTRY32 moduleEntry = { 0 };
- CORDB_ADDRESS baseAddress = CORDB_ADDRESS(NULL);
-
if (hSnapshot == INVALID_HANDLE_VALUE)
{
@@ -1775,10 +1779,9 @@ CORDB_ADDRESS ShimProcess::GetCLRInstanceBaseAddress()
} while (Module32Next(hSnapshot, &moduleEntry));
}
}
-
+#endif
return baseAddress;
} // ShimProcess::GetCLRInstanceBaseAddress
-#endif
// ----------------------------------------------------------------------------
// ShimProcess::FindLoadedCLR
@@ -1805,12 +1808,7 @@ HRESULT ShimProcess::FindLoadedCLR(CORDB_ADDRESS * pClrInstanceId)
// such as CreateToolHelp32Snapshot, and LoadModuleFirst
//
-#if !defined(FEATURE_CORESYSTEM)
*pClrInstanceId = GetCLRInstanceBaseAddress();
-#else
- _ASSERTE(!"Attempting to get CLR base address on non-Windows platform");
- return E_NOTIMPL;
-#endif
if (*pClrInstanceId == 0)
{
diff --git a/src/debug/di/shimremotedatatarget.cpp b/src/debug/di/shimremotedatatarget.cpp
index 77b834fa15..3498700ac1 100644
--- a/src/debug/di/shimremotedatatarget.cpp
+++ b/src/debug/di/shimremotedatatarget.cpp
@@ -130,11 +130,6 @@ void ShimRemoteDataTarget::Dispose()
m_pProxy->ReleaseTransport(m_pTransport);
}
- if (m_pProxy != NULL)
- {
- g_pDbgTransportManager->ReleaseTarget(m_pProxy);
- }
-
m_hr = CORDBG_E_OBJECT_NEUTERED;
}
@@ -163,15 +158,9 @@ HRESULT BuildPlatformSpecificDataTarget(MachineInfo machineInfo,
HRESULT hr = E_FAIL;
ShimRemoteDataTarget * pRemoteDataTarget = NULL;
- DbgTransportTarget * pProxy = NULL;
+ DbgTransportTarget * pProxy = g_pDbgTransportTarget;
DbgTransportSession * pTransport = NULL;
- hr = g_pDbgTransportManager->ConnectToTarget(machineInfo.GetIPAddress(), machineInfo.GetPort(), &pProxy);
- if (FAILED(hr))
- {
- goto Label_Exit;
- }
-
hr = pProxy->GetTransportForProcess(processId, &pTransport, &hDummy);
if (FAILED(hr))
{
@@ -210,10 +199,6 @@ Label_Exit:
{
pProxy->ReleaseTransport(pTransport);
}
- if (pProxy != NULL)
- {
- g_pDbgTransportManager->ReleaseTarget(pProxy);
- }
}
}
@@ -225,14 +210,28 @@ HRESULT STDMETHODCALLTYPE
ShimRemoteDataTarget::GetPlatform(
CorDebugPlatform *pPlatform)
{
- // Assume that we're running on Windows debugging a process on Mac for now.
-#if defined(DBG_TARGET_ARM)
- *pPlatform = CORDB_PLATFORM_WINDOWS_ARM;
-#elif defined(DBG_TARGET_X86)
- *pPlatform = CORDB_PLATFORM_WINDOWS_X86;
+#ifdef FEATURE_PAL
+ #if defined(DBG_TARGET_X86)
+ *pPlatform = CORDB_PLATFORM_MAC_X86;
+ #elif defined(DBG_TARGET_AMD64)
+ *pPlatform = CORDB_PLATFORM_MAC_AMD64;
+ #else
+ #error Unknown Processor.
+ #endif
#else
-#error Unknown Processor.
+ #if defined(DBG_TARGET_X86)
+ *pPlatform = CORDB_PLATFORM_WINDOWS_X86;
+ #elif defined(DBG_TARGET_AMD64)
+ *pPlatform = CORDB_PLATFORM_WINDOWS_AMD64;
+ #elif defined(DBG_TARGET_ARM)
+ *pPlatform = CORDB_PLATFORM_WINDOWS_ARM;
+ #elif defined(DBG_TARGET_ARM64)
+ *pPlatform = CORDB_PLATFORM_WINDOWS_ARM64;
+ #else
+ #error Unknown Processor.
+ #endif
#endif
+
return S_OK;
}
diff --git a/src/debug/ee/CMakeLists.txt b/src/debug/ee/CMakeLists.txt
index 5200072353..2b8d229cee 100644
--- a/src/debug/ee/CMakeLists.txt
+++ b/src/debug/ee/CMakeLists.txt
@@ -36,15 +36,6 @@ set(CORDBEE_SOURCES_DAC
${CORDBEE_SOURCES_DAC_AND_WKS}
)
-if(WIN32)
- list(APPEND CORDBEE_SOURCES_WKS
- # The following files need to be ported to Linux
- inprocdac.cpp
- dbgtransportproxy.cpp
- ddunpack.cpp
- )
-endif(WIN32)
-
if (IS_64BIT_BUILD EQUAL 1)
list(APPEND CORDBEE_SOURCES_WKS amd64/amd64walker.cpp)
else ()
diff --git a/src/debug/ee/dbgtransportproxy.cpp b/src/debug/ee/dbgtransportproxy.cpp
deleted file mode 100644
index 7847d9aff3..0000000000
--- a/src/debug/ee/dbgtransportproxy.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-
-#include "stdafx.h"
-#include "dbgtransportsession.h"
-#include "dbgtransportproxy.h"
-#include "dbgproxy.h"
-
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
-
-//
-// Provides access to the debugging proxy process from the left side.
-//
-
-DbgTransportProxy::DbgTransportProxy()
-{
- memset(this, 0, sizeof(*this));
-}
-
-// Startup and shutdown. Initialization takes the port number (in host byte order) that the left side will
-// wait on for debugger connections.
-HRESULT DbgTransportProxy::Init(unsigned short usPort)
-{
- // Query the debugger configuration for the current user, this will give us the port number the proxy is
- // using. By the time the this method is called we know that debugging is configured on for this process.
- DbgConfiguration sDbgConfig;
- if (!GetDebuggerConfiguration(&sDbgConfig))
- return E_OUTOFMEMORY;
- _ASSERTE(sDbgConfig.m_fEnabled);
- m_usProxyPort = sDbgConfig.m_usProxyPort;
-
- m_usPort = usPort;
-
- // Initialize some data the proxy needs when we register.
- m_uiPID = GetCurrentProcessId();
-
- // Allocate the connection manager and initialize it.
- m_pConnectionManager = AllocateSecConnMgr();
- if (m_pConnectionManager == NULL)
- return E_OUTOFMEMORY;
-
- SecConnStatus eStatus = m_pConnectionManager->Initialize();
- if (eStatus != SCS_Success)
- return eStatus == SCS_OutOfMemory ? E_OUTOFMEMORY : E_FAIL;
-
- return S_OK;
-}
-
-void DbgTransportProxy::Shutdown()
-{
- if (m_pConnectionManager)
- m_pConnectionManager->Destroy();
-}
-
-// Talk with the proxy process and register this instantiation of the runtime with it. The reply from the
-// proxy will indicate whether a debugger wishes to attach to us before any managed code is allowed to
-// run. This method is synchronous and will wait for the reply from the proxy (or a timeout).
-DbgProxyResult DbgTransportProxy::RegisterWithProxy()
-{
- // Attempt a connection to the proxy. Any failure is treated as the proxy not being there. No time for
- // retries and timeouts, we're holding up process startup.
- SecConn *pConnection = NULL;
- SecConnStatus eStatus = m_pConnectionManager->AllocateConnection(DBGIPC_NTOHL(inet_addr("127.0.0.1")),
- m_usProxyPort,
- &pConnection);
- if (eStatus == SCS_Success)
- eStatus = pConnection->Connect();
-
- if (eStatus != SCS_Success)
- {
- DbgTransportLog(LC_Proxy, "DbgTransportProxy::RegisterWithProxy(): failed to connect to proxy");
- if (pConnection)
- pConnection->Destroy();
- return RequestTimedOut;
- }
-
- // Format a registration message for the proxy.
- DbgProxyRegisterRuntimeMessage sRequest;
- sRequest.m_sHeader.m_eType = DPMT_RegisterRuntime;
- sRequest.m_sHeader.m_uiRequestID = 0;
- sRequest.m_sHeader.m_uiMagic = DBGPROXY_MAGIC_VALUE(&sRequest.m_sHeader);
- sRequest.m_sHeader.m_uiReserved = 0;
- sRequest.m_uiMajorVersion = kCurrentMajorVersion;
- sRequest.m_uiMinorVersion = kCurrentMinorVersion;
- sRequest.m_uiPID = m_uiPID;
- sRequest.m_usPort = m_usPort;
-
- // Send the message. If we can't even do that we act as though the proxy timed out on us (runtime startup
- // will continue and this process will not be debuggable).
- if (!pConnection->Send((unsigned char*)&sRequest, sizeof(sRequest)))
- {
- DbgTransportLog(LC_Proxy, "DbgTransportProxy::RegisterWithProxy(): failed to send registration to proxy");
- return RequestTimedOut;
- }
-
- // Wait for the reply.
- DbgProxyMessageHeader sReply;
- if (!pConnection->Receive((unsigned char*)&sReply, sizeof(sReply)))
- {
- DbgTransportLog(LC_Proxy, "DbgTransportProxy::RegisterWithProxy(): failed to receive reply from proxy");
- return RequestTimedOut;
- }
-
- // Validate reply.
- if (sReply.m_eType != DPMT_RuntimeRegistered ||
- sReply.VariantData.RuntimeRegistered.m_uiMajorVersion != (unsigned)kCurrentMajorVersion ||
- sReply.m_uiMagic != DBGPROXY_MAGIC_VALUE(&sReply))
- {
- DbgTransportLog(LC_Proxy, "DbgTransportProxy::RegisterWithProxy(): bad reply from the proxy");
- return RequestTimedOut;
- }
-
- bool fWaitForDebugger = sReply.VariantData.RuntimeRegistered.m_fWaitForDebuggerAttach;
- DbgTransportLog(LC_Proxy, "DbgTransportProxy::RegisterWithProxy(): %s for the debugger",
- fWaitForDebugger ? "Waiting" : "Not waiting");
- return fWaitForDebugger ? PendingDebuggerAttach : RequestSuccessful;
-}
-
-#endif // FEATURE_DBGIPC_TRANSPORT_VM
diff --git a/src/debug/ee/dbgtransportproxy.h b/src/debug/ee/dbgtransportproxy.h
deleted file mode 100644
index 25f8a501b3..0000000000
--- a/src/debug/ee/dbgtransportproxy.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-
-#ifndef __DBG_TRANSPORT_PROXY_INCLUDED
-#define __DBG_TRANSPORT_PROXY_INCLUDED
-
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
-
-#include "dbgproxy.h"
-
-//
-// Provides access to the debugging proxy process from the left side.
-//
-
-// The answers the proxy can give to us during runtime startup.
-enum DbgProxyResult
-{
- RequestSuccessful, // Successfully registered the runtime, no debugger is currently interested in us
- RequestTimedOut, // Timed-out trying to reach the proxy (it's probably not configured or started)
- PendingDebuggerAttach // Successfully registered the runtime, a debugger wishes to attach before code is run
-};
-
-class DbgTransportProxy
-{
-public:
- DbgTransportProxy();
-
- // Startup and shutdown. Initialization takes the port number (in host byte order) that the left side
- // will wait on for debugger connections.
- HRESULT Init(unsigned short usPort);
- void Shutdown();
-
- // Talk with the proxy process and register this instantiation of the runtime with it. The reply from the
- // proxy will indicate whether a debugger wishes to attach to us before any managed code is allowed to
- // run. This method is synchronous and will wait for the reply from the proxy (or a timeout).
- DbgProxyResult RegisterWithProxy();
-
-private:
- unsigned int m_uiPID; // PID of the current process
- unsigned short m_usPort; // Port the LS waits on for debugger connections
- unsigned short m_usProxyPort; // Port the proxy waits on for requests
-
- SecConnMgr *m_pConnectionManager; // Factory for network connections
-};
-
-#endif // FEATURE_DBGIPC_TRANSPORT_VM
-
-#endif // __DBG_TRANSPORT_PROXY_INCLUDED
diff --git a/src/debug/ee/ddunpack.cpp b/src/debug/ee/ddunpack.cpp
deleted file mode 100644
index 90b65c8a98..0000000000
--- a/src/debug/ee/ddunpack.cpp
+++ /dev/null
@@ -1,4578 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-// Unpacker
-//
-// Lives on EE side of the fence
-//
-// Note that this file is generated by ndp\clr\src\Debug\tools\BuildDDMarshal\.
-// Changes should be made to output\DDUnpack_template.cpp in that directory.
-//
-
-
-#include "stdafx.h"
-
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
-#include "dacdbiinterface.h"
-
-#include "ddshared.h"
-
-#include "ddmarshalutil.h"
-
-#include "ddunpack.h"
-
-#include "../shared/stringcopyholder.cpp"
-
-// Suppress PREFast warning about overly large function
-// These functions are automatically generated.
-#if defined(_PREFAST_)
-#pragma warning(disable:21000)
-#endif
-
-// general callback for Callback functions.
-template <class T>
-void GeneralEnumerationCallback(T vmAppDomain, void * pUserData)
-{
- WriteBuffer * pResult = (WriteBuffer *) pUserData;
-
- DWORD dw = 1; // Continue
- WriteToBuffer(pResult, dw);
- WriteToBuffer(pResult, vmAppDomain);
-}
-
-
-
-
-//
-// These stubs are called by the handler
-//
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT CheckDbiVersion(const DbiVersion * pVersion)
-void DDUnpack::Unpack_CheckDbiVersion(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- DbiVersion _pVersion; // storage
- const DbiVersion * pVersion = &_pVersion;
- ReadFromBuffer(pSend, &_pVersion); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->CheckDbiVersion(pVersion); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method CheckDbiVersion
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetLocalInterfaceHashAndTimestamp(DWORD & hash1, DWORD & hash2, DWORD & hash3, DWORD & hash4, DWORD & timestamp1, DWORD & timestamp2)
-void DDUnpack::Unpack_GetLocalInterfaceHashAndTimestamp(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Callbacks not yet implemented
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetLocalInterfaceHashAndTimestamp
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetRemoteInterfaceHashAndTimestamp(DWORD & hash1, DWORD & hash2, DWORD & hash3, DWORD & hash4, DWORD & timestamp1, DWORD & timestamp2)
-void DDUnpack::Unpack_GetRemoteInterfaceHashAndTimestamp(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- DWORD hash1;
- // hash1 does not need to be copied on input
- DWORD hash2;
- // hash2 does not need to be copied on input
- DWORD hash3;
- // hash3 does not need to be copied on input
- DWORD hash4;
- // hash4 does not need to be copied on input
- DWORD timestamp1;
- // timestamp1 does not need to be copied on input
- DWORD timestamp2;
- // timestamp2 does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- hash1 = 0xe5ffdbe6;
- hash2 = 0xf26b43be;
- hash3 = 0x6c9685ac;
- hash4 = 0xdd723940;
- timestamp1 = 0x1cc67fb;
- timestamp2 = 0xe3ad5a06;
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hash1);
- WriteToBuffer(pResult, hash2);
- WriteToBuffer(pResult, hash3);
- WriteToBuffer(pResult, hash4);
- WriteToBuffer(pResult, timestamp1);
- WriteToBuffer(pResult, timestamp2);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetRemoteInterfaceHashAndTimestamp
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT FlushCache()
-void DDUnpack::Unpack_FlushCache(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->FlushCache(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method FlushCache
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void DacSetTargetConsistencyChecks(bool fEnableAsserts)
-void DDUnpack::Unpack_DacSetTargetConsistencyChecks(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- bool fEnableAsserts;
- ReadFromBuffer(pSend, fEnableAsserts);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->DacSetTargetConsistencyChecks(fEnableAsserts); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method DacSetTargetConsistencyChecks
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void Destroy()
-void DDUnpack::Unpack_Destroy(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->Destroy(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method Destroy
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsLeftSideInitialized()
-void DDUnpack::Unpack_IsLeftSideInitialized(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsLeftSideInitialized(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsLeftSideInitialized
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_AppDomain GetAppDomainFromId(ULONG appdomainId)
-void DDUnpack::Unpack_GetAppDomainFromId(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- ULONG appdomainId;
- ReadFromBuffer(pSend, appdomainId);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_AppDomain _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAppDomainFromId(appdomainId); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainFromId
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// ULONG GetAppDomainId(VMPTR_AppDomain vmAppDomain)
-void DDUnpack::Unpack_GetAppDomainId(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- ULONG _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAppDomainId(vmAppDomain); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainId
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_OBJECTHANDLE GetAppDomainObject(VMPTR_AppDomain vmAppDomain)
-void DDUnpack::Unpack_GetAppDomainObject(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_OBJECTHANDLE _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAppDomainObject(vmAppDomain); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainObject
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsDefaultDomain(VMPTR_AppDomain vmAppDomain)
-void DDUnpack::Unpack_IsDefaultDomain(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsDefaultDomain(vmAppDomain); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsDefaultDomain
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetAssemblyFromDomainAssembly(VMPTR_DomainAssembly vmDomainAssembly, VMPTR_Assembly * vmAssembly)
-void DDUnpack::Unpack_GetAssemblyFromDomainAssembly(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_DomainAssembly vmDomainAssembly;
- ReadFromBuffer(pSend, vmDomainAssembly);
- VMPTR_Assembly _vmAssembly; // storage
- VMPTR_Assembly * vmAssembly = &_vmAssembly;
- // vmAssembly does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetAssemblyFromDomainAssembly(vmDomainAssembly, vmAssembly); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, vmAssembly);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAssemblyFromDomainAssembly
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsAssemblyFullyTrusted(VMPTR_DomainAssembly vmDomainAssembly)
-void DDUnpack::Unpack_IsAssemblyFullyTrusted(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_DomainAssembly vmDomainAssembly;
- ReadFromBuffer(pSend, vmDomainAssembly);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsAssemblyFullyTrusted(vmDomainAssembly); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsAssemblyFullyTrusted
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetAppDomainFullName(VMPTR_AppDomain vmAppDomain, IStringHolder * pStrName)
-void DDUnpack::Unpack_GetAppDomainFullName(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- StringCopyHolder _pStrName; // storage
- StringCopyHolder* pStrName = &_pStrName;
- // pStrName does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetAppDomainFullName(vmAppDomain, pStrName); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pStrName);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainFullName
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetModuleSimpleName(VMPTR_Module vmModule, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetModuleSimpleName(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetModuleSimpleName(vmModule, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetModuleSimpleName
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL GetAssemblyPath(VMPTR_Assembly vmAssembly, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetAssemblyPath(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Assembly vmAssembly;
- ReadFromBuffer(pSend, vmAssembly);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAssemblyPath(vmAssembly, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAssemblyPath
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void ResolveTypeReference(const TypeRefData * pTypeRefInfo, TypeRefData * pTargetRefInfo)
-void DDUnpack::Unpack_ResolveTypeReference(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- TypeRefData _pTypeRefInfo; // storage
- const TypeRefData * pTypeRefInfo = &_pTypeRefInfo;
- ReadFromBuffer(pSend, &_pTypeRefInfo); // serialize to storage
- TypeRefData _pTargetRefInfo; // storage
- TypeRefData * pTargetRefInfo = &_pTargetRefInfo;
- ReadFromBuffer(pSend, &_pTargetRefInfo); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->ResolveTypeReference(pTypeRefInfo, pTargetRefInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTargetRefInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method ResolveTypeReference
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL GetModulePath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetModulePath(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetModulePath(vmModule, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetModulePath
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL GetModuleNGenPath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetModuleNGenPath(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetModuleNGenPath(vmModule, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetModuleNGenPath
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetMetadata(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer)
-void DDUnpack::Unpack_GetMetadata(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- TargetBuffer _pTargetBuffer; // storage
- TargetBuffer * pTargetBuffer = &_pTargetBuffer;
- // pTargetBuffer does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetMetadata(vmModule, pTargetBuffer); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTargetBuffer);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetMetadata
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetSymbolsBuffer(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer, IDacDbiInterface::SymbolFormat * pSymbolFormat)
-void DDUnpack::Unpack_GetSymbolsBuffer(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- TargetBuffer _pTargetBuffer; // storage
- TargetBuffer * pTargetBuffer = &_pTargetBuffer;
- // pTargetBuffer does not need to be copied on input
- IDacDbiInterface::SymbolFormat _pSymbolFormat; // storage
- IDacDbiInterface::SymbolFormat * pSymbolFormat = &_pSymbolFormat;
- // pSymbolFormat does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetSymbolsBuffer(vmModule, pTargetBuffer, pSymbolFormat); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTargetBuffer);
- WriteToBuffer(pResult, pSymbolFormat);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetSymbolsBuffer
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetModuleData(VMPTR_Module vmModule, ModuleInfo * pData)
-void DDUnpack::Unpack_GetModuleData(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- ModuleInfo _pData; // storage
- ModuleInfo * pData = &_pData;
- // pData does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetModuleData(vmModule, pData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetModuleData
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetDomainFileData(VMPTR_DomainFile vmDomainFile, DomainFileInfo * pData)
-void DDUnpack::Unpack_GetDomainFileData(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- DomainFileInfo _pData; // storage
- DomainFileInfo * pData = &_pData;
- // pData does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetDomainFileData(vmDomainFile, pData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetDomainFileData
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetModuleForDomainFile(VMPTR_DomainFile vmDomainFile, VMPTR_Module * pModule)
-void DDUnpack::Unpack_GetModuleForDomainFile(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- VMPTR_Module _pModule; // storage
- VMPTR_Module * pModule = &_pModule;
- // pModule does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetModuleForDomainFile(vmDomainFile, pModule); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pModule);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetModuleForDomainFile
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// IDacDbiInterface::AddressType GetAddressType(CORDB_ADDRESS address)
-void DDUnpack::Unpack_GetAddressType(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS address;
- ReadFromBuffer(pSend, address);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- IDacDbiInterface::AddressType _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAddressType(address); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAddressType
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsTransitionStub(CORDB_ADDRESS address)
-void DDUnpack::Unpack_IsTransitionStub(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS address;
- ReadFromBuffer(pSend, address);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsTransitionStub(address); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsTransitionStub
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL * pfAllowJITOpts, BOOL * pfEnableEnC)
-void DDUnpack::Unpack_GetCompilerFlags(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- BOOL _pfAllowJITOpts; // storage
- BOOL * pfAllowJITOpts = &_pfAllowJITOpts;
- // pfAllowJITOpts does not need to be copied on input
- BOOL _pfEnableEnC; // storage
- BOOL * pfEnableEnC = &_pfEnableEnC;
- // pfEnableEnC does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetCompilerFlags(vmDomainFile, pfAllowJITOpts, pfEnableEnC); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pfAllowJITOpts);
- WriteToBuffer(pResult, pfEnableEnC);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCompilerFlags
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT SetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL fAllowJitOpts, BOOL fEnableEnC)
-void DDUnpack::Unpack_SetCompilerFlags(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- BOOL fAllowJitOpts;
- ReadFromBuffer(pSend, fAllowJitOpts);
- BOOL fEnableEnC;
- ReadFromBuffer(pSend, fEnableEnC);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->SetCompilerFlags(vmDomainFile, fAllowJitOpts, fEnableEnC); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method SetCompilerFlags
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateAppDomains(IDacDbiInterface::FP_APPDOMAIN_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateAppDomains(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateAppDomains(GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateAppDomains
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateAssembliesInAppDomain(VMPTR_AppDomain vmAppDomain, IDacDbiInterface::FP_ASSEMBLY_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateAssembliesInAppDomain(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateAssembliesInAppDomain(vmAppDomain, GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateAssembliesInAppDomain
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateModulesInAssembly(VMPTR_DomainAssembly vmAssembly, IDacDbiInterface::FP_MODULE_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateModulesInAssembly(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_DomainAssembly vmAssembly;
- ReadFromBuffer(pSend, vmAssembly);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateModulesInAssembly(vmAssembly, GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateModulesInAssembly
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void RequestSyncAtEvent()
-void DDUnpack::Unpack_RequestSyncAtEvent(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->RequestSyncAtEvent(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method RequestSyncAtEvent
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void MarkDebuggerAttachPending()
-void DDUnpack::Unpack_MarkDebuggerAttachPending(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->MarkDebuggerAttachPending(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method MarkDebuggerAttachPending
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void MarkDebuggerAttached(BOOL fAttached)
-void DDUnpack::Unpack_MarkDebuggerAttached(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- BOOL fAttached;
- ReadFromBuffer(pSend, fAttached);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->MarkDebuggerAttached(fAttached); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method MarkDebuggerAttached
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void Hijack(VMPTR_Thread vmThread, ULONG32 dwThreadId, const EXCEPTION_RECORD * pRecord, T_CONTEXT * pOriginalContext, ULONG32 cbSizeContext, EHijackReason::EHijackReason reason, void * pUserData, CORDB_ADDRESS * pRemoteContextAddr)
-void DDUnpack::Unpack_Hijack(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Callbacks not yet implemented
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method Hijack
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateConnections(IDacDbiInterface::FP_CONNECTION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateConnections(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Callbacks not yet implemented
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateConnections
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateThreads(IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateThreads(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateThreads(GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateThreads
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool IsThreadMarkedDead(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_IsThreadMarkedDead(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsThreadMarkedDead(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsThreadMarkedDead
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HANDLE GetThreadHandle(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetThreadHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- // Callbacks not yet implemented
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetThreadHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_OBJECTHANDLE GetThreadObject(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetThreadObject(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_OBJECTHANDLE _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetThreadObject(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetThreadObject
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void SetDebugState(VMPTR_Thread vmThread, CorDebugThreadState debugState)
-void DDUnpack::Unpack_SetDebugState(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- CorDebugThreadState debugState;
- ReadFromBuffer(pSend, debugState);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->SetDebugState(vmThread, debugState); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method SetDebugState
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL HasUnhandledException(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_HasUnhandledException(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->HasUnhandledException(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method HasUnhandledException
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CorDebugUserState GetUserState(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetUserState(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CorDebugUserState _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetUserState(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetUserState
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CONNID GetConnectionID(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetConnectionID(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CONNID _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetConnectionID(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetConnectionID
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// TASKID GetTaskID(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetTaskID(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- TASKID _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetTaskID(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetTaskID
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// DWORD TryGetVolatileOSThreadID(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_TryGetVolatileOSThreadID(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- DWORD _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->TryGetVolatileOSThreadID(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method TryGetVolatileOSThreadID
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// DWORD GetUniqueThreadID(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetUniqueThreadID(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- DWORD _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetUniqueThreadID(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetUniqueThreadID
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_OBJECTHANDLE GetCurrentException(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetCurrentException(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_OBJECTHANDLE _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetCurrentException(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCurrentException
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_OBJECTHANDLE GetCurrentCustomDebuggerNotification(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetCurrentCustomDebuggerNotification(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_OBJECTHANDLE _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetCurrentCustomDebuggerNotification(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCurrentCustomDebuggerNotification
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_AppDomain GetCurrentAppDomain(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetCurrentAppDomain(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_AppDomain _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetCurrentAppDomain(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCurrentAppDomain
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_DomainAssembly ResolveAssembly(VMPTR_DomainFile vmScope, mdToken tkAssemblyRef)
-void DDUnpack::Unpack_ResolveAssembly(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_DomainFile vmScope;
- ReadFromBuffer(pSend, vmScope);
- mdToken tkAssemblyRef;
- ReadFromBuffer(pSend, tkAssemblyRef);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_DomainAssembly _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->ResolveAssembly(vmScope, tkAssemblyRef); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method ResolveAssembly
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetNativeCodeSequencePointsAndVarInfo(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS startAddress, BOOL fCodeAvailabe, NativeVarData * pNativeVarData, SequencePoints * pSequencePoints)
-void DDUnpack::Unpack_GetNativeCodeSequencePointsAndVarInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_MethodDesc vmMethodDesc;
- ReadFromBuffer(pSend, vmMethodDesc);
- CORDB_ADDRESS startAddress;
- ReadFromBuffer(pSend, startAddress);
- BOOL fCodeAvailabe;
- ReadFromBuffer(pSend, fCodeAvailabe);
- NativeVarData _pNativeVarData; // storage
- NativeVarData * pNativeVarData = &_pNativeVarData;
- // pNativeVarData does not need to be copied on input
- SequencePoints _pSequencePoints; // storage
- SequencePoints * pSequencePoints = &_pSequencePoints;
- // pSequencePoints does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetNativeCodeSequencePointsAndVarInfo(vmMethodDesc, startAddress, fCodeAvailabe, pNativeVarData, pSequencePoints); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pNativeVarData);
- WriteToBuffer(pResult, pSequencePoints);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetNativeCodeSequencePointsAndVarInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_CONTEXT GetManagedStoppedContext(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetManagedStoppedContext(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_CONTEXT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetManagedStoppedContext(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetManagedStoppedContext
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void CreateStackWalk(VMPTR_Thread vmThread, DT_CONTEXT * pInternalContextBuffer, StackWalkHandle * ppSFIHandle)
-void DDUnpack::Unpack_CreateStackWalk(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- DT_CONTEXT _pInternalContextBuffer; // storage
- DT_CONTEXT * pInternalContextBuffer = &_pInternalContextBuffer;
- ReadFromBuffer(pSend, &_pInternalContextBuffer); // serialize to storage
- StackWalkHandle _ppSFIHandle; // storage
- StackWalkHandle * ppSFIHandle = &_ppSFIHandle;
- // ppSFIHandle does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->CreateStackWalk(vmThread, pInternalContextBuffer, ppSFIHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pInternalContextBuffer);
- WriteToBuffer(pResult, ppSFIHandle);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method CreateStackWalk
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void DeleteStackWalk(StackWalkHandle ppSFIHandle)
-void DDUnpack::Unpack_DeleteStackWalk(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- StackWalkHandle ppSFIHandle;
- ReadFromBuffer(pSend, ppSFIHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->DeleteStackWalk(ppSFIHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method DeleteStackWalk
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetStackWalkCurrentContext(StackWalkHandle pSFIHandle, DT_CONTEXT * pContext)
-void DDUnpack::Unpack_GetStackWalkCurrentContext(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- StackWalkHandle pSFIHandle;
- ReadFromBuffer(pSend, pSFIHandle);
- DT_CONTEXT _pContext; // storage
- DT_CONTEXT * pContext = &_pContext;
- ReadFromBuffer(pSend, &_pContext); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetStackWalkCurrentContext(pSFIHandle, pContext); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pContext);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetStackWalkCurrentContext
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void SetStackWalkCurrentContext(VMPTR_Thread vmThread, StackWalkHandle pSFIHandle, CorDebugSetContextFlag flag, DT_CONTEXT * pContext)
-void DDUnpack::Unpack_SetStackWalkCurrentContext(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- StackWalkHandle pSFIHandle;
- ReadFromBuffer(pSend, pSFIHandle);
- CorDebugSetContextFlag flag;
- ReadFromBuffer(pSend, flag);
- DT_CONTEXT _pContext; // storage
- DT_CONTEXT * pContext = &_pContext;
- ReadFromBuffer(pSend, &_pContext); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->SetStackWalkCurrentContext(vmThread, pSFIHandle, flag, pContext); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pContext);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method SetStackWalkCurrentContext
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL UnwindStackWalkFrame(StackWalkHandle pSFIHandle)
-void DDUnpack::Unpack_UnwindStackWalkFrame(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- StackWalkHandle pSFIHandle;
- ReadFromBuffer(pSend, pSFIHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->UnwindStackWalkFrame(pSFIHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method UnwindStackWalkFrame
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT CheckContext(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
-void DDUnpack::Unpack_CheckContext(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- DT_CONTEXT _pContext; // storage
- const DT_CONTEXT * pContext = &_pContext;
- ReadFromBuffer(pSend, &_pContext); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->CheckContext(vmThread, pContext); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method CheckContext
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// IDacDbiInterface::FrameType GetStackWalkCurrentFrameInfo(StackWalkHandle pSFIHandle, DebuggerIPCE_STRData * pFrameData)
-void DDUnpack::Unpack_GetStackWalkCurrentFrameInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- StackWalkHandle pSFIHandle;
- ReadFromBuffer(pSend, pSFIHandle);
- DebuggerIPCE_STRData _pFrameData; // storage
- DebuggerIPCE_STRData * pFrameData = &_pFrameData;
- ReadFromBuffer(pSend, &_pFrameData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- IDacDbiInterface::FrameType _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetStackWalkCurrentFrameInfo(pSFIHandle, pFrameData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pFrameData);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetStackWalkCurrentFrameInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// ULONG32 GetCountOfInternalFrames(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_GetCountOfInternalFrames(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- ULONG32 _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetCountOfInternalFrames(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCountOfInternalFrames
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateInternalFrames(VMPTR_Thread vmThread, IDacDbiInterface::FP_INTERNAL_FRAME_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateInternalFrames(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateInternalFrames(vmThread, GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateInternalFrames
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsMatchingParentFrame(FramePointer fpToCheck, FramePointer fpParent)
-void DDUnpack::Unpack_IsMatchingParentFrame(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- FramePointer fpToCheck;
- ReadFromBuffer(pSend, fpToCheck);
- FramePointer fpParent;
- ReadFromBuffer(pSend, fpParent);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsMatchingParentFrame(fpToCheck, fpParent); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsMatchingParentFrame
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// ULONG32 GetStackParameterSize(CORDB_ADDRESS controlPC)
-void DDUnpack::Unpack_GetStackParameterSize(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS controlPC;
- ReadFromBuffer(pSend, controlPC);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- ULONG32 _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetStackParameterSize(controlPC); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetStackParameterSize
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// FramePointer GetFramePointer(StackWalkHandle pSFIHandle)
-void DDUnpack::Unpack_GetFramePointer(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- StackWalkHandle pSFIHandle;
- ReadFromBuffer(pSend, pSFIHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- FramePointer _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetFramePointer(pSFIHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetFramePointer
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsLeafFrame(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
-void DDUnpack::Unpack_IsLeafFrame(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- DT_CONTEXT _pContext; // storage
- const DT_CONTEXT * pContext = &_pContext;
- ReadFromBuffer(pSend, &_pContext); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsLeafFrame(vmThread, pContext); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsLeafFrame
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetContext(VMPTR_Thread vmThread, DT_CONTEXT * pContextBuffer)
-void DDUnpack::Unpack_GetContext(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- DT_CONTEXT _pContextBuffer; // storage
- DT_CONTEXT * pContextBuffer = &_pContextBuffer;
- ReadFromBuffer(pSend, &_pContextBuffer); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetContext(vmThread, pContextBuffer); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pContextBuffer);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetContext
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void ConvertContextToDebuggerRegDisplay(const DT_CONTEXT * pInContext, DebuggerREGDISPLAY * pOutDRD, BOOL fActive)
-void DDUnpack::Unpack_ConvertContextToDebuggerRegDisplay(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- DT_CONTEXT _pInContext; // storage
- const DT_CONTEXT * pInContext = &_pInContext;
- ReadFromBuffer(pSend, &_pInContext); // serialize to storage
- DebuggerREGDISPLAY _pOutDRD; // storage
- DebuggerREGDISPLAY * pOutDRD = &_pOutDRD;
- ReadFromBuffer(pSend, &_pOutDRD); // serialize to storage
- BOOL fActive;
- ReadFromBuffer(pSend, fActive);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->ConvertContextToDebuggerRegDisplay(pInContext, pOutDRD, fActive); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pOutDRD);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method ConvertContextToDebuggerRegDisplay
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// IDacDbiInterface::DynamicMethodType IsILStubOrLCGMethod(VMPTR_MethodDesc vmMethodDesc)
-void DDUnpack::Unpack_IsILStubOrLCGMethod(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_MethodDesc vmMethodDesc;
- ReadFromBuffer(pSend, vmMethodDesc);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- IDacDbiInterface::DynamicMethodType _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsILStubOrLCGMethod(vmMethodDesc); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsILStubOrLCGMethod
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// TargetBuffer GetVarArgSig(CORDB_ADDRESS VASigCookieAddr, CORDB_ADDRESS * pArgBase)
-void DDUnpack::Unpack_GetVarArgSig(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS VASigCookieAddr;
- ReadFromBuffer(pSend, VASigCookieAddr);
- CORDB_ADDRESS _pArgBase; // storage
- CORDB_ADDRESS * pArgBase = &_pArgBase;
- // pArgBase does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- TargetBuffer _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetVarArgSig(VASigCookieAddr, pArgBase); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pArgBase);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetVarArgSig
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL RequiresAlign8(VMPTR_TypeHandle thExact)
-void DDUnpack::Unpack_RequiresAlign8(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_TypeHandle thExact;
- ReadFromBuffer(pSend, thExact);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->RequiresAlign8(thExact); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method RequiresAlign8
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// GENERICS_TYPE_TOKEN ResolveExactGenericArgsToken(DWORD dwExactGenericArgsTokenIndex, GENERICS_TYPE_TOKEN rawToken)
-void DDUnpack::Unpack_ResolveExactGenericArgsToken(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- DWORD dwExactGenericArgsTokenIndex;
- ReadFromBuffer(pSend, dwExactGenericArgsTokenIndex);
- GENERICS_TYPE_TOKEN rawToken;
- ReadFromBuffer(pSend, rawToken);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- GENERICS_TYPE_TOKEN _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->ResolveExactGenericArgsToken(dwExactGenericArgsTokenIndex, rawToken); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method ResolveExactGenericArgsToken
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetILCodeAndSig(VMPTR_DomainFile vmDomainFile, mdToken functionToken, TargetBuffer * pCodeInfo, mdToken * pLocalSigToken)
-void DDUnpack::Unpack_GetILCodeAndSig(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- mdToken functionToken;
- ReadFromBuffer(pSend, functionToken);
- TargetBuffer _pCodeInfo; // storage
- TargetBuffer * pCodeInfo = &_pCodeInfo;
- // pCodeInfo does not need to be copied on input
- mdToken _pLocalSigToken; // storage
- mdToken * pLocalSigToken = &_pLocalSigToken;
- // pLocalSigToken does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetILCodeAndSig(vmDomainFile, functionToken, pCodeInfo, pLocalSigToken); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pCodeInfo);
- WriteToBuffer(pResult, pLocalSigToken);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetILCodeAndSig
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetNativeCodeInfo(VMPTR_DomainFile vmDomainFile, mdToken functionToken, NativeCodeFunctionData * pCodeInfo)
-void DDUnpack::Unpack_GetNativeCodeInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- mdToken functionToken;
- ReadFromBuffer(pSend, functionToken);
- NativeCodeFunctionData _pCodeInfo; // storage
- NativeCodeFunctionData * pCodeInfo = &_pCodeInfo;
- // pCodeInfo does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetNativeCodeInfo(vmDomainFile, functionToken, pCodeInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pCodeInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetNativeCodeInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetNativeCodeInfoForAddr(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS hotCodeStartAddr, NativeCodeFunctionData * pCodeInfo)
-void DDUnpack::Unpack_GetNativeCodeInfoForAddr(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_MethodDesc vmMethodDesc;
- ReadFromBuffer(pSend, vmMethodDesc);
- CORDB_ADDRESS hotCodeStartAddr;
- ReadFromBuffer(pSend, hotCodeStartAddr);
- NativeCodeFunctionData _pCodeInfo; // storage
- NativeCodeFunctionData * pCodeInfo = &_pCodeInfo;
- ReadFromBuffer(pSend, &_pCodeInfo); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetNativeCodeInfoForAddr(vmMethodDesc, hotCodeStartAddr, pCodeInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pCodeInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetNativeCodeInfoForAddr
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetClassInfo(VMPTR_AppDomain vmAppDomain, VMPTR_Module vmModule, mdTypeDef metadataToken, VMPTR_TypeHandle thExact, VMPTR_TypeHandle thApprox, ClassInfo * pData)
-void DDUnpack::Unpack_GetClassInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- mdTypeDef metadataToken;
- ReadFromBuffer(pSend, metadataToken);
- VMPTR_TypeHandle thExact;
- ReadFromBuffer(pSend, thExact);
- VMPTR_TypeHandle thApprox;
- ReadFromBuffer(pSend, thApprox);
- ClassInfo _pData; // storage
- ClassInfo * pData = &_pData;
- ReadFromBuffer(pSend, &_pData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetClassInfo(vmAppDomain, vmModule, metadataToken, thExact, thApprox, pData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetClassInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetInstantiationFieldInfo(VMPTR_DomainFile vmDomainFile, mdTypeDef metadataToken, VMPTR_TypeHandle vmThExact, VMPTR_TypeHandle vmThApprox, DacDbiArrayList<FieldData> * pFieldList, SIZE_T * pObjectSize)
-void DDUnpack::Unpack_GetInstantiationFieldInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_DomainFile vmDomainFile;
- ReadFromBuffer(pSend, vmDomainFile);
- mdTypeDef metadataToken;
- ReadFromBuffer(pSend, metadataToken);
- VMPTR_TypeHandle vmThExact;
- ReadFromBuffer(pSend, vmThExact);
- VMPTR_TypeHandle vmThApprox;
- ReadFromBuffer(pSend, vmThApprox);
- DacDbiArrayList<FieldData> _pFieldList; // storage
- DacDbiArrayList<FieldData> * pFieldList = &_pFieldList;
- // pFieldList does not need to be copied on input
- SIZE_T _pObjectSize; // storage
- SIZE_T * pObjectSize = &_pObjectSize;
- // pObjectSize does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetInstantiationFieldInfo(vmDomainFile, metadataToken, vmThExact, vmThApprox, pFieldList, pObjectSize); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pFieldList);
- WriteToBuffer(pResult, pObjectSize);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetInstantiationFieldInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void TypeHandleToExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
-void DDUnpack::Unpack_TypeHandleToExpandedTypeInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- AreValueTypesBoxed boxed;
- ReadFromBuffer(pSend, boxed);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- VMPTR_TypeHandle vmTypeHandle;
- ReadFromBuffer(pSend, vmTypeHandle);
- DebuggerIPCE_ExpandedTypeData _pTypeInfo; // storage
- DebuggerIPCE_ExpandedTypeData * pTypeInfo = &_pTypeInfo;
- ReadFromBuffer(pSend, &_pTypeInfo); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->TypeHandleToExpandedTypeInfo(boxed, vmAppDomain, vmTypeHandle, pTypeInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTypeInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method TypeHandleToExpandedTypeInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetObjectExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, CORDB_ADDRESS addr, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
-void DDUnpack::Unpack_GetObjectExpandedTypeInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- AreValueTypesBoxed boxed;
- ReadFromBuffer(pSend, boxed);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- CORDB_ADDRESS addr;
- ReadFromBuffer(pSend, addr);
- DebuggerIPCE_ExpandedTypeData _pTypeInfo; // storage
- DebuggerIPCE_ExpandedTypeData * pTypeInfo = &_pTypeInfo;
- // pTypeInfo does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetObjectExpandedTypeInfo(boxed, vmAppDomain, addr, pTypeInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTypeInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetObjectExpandedTypeInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetObjectExpandedTypeInfoFromID(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, COR_TYPEID id, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
-void DDUnpack::Unpack_GetObjectExpandedTypeInfoFromID(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- AreValueTypesBoxed boxed;
- ReadFromBuffer(pSend, boxed);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- COR_TYPEID id;
- ReadFromBuffer(pSend, id);
- DebuggerIPCE_ExpandedTypeData _pTypeInfo; // storage
- DebuggerIPCE_ExpandedTypeData * pTypeInfo = &_pTypeInfo;
- // pTypeInfo does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetObjectExpandedTypeInfoFromID(boxed, vmAppDomain, id, pTypeInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTypeInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetObjectExpandedTypeInfoFromID
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_TypeHandle GetApproxTypeHandle(TypeInfoList * pTypeData)
-void DDUnpack::Unpack_GetApproxTypeHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- TypeInfoList _pTypeData; // storage
- TypeInfoList * pTypeData = &_pTypeData;
- ReadFromBuffer(pSend, &_pTypeData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_TypeHandle _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetApproxTypeHandle(pTypeData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTypeData);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetApproxTypeHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT GetExactTypeHandle(DebuggerIPCE_ExpandedTypeData * pTypeData, ArgInfoList * pArgInfo, VMPTR_TypeHandle & vmTypeHandle)
-void DDUnpack::Unpack_GetExactTypeHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- DebuggerIPCE_ExpandedTypeData _pTypeData; // storage
- DebuggerIPCE_ExpandedTypeData * pTypeData = &_pTypeData;
- ReadFromBuffer(pSend, &_pTypeData); // serialize to storage
- ArgInfoList _pArgInfo; // storage
- ArgInfoList * pArgInfo = &_pArgInfo;
- ReadFromBuffer(pSend, &_pArgInfo); // serialize to storage
- VMPTR_TypeHandle vmTypeHandle;
- ReadFromBuffer(pSend, vmTypeHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetExactTypeHandle(pTypeData, pArgInfo, vmTypeHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pTypeData);
- WriteToBuffer(pResult, pArgInfo);
- WriteToBuffer(pResult, vmTypeHandle);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetExactTypeHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetMethodDescParams(VMPTR_AppDomain vmAppDomain, VMPTR_MethodDesc vmMethodDesc, GENERICS_TYPE_TOKEN genericsToken, UINT32 * pcGenericClassTypeParams, TypeParamsList * pGenericTypeParams)
-void DDUnpack::Unpack_GetMethodDescParams(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- VMPTR_MethodDesc vmMethodDesc;
- ReadFromBuffer(pSend, vmMethodDesc);
- GENERICS_TYPE_TOKEN genericsToken;
- ReadFromBuffer(pSend, genericsToken);
- UINT32 _pcGenericClassTypeParams; // storage
- UINT32 * pcGenericClassTypeParams = &_pcGenericClassTypeParams;
- // pcGenericClassTypeParams does not need to be copied on input
- TypeParamsList _pGenericTypeParams; // storage
- TypeParamsList * pGenericTypeParams = &_pGenericTypeParams;
- // pGenericTypeParams does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetMethodDescParams(vmAppDomain, vmMethodDesc, genericsToken, pcGenericClassTypeParams, pGenericTypeParams); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pcGenericClassTypeParams);
- WriteToBuffer(pResult, pGenericTypeParams);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetMethodDescParams
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CORDB_ADDRESS GetThreadOrContextStaticAddress(VMPTR_FieldDesc vmField, VMPTR_Thread vmRuntimeThread)
-void DDUnpack::Unpack_GetThreadOrContextStaticAddress(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_FieldDesc vmField;
- ReadFromBuffer(pSend, vmField);
- VMPTR_Thread vmRuntimeThread;
- ReadFromBuffer(pSend, vmRuntimeThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CORDB_ADDRESS _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetThreadOrContextStaticAddress(vmField, vmRuntimeThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetThreadOrContextStaticAddress
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CORDB_ADDRESS GetCollectibleTypeStaticAddress(VMPTR_FieldDesc vmField, VMPTR_AppDomain vmAppDomain)
-void DDUnpack::Unpack_GetCollectibleTypeStaticAddress(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_FieldDesc vmField;
- ReadFromBuffer(pSend, vmField);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CORDB_ADDRESS _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetCollectibleTypeStaticAddress(vmField, vmAppDomain); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCollectibleTypeStaticAddress
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetEnCHangingFieldInfo(const EnCHangingFieldInfo * pEnCFieldInfo, FieldData * pFieldData, BOOL * pfStatic)
-void DDUnpack::Unpack_GetEnCHangingFieldInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- EnCHangingFieldInfo _pEnCFieldInfo; // storage
- const EnCHangingFieldInfo * pEnCFieldInfo = &_pEnCFieldInfo;
- ReadFromBuffer(pSend, &_pEnCFieldInfo); // serialize to storage
- FieldData _pFieldData; // storage
- FieldData * pFieldData = &_pFieldData;
- // pFieldData does not need to be copied on input
- BOOL _pfStatic; // storage
- BOOL * pfStatic = &_pfStatic;
- // pfStatic does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetEnCHangingFieldInfo(pEnCFieldInfo, pFieldData, pfStatic); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pFieldData);
- WriteToBuffer(pResult, pfStatic);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetEnCHangingFieldInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetTypeHandleParams(VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, TypeParamsList * pParams)
-void DDUnpack::Unpack_GetTypeHandleParams(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- VMPTR_TypeHandle vmTypeHandle;
- ReadFromBuffer(pSend, vmTypeHandle);
- TypeParamsList _pParams; // storage
- TypeParamsList * pParams = &_pParams;
- // pParams does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetTypeHandleParams(vmAppDomain, vmTypeHandle, pParams); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pParams);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetTypeHandleParams
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetSimpleType(VMPTR_AppDomain vmAppDomain, CorElementType simpleType, mdTypeDef * pMetadataToken, VMPTR_Module * pVmModule, VMPTR_DomainFile * pVmDomainFile)
-void DDUnpack::Unpack_GetSimpleType(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- CorElementType simpleType;
- ReadFromBuffer(pSend, simpleType);
- mdTypeDef _pMetadataToken; // storage
- mdTypeDef * pMetadataToken = &_pMetadataToken;
- // pMetadataToken does not need to be copied on input
- VMPTR_Module _pVmModule; // storage
- VMPTR_Module * pVmModule = &_pVmModule;
- // pVmModule does not need to be copied on input
- VMPTR_DomainFile _pVmDomainFile; // storage
- VMPTR_DomainFile * pVmDomainFile = &_pVmDomainFile;
- // pVmDomainFile does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetSimpleType(vmAppDomain, simpleType, pMetadataToken, pVmModule, pVmDomainFile); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pMetadataToken);
- WriteToBuffer(pResult, pVmModule);
- WriteToBuffer(pResult, pVmDomainFile);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetSimpleType
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsExceptionObject(VMPTR_Object vmObject)
-void DDUnpack::Unpack_IsExceptionObject(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Object vmObject;
- ReadFromBuffer(pSend, vmObject);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsExceptionObject(vmObject); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsExceptionObject
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetStackFramesFromException(VMPTR_Object vmObject, DacDbiArrayList<DacExceptionCallStackData> & dacStackFrames)
-void DDUnpack::Unpack_GetStackFramesFromException(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Object vmObject;
- ReadFromBuffer(pSend, vmObject);
- DacDbiArrayList<DacExceptionCallStackData> dacStackFrames;
- ReadFromBuffer(pSend, dacStackFrames);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetStackFramesFromException(vmObject, dacStackFrames); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, dacStackFrames);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetStackFramesFromException
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsRcw(VMPTR_Object vmObject)
-void DDUnpack::Unpack_IsRcw(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Object vmObject;
- ReadFromBuffer(pSend, vmObject);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsRcw(vmObject); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsRcw
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetRcwCachedInterfaceTypes(VMPTR_Object vmObject, VMPTR_AppDomain vmAppDomain, BOOL bIInspectableOnly, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pDacInterfaces)
-void DDUnpack::Unpack_GetRcwCachedInterfaceTypes(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Object vmObject;
- ReadFromBuffer(pSend, vmObject);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- BOOL bIInspectableOnly;
- ReadFromBuffer(pSend, bIInspectableOnly);
- DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> _pDacInterfaces; // storage
- DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pDacInterfaces = &_pDacInterfaces;
- // pDacInterfaces does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetRcwCachedInterfaceTypes(vmObject, vmAppDomain, bIInspectableOnly, pDacInterfaces); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pDacInterfaces);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetRcwCachedInterfaceTypes
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetRcwCachedInterfacePointers(VMPTR_Object vmObject, BOOL bIInspectableOnly, DacDbiArrayList<CORDB_ADDRESS> * pDacItfPtrs)
-void DDUnpack::Unpack_GetRcwCachedInterfacePointers(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Object vmObject;
- ReadFromBuffer(pSend, vmObject);
- BOOL bIInspectableOnly;
- ReadFromBuffer(pSend, bIInspectableOnly);
- DacDbiArrayList<CORDB_ADDRESS> _pDacItfPtrs; // storage
- DacDbiArrayList<CORDB_ADDRESS> * pDacItfPtrs = &_pDacItfPtrs;
- // pDacItfPtrs does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetRcwCachedInterfacePointers(vmObject, bIInspectableOnly, pDacItfPtrs); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pDacItfPtrs);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetRcwCachedInterfacePointers
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetCachedWinRTTypesForIIDs(VMPTR_AppDomain vmAppDomain, DacDbiArrayList<GUID> & iids, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes)
-void DDUnpack::Unpack_GetCachedWinRTTypesForIIDs(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- DacDbiArrayList<GUID> iids;
- ReadFromBuffer(pSend, iids);
- DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> _pTypes; // storage
- DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes = &_pTypes;
- // pTypes does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetCachedWinRTTypesForIIDs(vmAppDomain, iids, pTypes); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, iids);
- WriteToBuffer(pResult, pTypes);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCachedWinRTTypesForIIDs
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetCachedWinRTTypes(VMPTR_AppDomain vmAppDomain, DacDbiArrayList<GUID> * piids, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes)
-void DDUnpack::Unpack_GetCachedWinRTTypes(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- DacDbiArrayList<GUID> _piids; // storage
- DacDbiArrayList<GUID> * piids = &_piids;
- // piids does not need to be copied on input
- DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> _pTypes; // storage
- DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes = &_pTypes;
- // pTypes does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetCachedWinRTTypes(vmAppDomain, piids, pTypes); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, piids);
- WriteToBuffer(pResult, pTypes);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetCachedWinRTTypes
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetTypedByRefInfo(CORDB_ADDRESS pTypedByRef, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
-void DDUnpack::Unpack_GetTypedByRefInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS pTypedByRef;
- ReadFromBuffer(pSend, pTypedByRef);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- DebuggerIPCE_ObjectData _pObjectData; // storage
- DebuggerIPCE_ObjectData * pObjectData = &_pObjectData;
- ReadFromBuffer(pSend, &_pObjectData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetTypedByRefInfo(pTypedByRef, vmAppDomain, pObjectData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pObjectData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetTypedByRefInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetStringData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
-void DDUnpack::Unpack_GetStringData(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS objectAddress;
- ReadFromBuffer(pSend, objectAddress);
- DebuggerIPCE_ObjectData _pObjectData; // storage
- DebuggerIPCE_ObjectData * pObjectData = &_pObjectData;
- ReadFromBuffer(pSend, &_pObjectData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetStringData(objectAddress, pObjectData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pObjectData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetStringData
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetArrayData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
-void DDUnpack::Unpack_GetArrayData(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS objectAddress;
- ReadFromBuffer(pSend, objectAddress);
- DebuggerIPCE_ObjectData _pObjectData; // storage
- DebuggerIPCE_ObjectData * pObjectData = &_pObjectData;
- ReadFromBuffer(pSend, &_pObjectData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetArrayData(objectAddress, pObjectData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pObjectData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetArrayData
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetBasicObjectInfo(CORDB_ADDRESS objectAddress, CorElementType type, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
-void DDUnpack::Unpack_GetBasicObjectInfo(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS objectAddress;
- ReadFromBuffer(pSend, objectAddress);
- CorElementType type;
- ReadFromBuffer(pSend, type);
- VMPTR_AppDomain vmAppDomain;
- ReadFromBuffer(pSend, vmAppDomain);
- DebuggerIPCE_ObjectData _pObjectData; // storage
- DebuggerIPCE_ObjectData * pObjectData = &_pObjectData;
- ReadFromBuffer(pSend, &_pObjectData); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetBasicObjectInfo(objectAddress, type, vmAppDomain, pObjectData); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pObjectData);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetBasicObjectInfo
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void TestCrst(VMPTR_Crst vmCrst)
-void DDUnpack::Unpack_TestCrst(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Crst vmCrst;
- ReadFromBuffer(pSend, vmCrst);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->TestCrst(vmCrst); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method TestCrst
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void TestRWLock(VMPTR_SimpleRWLock vmRWLock)
-void DDUnpack::Unpack_TestRWLock(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_SimpleRWLock vmRWLock;
- ReadFromBuffer(pSend, vmRWLock);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->TestRWLock(vmRWLock); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method TestRWLock
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CORDB_ADDRESS GetDebuggerControlBlockAddress()
-void DDUnpack::Unpack_GetDebuggerControlBlockAddress(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CORDB_ADDRESS _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetDebuggerControlBlockAddress(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetDebuggerControlBlockAddress
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_Object GetObjectFromRefPtr(CORDB_ADDRESS ptr)
-void DDUnpack::Unpack_GetObjectFromRefPtr(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS ptr;
- ReadFromBuffer(pSend, ptr);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_Object _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetObjectFromRefPtr(ptr); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetObjectFromRefPtr
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_Object GetObject(CORDB_ADDRESS ptr)
-void DDUnpack::Unpack_GetObject(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS ptr;
- ReadFromBuffer(pSend, ptr);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_Object _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetObject(ptr); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetObject
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT EnableNGENPolicy(CorDebugNGENPolicy ePolicy)
-void DDUnpack::Unpack_EnableNGENPolicy(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CorDebugNGENPolicy ePolicy;
- ReadFromBuffer(pSend, ePolicy);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->EnableNGENPolicy(ePolicy); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnableNGENPolicy
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// VMPTR_OBJECTHANDLE GetVmObjectHandle(CORDB_ADDRESS handleAddress)
-void DDUnpack::Unpack_GetVmObjectHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS handleAddress;
- ReadFromBuffer(pSend, handleAddress);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- VMPTR_OBJECTHANDLE _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetVmObjectHandle(handleAddress); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetVmObjectHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// BOOL IsVmObjectHandleValid(VMPTR_OBJECTHANDLE vmHandle)
-void DDUnpack::Unpack_IsVmObjectHandleValid(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_OBJECTHANDLE vmHandle;
- ReadFromBuffer(pSend, vmHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- BOOL _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsVmObjectHandleValid(vmHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsVmObjectHandleValid
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT IsWinRTModule(VMPTR_Module vmModule, BOOL & isWinRT)
-void DDUnpack::Unpack_IsWinRTModule(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Module vmModule;
- ReadFromBuffer(pSend, vmModule);
- BOOL isWinRT;
- ReadFromBuffer(pSend, isWinRT);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsWinRTModule(vmModule, isWinRT); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, isWinRT);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsWinRTModule
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// ULONG GetAppDomainIdFromVmObjectHandle(VMPTR_OBJECTHANDLE vmHandle)
-void DDUnpack::Unpack_GetAppDomainIdFromVmObjectHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_OBJECTHANDLE vmHandle;
- ReadFromBuffer(pSend, vmHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- ULONG _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAppDomainIdFromVmObjectHandle(vmHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainIdFromVmObjectHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CORDB_ADDRESS GetHandleAddressFromVmHandle(VMPTR_OBJECTHANDLE vmHandle)
-void DDUnpack::Unpack_GetHandleAddressFromVmHandle(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_OBJECTHANDLE vmHandle;
- ReadFromBuffer(pSend, vmHandle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CORDB_ADDRESS _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetHandleAddressFromVmHandle(vmHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetHandleAddressFromVmHandle
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// TargetBuffer GetObjectContents(VMPTR_Object obj)
-void DDUnpack::Unpack_GetObjectContents(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Object obj;
- ReadFromBuffer(pSend, obj);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- TargetBuffer _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetObjectContents(obj); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetObjectContents
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateBlockingObjects(VMPTR_Thread vmThread, IDacDbiInterface::FP_BLOCKINGOBJECT_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateBlockingObjects(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateBlockingObjects(vmThread, GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateBlockingObjects
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// MonitorLockInfo GetThreadOwningMonitorLock(VMPTR_Object vmObject)
-void DDUnpack::Unpack_GetThreadOwningMonitorLock(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Object vmObject;
- ReadFromBuffer(pSend, vmObject);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- MonitorLockInfo _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetThreadOwningMonitorLock(vmObject); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetThreadOwningMonitorLock
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void EnumerateMonitorEventWaitList(VMPTR_Object vmObject, IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
-void DDUnpack::Unpack_EnumerateMonitorEventWaitList(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Object vmObject;
- ReadFromBuffer(pSend, vmObject);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- // Extra stuff for callback handlers
- m_pReal->EnumerateMonitorEventWaitList(vmObject, GeneralEnumerationCallback, pResult);
-
- }
- EX_CATCH_HRESULT(hr);
-
- // Sentinel for callback list
- DWORD dw = 2; // Stop
- WriteToBuffer(pResult, dw);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method EnumerateMonitorEventWaitList
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// CLR_DEBUGGING_PROCESS_FLAGS GetAttachStateFlags()
-void DDUnpack::Unpack_GetAttachStateFlags(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- CLR_DEBUGGING_PROCESS_FLAGS _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAttachStateFlags(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAttachStateFlags
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool GetMetaDataFileInfoFromPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwImageSize, bool & isNGEN, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetMetaDataFileInfoFromPEFile(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_PEFile vmPEFile;
- ReadFromBuffer(pSend, vmPEFile);
- DWORD dwTimeStamp;
- ReadFromBuffer(pSend, dwTimeStamp);
- DWORD dwImageSize;
- ReadFromBuffer(pSend, dwImageSize);
- bool isNGEN;
- ReadFromBuffer(pSend, isNGEN);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetMetaDataFileInfoFromPEFile(vmPEFile, dwTimeStamp, dwImageSize, isNGEN, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, dwTimeStamp);
- WriteToBuffer(pResult, dwImageSize);
- WriteToBuffer(pResult, isNGEN);
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetMetaDataFileInfoFromPEFile
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool GetILImageInfoFromNgenPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwSize, IStringHolder * pStrFilename)
-void DDUnpack::Unpack_GetILImageInfoFromNgenPEFile(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_PEFile vmPEFile;
- ReadFromBuffer(pSend, vmPEFile);
- DWORD dwTimeStamp;
- ReadFromBuffer(pSend, dwTimeStamp);
- DWORD dwSize;
- ReadFromBuffer(pSend, dwSize);
- StringCopyHolder _pStrFilename; // storage
- StringCopyHolder* pStrFilename = &_pStrFilename;
- // pStrFilename does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetILImageInfoFromNgenPEFile(vmPEFile, dwTimeStamp, dwSize, pStrFilename); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, dwTimeStamp);
- WriteToBuffer(pResult, dwSize);
- WriteToBuffer(pResult, pStrFilename);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetILImageInfoFromNgenPEFile
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool IsThreadSuspendedOrHijacked(VMPTR_Thread vmThread)
-void DDUnpack::Unpack_IsThreadSuspendedOrHijacked(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- VMPTR_Thread vmThread;
- ReadFromBuffer(pSend, vmThread);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsThreadSuspendedOrHijacked(vmThread); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsThreadSuspendedOrHijacked
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool AreGCStructuresValid()
-void DDUnpack::Unpack_AreGCStructuresValid(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->AreGCStructuresValid(); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method AreGCStructuresValid
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT CreateHeapWalk(HeapWalkHandle * pHandle)
-void DDUnpack::Unpack_CreateHeapWalk(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- HeapWalkHandle _pHandle; // storage
- HeapWalkHandle * pHandle = &_pHandle;
- // pHandle does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->CreateHeapWalk(pHandle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pHandle);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method CreateHeapWalk
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void DeleteHeapWalk(HeapWalkHandle handle)
-void DDUnpack::Unpack_DeleteHeapWalk(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- HeapWalkHandle handle;
- ReadFromBuffer(pSend, handle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->DeleteHeapWalk(handle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method DeleteHeapWalk
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT WalkHeap(HeapWalkHandle handle, ULONG count, COR_HEAPOBJECT * objects, ULONG * pFetched)
-void DDUnpack::Unpack_WalkHeap(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- HeapWalkHandle handle;
- ReadFromBuffer(pSend, handle);
- ULONG count;
- ReadFromBuffer(pSend, count);
- COR_HEAPOBJECT _objects; // storage
- COR_HEAPOBJECT * objects = &_objects;
- // objects does not need to be copied on input
- ULONG _pFetched; // storage
- ULONG * pFetched = &_pFetched;
- // pFetched does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->WalkHeap(handle, count, objects, pFetched); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, objects);
- WriteToBuffer(pResult, pFetched);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method WalkHeap
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT GetHeapSegments(DacDbiArrayList<COR_SEGMENT> * pSegments)
-void DDUnpack::Unpack_GetHeapSegments(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- DacDbiArrayList<COR_SEGMENT> _pSegments; // storage
- DacDbiArrayList<COR_SEGMENT> * pSegments = &_pSegments;
- // pSegments does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetHeapSegments(pSegments); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pSegments);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetHeapSegments
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool IsValidObject(CORDB_ADDRESS obj)
-void DDUnpack::Unpack_IsValidObject(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS obj;
- ReadFromBuffer(pSend, obj);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->IsValidObject(obj); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method IsValidObject
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// bool GetAppDomainForObject(CORDB_ADDRESS obj, VMPTR_AppDomain * pApp, VMPTR_Module * pModule, VMPTR_DomainFile * pDomainFile)
-void DDUnpack::Unpack_GetAppDomainForObject(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS obj;
- ReadFromBuffer(pSend, obj);
- VMPTR_AppDomain _pApp; // storage
- VMPTR_AppDomain * pApp = &_pApp;
- // pApp does not need to be copied on input
- VMPTR_Module _pModule; // storage
- VMPTR_Module * pModule = &_pModule;
- // pModule does not need to be copied on input
- VMPTR_DomainFile _pDomainFile; // storage
- VMPTR_DomainFile * pDomainFile = &_pDomainFile;
- // pDomainFile does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- bool _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetAppDomainForObject(obj, pApp, pModule, pDomainFile); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pApp);
- WriteToBuffer(pResult, pModule);
- WriteToBuffer(pResult, pDomainFile);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetAppDomainForObject
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT CreateRefWalk(RefWalkHandle * pHandle, BOOL walkStacks, BOOL walkFQ, UINT32 handleWalkMask)
-void DDUnpack::Unpack_CreateRefWalk(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- RefWalkHandle _pHandle; // storage
- RefWalkHandle * pHandle = &_pHandle;
- // pHandle does not need to be copied on input
- BOOL walkStacks;
- ReadFromBuffer(pSend, walkStacks);
- BOOL walkFQ;
- ReadFromBuffer(pSend, walkFQ);
- UINT32 handleWalkMask;
- ReadFromBuffer(pSend, handleWalkMask);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->CreateRefWalk(pHandle, walkStacks, walkFQ, handleWalkMask); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pHandle);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method CreateRefWalk
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void DeleteRefWalk(RefWalkHandle handle)
-void DDUnpack::Unpack_DeleteRefWalk(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- RefWalkHandle handle;
- ReadFromBuffer(pSend, handle);
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->DeleteRefWalk(handle); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method DeleteRefWalk
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT WalkRefs(RefWalkHandle handle, ULONG count, DacGcReference * refs, ULONG * pFetched)
-void DDUnpack::Unpack_WalkRefs(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- RefWalkHandle handle;
- ReadFromBuffer(pSend, handle);
- ULONG count;
- ReadFromBuffer(pSend, count);
- DacGcReference _refs; // storage
- DacGcReference * refs = &_refs;
- // refs does not need to be copied on input
- ULONG _pFetched; // storage
- ULONG * pFetched = &_pFetched;
- // pFetched does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->WalkRefs(handle, count, refs, pFetched); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, refs);
- WriteToBuffer(pResult, pFetched);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method WalkRefs
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT GetTypeID(CORDB_ADDRESS obj, COR_TYPEID * pType)
-void DDUnpack::Unpack_GetTypeID(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- CORDB_ADDRESS obj;
- ReadFromBuffer(pSend, obj);
- COR_TYPEID _pType; // storage
- COR_TYPEID * pType = &_pType;
- ReadFromBuffer(pSend, &_pType); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetTypeID(obj, pType); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pType);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetTypeID
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT GetObjectFields(COR_TYPEID id, ULONG32 celt, COR_FIELD * layout, ULONG32 * pceltFetched)
-void DDUnpack::Unpack_GetObjectFields(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- COR_TYPEID id;
- ReadFromBuffer(pSend, id);
- ULONG32 celt;
- ReadFromBuffer(pSend, celt);
- COR_FIELD _layout; // storage
- COR_FIELD * layout = &_layout;
- // layout does not need to be copied on input
- ULONG32 _pceltFetched; // storage
- ULONG32 * pceltFetched = &_pceltFetched;
- // pceltFetched does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetObjectFields(id, celt, layout, pceltFetched); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, layout);
- WriteToBuffer(pResult, pceltFetched);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetObjectFields
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT GetTypeLayout(COR_TYPEID id, COR_TYPE_LAYOUT * pLayout)
-void DDUnpack::Unpack_GetTypeLayout(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- COR_TYPEID id;
- ReadFromBuffer(pSend, id);
- COR_TYPE_LAYOUT _pLayout; // storage
- COR_TYPE_LAYOUT * pLayout = &_pLayout;
- ReadFromBuffer(pSend, &_pLayout); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetTypeLayout(id, pLayout); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pLayout);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetTypeLayout
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// HRESULT GetArrayLayout(COR_TYPEID id, COR_ARRAY_LAYOUT * pLayout)
-void DDUnpack::Unpack_GetArrayLayout(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- COR_TYPEID id;
- ReadFromBuffer(pSend, id);
- COR_ARRAY_LAYOUT _pLayout; // storage
- COR_ARRAY_LAYOUT * pLayout = &_pLayout;
- ReadFromBuffer(pSend, &_pLayout); // serialize to storage
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
- HRESULT _retValue; // return result
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- _retValue = m_pReal->GetArrayLayout(id, pLayout); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pLayout);
- WriteToBuffer(pResult, hr); // exception result
- WriteToBuffer(pResult, _retValue); // copy back return result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetArrayLayout
-
-//---------------------------------------------------------------------
-// Unpacking stub for:
-// void GetGCHeapInformation(COR_HEAPINFO * pHeapInfo)
-void DDUnpack::Unpack_GetGCHeapInformation(ReadBuffer * pSend, WriteBuffer * pResult)
-{
-
- // Parameters
- COR_HEAPINFO _pHeapInfo; // storage
- COR_HEAPINFO * pHeapInfo = &_pHeapInfo;
- // pHeapInfo does not need to be copied on input
- _ASSERTE(pSend->IsAtEnd()); // ensure entire buffer is read
-
- //
- // Make the actual call
- //
- HRESULT hr = S_OK;
- EX_TRY
- {
- m_pReal->GetGCHeapInformation(pHeapInfo); // actual call
-
- }
- EX_CATCH_HRESULT(hr);
- // Marshal parameters back
- WriteToBuffer(pResult, pHeapInfo);
- WriteToBuffer(pResult, hr); // exception result
- // Dtors for any DacDbi structures that we marshalled get run here.
-} // end method GetGCHeapInformation
-
-
-//
-// Handler
-//
-void DDUnpack::HandleDDMessage(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- DD_MessageId id;
- ReadFromBuffer(pSend, id);
-
- switch(id)
- {
-
- case DDID_CheckDbiVersion:
- Unpack_CheckDbiVersion(pSend, pResult);
- break;
-
- case DDID_GetLocalInterfaceHashAndTimestamp:
- Unpack_GetLocalInterfaceHashAndTimestamp(pSend, pResult);
- break;
-
- case DDID_GetRemoteInterfaceHashAndTimestamp:
- Unpack_GetRemoteInterfaceHashAndTimestamp(pSend, pResult);
- break;
-
- case DDID_FlushCache:
- Unpack_FlushCache(pSend, pResult);
- break;
-
- case DDID_DacSetTargetConsistencyChecks:
- Unpack_DacSetTargetConsistencyChecks(pSend, pResult);
- break;
-
- case DDID_Destroy:
- Unpack_Destroy(pSend, pResult);
- break;
-
- case DDID_IsLeftSideInitialized:
- Unpack_IsLeftSideInitialized(pSend, pResult);
- break;
-
- case DDID_GetAppDomainFromId:
- Unpack_GetAppDomainFromId(pSend, pResult);
- break;
-
- case DDID_GetAppDomainId:
- Unpack_GetAppDomainId(pSend, pResult);
- break;
-
- case DDID_GetAppDomainObject:
- Unpack_GetAppDomainObject(pSend, pResult);
- break;
-
- case DDID_IsDefaultDomain:
- Unpack_IsDefaultDomain(pSend, pResult);
- break;
-
- case DDID_GetAssemblyFromDomainAssembly:
- Unpack_GetAssemblyFromDomainAssembly(pSend, pResult);
- break;
-
- case DDID_IsAssemblyFullyTrusted:
- Unpack_IsAssemblyFullyTrusted(pSend, pResult);
- break;
-
- case DDID_GetAppDomainFullName:
- Unpack_GetAppDomainFullName(pSend, pResult);
- break;
-
- case DDID_GetModuleSimpleName:
- Unpack_GetModuleSimpleName(pSend, pResult);
- break;
-
- case DDID_GetAssemblyPath:
- Unpack_GetAssemblyPath(pSend, pResult);
- break;
-
- case DDID_ResolveTypeReference:
- Unpack_ResolveTypeReference(pSend, pResult);
- break;
-
- case DDID_GetModulePath:
- Unpack_GetModulePath(pSend, pResult);
- break;
-
- case DDID_GetModuleNGenPath:
- Unpack_GetModuleNGenPath(pSend, pResult);
- break;
-
- case DDID_GetMetadata:
- Unpack_GetMetadata(pSend, pResult);
- break;
-
- case DDID_GetSymbolsBuffer:
- Unpack_GetSymbolsBuffer(pSend, pResult);
- break;
-
- case DDID_GetModuleData:
- Unpack_GetModuleData(pSend, pResult);
- break;
-
- case DDID_GetDomainFileData:
- Unpack_GetDomainFileData(pSend, pResult);
- break;
-
- case DDID_GetModuleForDomainFile:
- Unpack_GetModuleForDomainFile(pSend, pResult);
- break;
-
- case DDID_GetAddressType:
- Unpack_GetAddressType(pSend, pResult);
- break;
-
- case DDID_IsTransitionStub:
- Unpack_IsTransitionStub(pSend, pResult);
- break;
-
- case DDID_GetCompilerFlags:
- Unpack_GetCompilerFlags(pSend, pResult);
- break;
-
- case DDID_SetCompilerFlags:
- Unpack_SetCompilerFlags(pSend, pResult);
- break;
-
- case DDID_EnumerateAppDomains:
- Unpack_EnumerateAppDomains(pSend, pResult);
- break;
-
- case DDID_EnumerateAssembliesInAppDomain:
- Unpack_EnumerateAssembliesInAppDomain(pSend, pResult);
- break;
-
- case DDID_EnumerateModulesInAssembly:
- Unpack_EnumerateModulesInAssembly(pSend, pResult);
- break;
-
- case DDID_RequestSyncAtEvent:
- Unpack_RequestSyncAtEvent(pSend, pResult);
- break;
-
- case DDID_MarkDebuggerAttachPending:
- Unpack_MarkDebuggerAttachPending(pSend, pResult);
- break;
-
- case DDID_MarkDebuggerAttached:
- Unpack_MarkDebuggerAttached(pSend, pResult);
- break;
-
- case DDID_Hijack:
- Unpack_Hijack(pSend, pResult);
- break;
-
- case DDID_EnumerateConnections:
- Unpack_EnumerateConnections(pSend, pResult);
- break;
-
- case DDID_EnumerateThreads:
- Unpack_EnumerateThreads(pSend, pResult);
- break;
-
- case DDID_IsThreadMarkedDead:
- Unpack_IsThreadMarkedDead(pSend, pResult);
- break;
-
- case DDID_GetThreadHandle:
- Unpack_GetThreadHandle(pSend, pResult);
- break;
-
- case DDID_GetThreadObject:
- Unpack_GetThreadObject(pSend, pResult);
- break;
-
- case DDID_SetDebugState:
- Unpack_SetDebugState(pSend, pResult);
- break;
-
- case DDID_HasUnhandledException:
- Unpack_HasUnhandledException(pSend, pResult);
- break;
-
- case DDID_GetUserState:
- Unpack_GetUserState(pSend, pResult);
- break;
-
- case DDID_GetConnectionID:
- Unpack_GetConnectionID(pSend, pResult);
- break;
-
- case DDID_GetTaskID:
- Unpack_GetTaskID(pSend, pResult);
- break;
-
- case DDID_TryGetVolatileOSThreadID:
- Unpack_TryGetVolatileOSThreadID(pSend, pResult);
- break;
-
- case DDID_GetUniqueThreadID:
- Unpack_GetUniqueThreadID(pSend, pResult);
- break;
-
- case DDID_GetCurrentException:
- Unpack_GetCurrentException(pSend, pResult);
- break;
-
- case DDID_GetCurrentCustomDebuggerNotification:
- Unpack_GetCurrentCustomDebuggerNotification(pSend, pResult);
- break;
-
- case DDID_GetCurrentAppDomain:
- Unpack_GetCurrentAppDomain(pSend, pResult);
- break;
-
- case DDID_ResolveAssembly:
- Unpack_ResolveAssembly(pSend, pResult);
- break;
-
- case DDID_GetNativeCodeSequencePointsAndVarInfo:
- Unpack_GetNativeCodeSequencePointsAndVarInfo(pSend, pResult);
- break;
-
- case DDID_GetManagedStoppedContext:
- Unpack_GetManagedStoppedContext(pSend, pResult);
- break;
-
- case DDID_CreateStackWalk:
- Unpack_CreateStackWalk(pSend, pResult);
- break;
-
- case DDID_DeleteStackWalk:
- Unpack_DeleteStackWalk(pSend, pResult);
- break;
-
- case DDID_GetStackWalkCurrentContext:
- Unpack_GetStackWalkCurrentContext(pSend, pResult);
- break;
-
- case DDID_SetStackWalkCurrentContext:
- Unpack_SetStackWalkCurrentContext(pSend, pResult);
- break;
-
- case DDID_UnwindStackWalkFrame:
- Unpack_UnwindStackWalkFrame(pSend, pResult);
- break;
-
- case DDID_CheckContext:
- Unpack_CheckContext(pSend, pResult);
- break;
-
- case DDID_GetStackWalkCurrentFrameInfo:
- Unpack_GetStackWalkCurrentFrameInfo(pSend, pResult);
- break;
-
- case DDID_GetCountOfInternalFrames:
- Unpack_GetCountOfInternalFrames(pSend, pResult);
- break;
-
- case DDID_EnumerateInternalFrames:
- Unpack_EnumerateInternalFrames(pSend, pResult);
- break;
-
- case DDID_IsMatchingParentFrame:
- Unpack_IsMatchingParentFrame(pSend, pResult);
- break;
-
- case DDID_GetStackParameterSize:
- Unpack_GetStackParameterSize(pSend, pResult);
- break;
-
- case DDID_GetFramePointer:
- Unpack_GetFramePointer(pSend, pResult);
- break;
-
- case DDID_IsLeafFrame:
- Unpack_IsLeafFrame(pSend, pResult);
- break;
-
- case DDID_GetContext:
- Unpack_GetContext(pSend, pResult);
- break;
-
- case DDID_ConvertContextToDebuggerRegDisplay:
- Unpack_ConvertContextToDebuggerRegDisplay(pSend, pResult);
- break;
-
- case DDID_IsILStubOrLCGMethod:
- Unpack_IsILStubOrLCGMethod(pSend, pResult);
- break;
-
- case DDID_GetVarArgSig:
- Unpack_GetVarArgSig(pSend, pResult);
- break;
-
- case DDID_RequiresAlign8:
- Unpack_RequiresAlign8(pSend, pResult);
- break;
-
- case DDID_ResolveExactGenericArgsToken:
- Unpack_ResolveExactGenericArgsToken(pSend, pResult);
- break;
-
- case DDID_GetILCodeAndSig:
- Unpack_GetILCodeAndSig(pSend, pResult);
- break;
-
- case DDID_GetNativeCodeInfo:
- Unpack_GetNativeCodeInfo(pSend, pResult);
- break;
-
- case DDID_GetNativeCodeInfoForAddr:
- Unpack_GetNativeCodeInfoForAddr(pSend, pResult);
- break;
-
- case DDID_GetClassInfo:
- Unpack_GetClassInfo(pSend, pResult);
- break;
-
- case DDID_GetInstantiationFieldInfo:
- Unpack_GetInstantiationFieldInfo(pSend, pResult);
- break;
-
- case DDID_TypeHandleToExpandedTypeInfo:
- Unpack_TypeHandleToExpandedTypeInfo(pSend, pResult);
- break;
-
- case DDID_GetObjectExpandedTypeInfo:
- Unpack_GetObjectExpandedTypeInfo(pSend, pResult);
- break;
-
- case DDID_GetObjectExpandedTypeInfoFromID:
- Unpack_GetObjectExpandedTypeInfoFromID(pSend, pResult);
- break;
-
- case DDID_GetApproxTypeHandle:
- Unpack_GetApproxTypeHandle(pSend, pResult);
- break;
-
- case DDID_GetExactTypeHandle:
- Unpack_GetExactTypeHandle(pSend, pResult);
- break;
-
- case DDID_GetMethodDescParams:
- Unpack_GetMethodDescParams(pSend, pResult);
- break;
-
- case DDID_GetThreadOrContextStaticAddress:
- Unpack_GetThreadOrContextStaticAddress(pSend, pResult);
- break;
-
- case DDID_GetCollectibleTypeStaticAddress:
- Unpack_GetCollectibleTypeStaticAddress(pSend, pResult);
- break;
-
- case DDID_GetEnCHangingFieldInfo:
- Unpack_GetEnCHangingFieldInfo(pSend, pResult);
- break;
-
- case DDID_GetTypeHandleParams:
- Unpack_GetTypeHandleParams(pSend, pResult);
- break;
-
- case DDID_GetSimpleType:
- Unpack_GetSimpleType(pSend, pResult);
- break;
-
- case DDID_IsExceptionObject:
- Unpack_IsExceptionObject(pSend, pResult);
- break;
-
- case DDID_GetStackFramesFromException:
- Unpack_GetStackFramesFromException(pSend, pResult);
- break;
-
- case DDID_IsRcw:
- Unpack_IsRcw(pSend, pResult);
- break;
-
- case DDID_GetRcwCachedInterfaceTypes:
- Unpack_GetRcwCachedInterfaceTypes(pSend, pResult);
- break;
-
- case DDID_GetRcwCachedInterfacePointers:
- Unpack_GetRcwCachedInterfacePointers(pSend, pResult);
- break;
-
- case DDID_GetCachedWinRTTypesForIIDs:
- Unpack_GetCachedWinRTTypesForIIDs(pSend, pResult);
- break;
-
- case DDID_GetCachedWinRTTypes:
- Unpack_GetCachedWinRTTypes(pSend, pResult);
- break;
-
- case DDID_GetTypedByRefInfo:
- Unpack_GetTypedByRefInfo(pSend, pResult);
- break;
-
- case DDID_GetStringData:
- Unpack_GetStringData(pSend, pResult);
- break;
-
- case DDID_GetArrayData:
- Unpack_GetArrayData(pSend, pResult);
- break;
-
- case DDID_GetBasicObjectInfo:
- Unpack_GetBasicObjectInfo(pSend, pResult);
- break;
-
- case DDID_TestCrst:
- Unpack_TestCrst(pSend, pResult);
- break;
-
- case DDID_TestRWLock:
- Unpack_TestRWLock(pSend, pResult);
- break;
-
- case DDID_GetDebuggerControlBlockAddress:
- Unpack_GetDebuggerControlBlockAddress(pSend, pResult);
- break;
-
- case DDID_GetObjectFromRefPtr:
- Unpack_GetObjectFromRefPtr(pSend, pResult);
- break;
-
- case DDID_GetObject:
- Unpack_GetObject(pSend, pResult);
- break;
-
- case DDID_EnableNGENPolicy:
- Unpack_EnableNGENPolicy(pSend, pResult);
- break;
-
- case DDID_GetVmObjectHandle:
- Unpack_GetVmObjectHandle(pSend, pResult);
- break;
-
- case DDID_IsVmObjectHandleValid:
- Unpack_IsVmObjectHandleValid(pSend, pResult);
- break;
-
- case DDID_IsWinRTModule:
- Unpack_IsWinRTModule(pSend, pResult);
- break;
-
- case DDID_GetAppDomainIdFromVmObjectHandle:
- Unpack_GetAppDomainIdFromVmObjectHandle(pSend, pResult);
- break;
-
- case DDID_GetHandleAddressFromVmHandle:
- Unpack_GetHandleAddressFromVmHandle(pSend, pResult);
- break;
-
- case DDID_GetObjectContents:
- Unpack_GetObjectContents(pSend, pResult);
- break;
-
- case DDID_EnumerateBlockingObjects:
- Unpack_EnumerateBlockingObjects(pSend, pResult);
- break;
-
- case DDID_GetThreadOwningMonitorLock:
- Unpack_GetThreadOwningMonitorLock(pSend, pResult);
- break;
-
- case DDID_EnumerateMonitorEventWaitList:
- Unpack_EnumerateMonitorEventWaitList(pSend, pResult);
- break;
-
- case DDID_GetAttachStateFlags:
- Unpack_GetAttachStateFlags(pSend, pResult);
- break;
-
- case DDID_GetMetaDataFileInfoFromPEFile:
- Unpack_GetMetaDataFileInfoFromPEFile(pSend, pResult);
- break;
-
- case DDID_GetILImageInfoFromNgenPEFile:
- Unpack_GetILImageInfoFromNgenPEFile(pSend, pResult);
- break;
-
- case DDID_IsThreadSuspendedOrHijacked:
- Unpack_IsThreadSuspendedOrHijacked(pSend, pResult);
- break;
-
- case DDID_AreGCStructuresValid:
- Unpack_AreGCStructuresValid(pSend, pResult);
- break;
-
- case DDID_CreateHeapWalk:
- Unpack_CreateHeapWalk(pSend, pResult);
- break;
-
- case DDID_DeleteHeapWalk:
- Unpack_DeleteHeapWalk(pSend, pResult);
- break;
-
- case DDID_WalkHeap:
- Unpack_WalkHeap(pSend, pResult);
- break;
-
- case DDID_GetHeapSegments:
- Unpack_GetHeapSegments(pSend, pResult);
- break;
-
- case DDID_IsValidObject:
- Unpack_IsValidObject(pSend, pResult);
- break;
-
- case DDID_GetAppDomainForObject:
- Unpack_GetAppDomainForObject(pSend, pResult);
- break;
-
- case DDID_CreateRefWalk:
- Unpack_CreateRefWalk(pSend, pResult);
- break;
-
- case DDID_DeleteRefWalk:
- Unpack_DeleteRefWalk(pSend, pResult);
- break;
-
- case DDID_WalkRefs:
- Unpack_WalkRefs(pSend, pResult);
- break;
-
- case DDID_GetTypeID:
- Unpack_GetTypeID(pSend, pResult);
- break;
-
- case DDID_GetObjectFields:
- Unpack_GetObjectFields(pSend, pResult);
- break;
-
- case DDID_GetTypeLayout:
- Unpack_GetTypeLayout(pSend, pResult);
- break;
-
- case DDID_GetArrayLayout:
- Unpack_GetArrayLayout(pSend, pResult);
- break;
-
- case DDID_GetGCHeapInformation:
- Unpack_GetGCHeapInformation(pSend, pResult);
- break;
-
-
- } // end switch
-} // end HandleDDMessage method
-
-#endif //FEATURE_DBGIPC_TRANSPORT_VM
-
-// end of file
diff --git a/src/debug/ee/ddunpack.h b/src/debug/ee/ddunpack.h
deleted file mode 100644
index 23be521642..0000000000
--- a/src/debug/ee/ddunpack.h
+++ /dev/null
@@ -1,498 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-// Unpacker
-//
-// Lives on EE side of the fence
-//
-// Note that this file is generated by ndp\clr\src\Debug\tools\BuildDDMarshal\.
-// Changes should be made to output\DDUnpack_template.h in that directory.
-//
-
-
-#ifndef _DDUNPACK_H_
-#define _DDUNPACK_H_
-
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
-
-#include "ddmarshalutil.h"
-#include "ddshared.h"
-
-
-// This technique is now misnamed, but I am still using it to lower code churn.
-// When handing memory back and forth between DAC and DBI we use this (forDbi) new variant
-// to ensure that everything goes in the correct heap. In DBI it resolves to new, and in DAC
-// it resolves to calling into a special allocator that DBI passed over that ultimately also
-// calls DBI new. A few types such as DacDbiArrayList get included on both sides of the DLL
-// boundary and they assume there will be a (forDbi) new variant available to them.
-//
-// Now however we have a new in-proc consumer of DAC and again we need to pass memory blocks
-// to it. The most straightforward technique is to consume DAC exactly how DBI does, thus mimicing
-// DBI's new variant here so that all the types which straddle the boundary can continue using
-// it. At some point we might want to change the naming to something more general... 'forDacCaller'
-// perhaps. I don't consider the technique a workaround, just the naming is overly specific.
-
-#define forDbi (*(forDbiWorker *)NULL)
-
-// for dbi we just default to new, but we need to have these defined for both dac and dbi
-inline void * operator new(size_t lenBytes, const forDbiWorker &)
-{
- void * result = new BYTE[lenBytes];
- if (result == NULL)
- {
- ThrowOutOfMemory();
- }
- return result;
-}
-
-inline void * operator new[](size_t lenBytes, const forDbiWorker &)
-{
- void * result = new BYTE[lenBytes];
- if (result == NULL)
- {
- ThrowOutOfMemory();
- }
- return result;
-}
-
-// Helper to delete memory used with the IDacDbiInterface::IAllocator interface.
-template<class T> inline
-void DeleteDbiMemory(T *p)
-{
- delete p;
-}
-
-
-// Header for unpacking
-//
-class DDUnpack
- {
- protected:
- IDacDbiInterface * m_pReal;
- IDacDbiInterface::IAllocator * m_pAllocator;
- public:
- DDUnpack(IDacDbiInterface * pReal, IDacDbiInterface::IAllocator * pAllocator)
- {
- m_pReal = pReal;
- m_pAllocator = pAllocator;
- }
-
- // Main entry point
- // This will then delegate to the proper unpacking stubs.
- void HandleDDMessage(ReadBuffer * pSend, WriteBuffer * pResult);
-
-
- //
- // Stubs
- //
-
-//---------------------------------------------------------------------
-// Unpacking stubs
- // HRESULT CheckDbiVersion(const DbiVersion * pVersion)
- void Unpack_CheckDbiVersion(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetLocalInterfaceHashAndTimestamp(DWORD & hash1, DWORD & hash2, DWORD & hash3, DWORD & hash4, DWORD & timestamp1, DWORD & timestamp2)
- void Unpack_GetLocalInterfaceHashAndTimestamp(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetRemoteInterfaceHashAndTimestamp(DWORD & hash1, DWORD & hash2, DWORD & hash3, DWORD & hash4, DWORD & timestamp1, DWORD & timestamp2)
- void Unpack_GetRemoteInterfaceHashAndTimestamp(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT FlushCache()
- void Unpack_FlushCache(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void DacSetTargetConsistencyChecks(bool fEnableAsserts)
- void Unpack_DacSetTargetConsistencyChecks(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void Destroy()
- void Unpack_Destroy(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsLeftSideInitialized()
- void Unpack_IsLeftSideInitialized(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_AppDomain GetAppDomainFromId(ULONG appdomainId)
- void Unpack_GetAppDomainFromId(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // ULONG GetAppDomainId(VMPTR_AppDomain vmAppDomain)
- void Unpack_GetAppDomainId(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_OBJECTHANDLE GetAppDomainObject(VMPTR_AppDomain vmAppDomain)
- void Unpack_GetAppDomainObject(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsDefaultDomain(VMPTR_AppDomain vmAppDomain)
- void Unpack_IsDefaultDomain(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetAssemblyFromDomainAssembly(VMPTR_DomainAssembly vmDomainAssembly, VMPTR_Assembly * vmAssembly)
- void Unpack_GetAssemblyFromDomainAssembly(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsAssemblyFullyTrusted(VMPTR_DomainAssembly vmDomainAssembly)
- void Unpack_IsAssemblyFullyTrusted(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetAppDomainFullName(VMPTR_AppDomain vmAppDomain, IStringHolder * pStrName)
- void Unpack_GetAppDomainFullName(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetModuleSimpleName(VMPTR_Module vmModule, IStringHolder * pStrFilename)
- void Unpack_GetModuleSimpleName(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL GetAssemblyPath(VMPTR_Assembly vmAssembly, IStringHolder * pStrFilename)
- void Unpack_GetAssemblyPath(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void ResolveTypeReference(const TypeRefData * pTypeRefInfo, TypeRefData * pTargetRefInfo)
- void Unpack_ResolveTypeReference(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL GetModulePath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
- void Unpack_GetModulePath(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL GetModuleNGenPath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
- void Unpack_GetModuleNGenPath(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetMetadata(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer)
- void Unpack_GetMetadata(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetSymbolsBuffer(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer, IDacDbiInterface::SymbolFormat * pSymbolFormat)
- void Unpack_GetSymbolsBuffer(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetModuleData(VMPTR_Module vmModule, ModuleInfo * pData)
- void Unpack_GetModuleData(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetDomainFileData(VMPTR_DomainFile vmDomainFile, DomainFileInfo * pData)
- void Unpack_GetDomainFileData(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetModuleForDomainFile(VMPTR_DomainFile vmDomainFile, VMPTR_Module * pModule)
- void Unpack_GetModuleForDomainFile(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // IDacDbiInterface::AddressType GetAddressType(CORDB_ADDRESS address)
- void Unpack_GetAddressType(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsTransitionStub(CORDB_ADDRESS address)
- void Unpack_IsTransitionStub(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL * pfAllowJITOpts, BOOL * pfEnableEnC)
- void Unpack_GetCompilerFlags(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT SetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL fAllowJitOpts, BOOL fEnableEnC)
- void Unpack_SetCompilerFlags(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateAppDomains(IDacDbiInterface::FP_APPDOMAIN_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateAppDomains(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateAssembliesInAppDomain(VMPTR_AppDomain vmAppDomain, IDacDbiInterface::FP_ASSEMBLY_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateAssembliesInAppDomain(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateModulesInAssembly(VMPTR_DomainAssembly vmAssembly, IDacDbiInterface::FP_MODULE_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateModulesInAssembly(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void RequestSyncAtEvent()
- void Unpack_RequestSyncAtEvent(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void MarkDebuggerAttachPending()
- void Unpack_MarkDebuggerAttachPending(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void MarkDebuggerAttached(BOOL fAttached)
- void Unpack_MarkDebuggerAttached(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void Hijack(VMPTR_Thread vmThread, ULONG32 dwThreadId, const EXCEPTION_RECORD * pRecord, T_CONTEXT * pOriginalContext, ULONG32 cbSizeContext, EHijackReason::EHijackReason reason, void * pUserData, CORDB_ADDRESS * pRemoteContextAddr)
- void Unpack_Hijack(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateConnections(IDacDbiInterface::FP_CONNECTION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateConnections(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateThreads(IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateThreads(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool IsThreadMarkedDead(VMPTR_Thread vmThread)
- void Unpack_IsThreadMarkedDead(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HANDLE GetThreadHandle(VMPTR_Thread vmThread)
- void Unpack_GetThreadHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_OBJECTHANDLE GetThreadObject(VMPTR_Thread vmThread)
- void Unpack_GetThreadObject(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void SetDebugState(VMPTR_Thread vmThread, CorDebugThreadState debugState)
- void Unpack_SetDebugState(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL HasUnhandledException(VMPTR_Thread vmThread)
- void Unpack_HasUnhandledException(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CorDebugUserState GetUserState(VMPTR_Thread vmThread)
- void Unpack_GetUserState(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CONNID GetConnectionID(VMPTR_Thread vmThread)
- void Unpack_GetConnectionID(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // TASKID GetTaskID(VMPTR_Thread vmThread)
- void Unpack_GetTaskID(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // DWORD TryGetVolatileOSThreadID(VMPTR_Thread vmThread)
- void Unpack_TryGetVolatileOSThreadID(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // DWORD GetUniqueThreadID(VMPTR_Thread vmThread)
- void Unpack_GetUniqueThreadID(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_OBJECTHANDLE GetCurrentException(VMPTR_Thread vmThread)
- void Unpack_GetCurrentException(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_OBJECTHANDLE GetCurrentCustomDebuggerNotification(VMPTR_Thread vmThread)
- void Unpack_GetCurrentCustomDebuggerNotification(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_AppDomain GetCurrentAppDomain(VMPTR_Thread vmThread)
- void Unpack_GetCurrentAppDomain(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_DomainAssembly ResolveAssembly(VMPTR_DomainFile vmScope, mdToken tkAssemblyRef)
- void Unpack_ResolveAssembly(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetNativeCodeSequencePointsAndVarInfo(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS startAddress, BOOL fCodeAvailabe, NativeVarData * pNativeVarData, SequencePoints * pSequencePoints)
- void Unpack_GetNativeCodeSequencePointsAndVarInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_CONTEXT GetManagedStoppedContext(VMPTR_Thread vmThread)
- void Unpack_GetManagedStoppedContext(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void CreateStackWalk(VMPTR_Thread vmThread, DT_CONTEXT * pInternalContextBuffer, StackWalkHandle * ppSFIHandle)
- void Unpack_CreateStackWalk(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void DeleteStackWalk(StackWalkHandle ppSFIHandle)
- void Unpack_DeleteStackWalk(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetStackWalkCurrentContext(StackWalkHandle pSFIHandle, DT_CONTEXT * pContext)
- void Unpack_GetStackWalkCurrentContext(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void SetStackWalkCurrentContext(VMPTR_Thread vmThread, StackWalkHandle pSFIHandle, CorDebugSetContextFlag flag, DT_CONTEXT * pContext)
- void Unpack_SetStackWalkCurrentContext(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL UnwindStackWalkFrame(StackWalkHandle pSFIHandle)
- void Unpack_UnwindStackWalkFrame(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT CheckContext(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
- void Unpack_CheckContext(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // IDacDbiInterface::FrameType GetStackWalkCurrentFrameInfo(StackWalkHandle pSFIHandle, DebuggerIPCE_STRData * pFrameData)
- void Unpack_GetStackWalkCurrentFrameInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // ULONG32 GetCountOfInternalFrames(VMPTR_Thread vmThread)
- void Unpack_GetCountOfInternalFrames(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateInternalFrames(VMPTR_Thread vmThread, IDacDbiInterface::FP_INTERNAL_FRAME_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateInternalFrames(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsMatchingParentFrame(FramePointer fpToCheck, FramePointer fpParent)
- void Unpack_IsMatchingParentFrame(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // ULONG32 GetStackParameterSize(CORDB_ADDRESS controlPC)
- void Unpack_GetStackParameterSize(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // FramePointer GetFramePointer(StackWalkHandle pSFIHandle)
- void Unpack_GetFramePointer(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsLeafFrame(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
- void Unpack_IsLeafFrame(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetContext(VMPTR_Thread vmThread, DT_CONTEXT * pContextBuffer)
- void Unpack_GetContext(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void ConvertContextToDebuggerRegDisplay(const DT_CONTEXT * pInContext, DebuggerREGDISPLAY * pOutDRD, BOOL fActive)
- void Unpack_ConvertContextToDebuggerRegDisplay(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // IDacDbiInterface::DynamicMethodType IsILStubOrLCGMethod(VMPTR_MethodDesc vmMethodDesc)
- void Unpack_IsILStubOrLCGMethod(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // TargetBuffer GetVarArgSig(CORDB_ADDRESS VASigCookieAddr, CORDB_ADDRESS * pArgBase)
- void Unpack_GetVarArgSig(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL RequiresAlign8(VMPTR_TypeHandle thExact)
- void Unpack_RequiresAlign8(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // GENERICS_TYPE_TOKEN ResolveExactGenericArgsToken(DWORD dwExactGenericArgsTokenIndex, GENERICS_TYPE_TOKEN rawToken)
- void Unpack_ResolveExactGenericArgsToken(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetILCodeAndSig(VMPTR_DomainFile vmDomainFile, mdToken functionToken, TargetBuffer * pCodeInfo, mdToken * pLocalSigToken)
- void Unpack_GetILCodeAndSig(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetNativeCodeInfo(VMPTR_DomainFile vmDomainFile, mdToken functionToken, NativeCodeFunctionData * pCodeInfo)
- void Unpack_GetNativeCodeInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetNativeCodeInfoForAddr(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS hotCodeStartAddr, NativeCodeFunctionData * pCodeInfo)
- void Unpack_GetNativeCodeInfoForAddr(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetClassInfo(VMPTR_AppDomain vmAppDomain, VMPTR_Module vmModule, mdTypeDef metadataToken, VMPTR_TypeHandle thExact, VMPTR_TypeHandle thApprox, ClassInfo * pData)
- void Unpack_GetClassInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetInstantiationFieldInfo(VMPTR_DomainFile vmDomainFile, mdTypeDef metadataToken, VMPTR_TypeHandle vmThExact, VMPTR_TypeHandle vmThApprox, DacDbiArrayList<FieldData> * pFieldList, SIZE_T * pObjectSize)
- void Unpack_GetInstantiationFieldInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void TypeHandleToExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
- void Unpack_TypeHandleToExpandedTypeInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetObjectExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, CORDB_ADDRESS addr, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
- void Unpack_GetObjectExpandedTypeInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetObjectExpandedTypeInfoFromID(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, COR_TYPEID id, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
- void Unpack_GetObjectExpandedTypeInfoFromID(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_TypeHandle GetApproxTypeHandle(TypeInfoList * pTypeData)
- void Unpack_GetApproxTypeHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT GetExactTypeHandle(DebuggerIPCE_ExpandedTypeData * pTypeData, ArgInfoList * pArgInfo, VMPTR_TypeHandle & vmTypeHandle)
- void Unpack_GetExactTypeHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetMethodDescParams(VMPTR_AppDomain vmAppDomain, VMPTR_MethodDesc vmMethodDesc, GENERICS_TYPE_TOKEN genericsToken, UINT32 * pcGenericClassTypeParams, TypeParamsList * pGenericTypeParams)
- void Unpack_GetMethodDescParams(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CORDB_ADDRESS GetThreadOrContextStaticAddress(VMPTR_FieldDesc vmField, VMPTR_Thread vmRuntimeThread)
- void Unpack_GetThreadOrContextStaticAddress(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CORDB_ADDRESS GetCollectibleTypeStaticAddress(VMPTR_FieldDesc vmField, VMPTR_AppDomain vmAppDomain)
- void Unpack_GetCollectibleTypeStaticAddress(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetEnCHangingFieldInfo(const EnCHangingFieldInfo * pEnCFieldInfo, FieldData * pFieldData, BOOL * pfStatic)
- void Unpack_GetEnCHangingFieldInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetTypeHandleParams(VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, TypeParamsList * pParams)
- void Unpack_GetTypeHandleParams(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetSimpleType(VMPTR_AppDomain vmAppDomain, CorElementType simpleType, mdTypeDef * pMetadataToken, VMPTR_Module * pVmModule, VMPTR_DomainFile * pVmDomainFile)
- void Unpack_GetSimpleType(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsExceptionObject(VMPTR_Object vmObject)
- void Unpack_IsExceptionObject(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetStackFramesFromException(VMPTR_Object vmObject, DacDbiArrayList<DacExceptionCallStackData> & dacStackFrames)
- void Unpack_GetStackFramesFromException(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsRcw(VMPTR_Object vmObject)
- void Unpack_IsRcw(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetRcwCachedInterfaceTypes(VMPTR_Object vmObject, VMPTR_AppDomain vmAppDomain, BOOL bIInspectableOnly, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pDacInterfaces)
- void Unpack_GetRcwCachedInterfaceTypes(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetRcwCachedInterfacePointers(VMPTR_Object vmObject, BOOL bIInspectableOnly, DacDbiArrayList<CORDB_ADDRESS> * pDacItfPtrs)
- void Unpack_GetRcwCachedInterfacePointers(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetCachedWinRTTypesForIIDs(VMPTR_AppDomain vmAppDomain, DacDbiArrayList<GUID> & iids, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes)
- void Unpack_GetCachedWinRTTypesForIIDs(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetCachedWinRTTypes(VMPTR_AppDomain vmAppDomain, DacDbiArrayList<GUID> * piids, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes)
- void Unpack_GetCachedWinRTTypes(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetTypedByRefInfo(CORDB_ADDRESS pTypedByRef, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
- void Unpack_GetTypedByRefInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetStringData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
- void Unpack_GetStringData(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetArrayData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
- void Unpack_GetArrayData(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetBasicObjectInfo(CORDB_ADDRESS objectAddress, CorElementType type, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
- void Unpack_GetBasicObjectInfo(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void TestCrst(VMPTR_Crst vmCrst)
- void Unpack_TestCrst(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void TestRWLock(VMPTR_SimpleRWLock vmRWLock)
- void Unpack_TestRWLock(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CORDB_ADDRESS GetDebuggerControlBlockAddress()
- void Unpack_GetDebuggerControlBlockAddress(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_Object GetObjectFromRefPtr(CORDB_ADDRESS ptr)
- void Unpack_GetObjectFromRefPtr(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_Object GetObject(CORDB_ADDRESS ptr)
- void Unpack_GetObject(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT EnableNGENPolicy(CorDebugNGENPolicy ePolicy)
- void Unpack_EnableNGENPolicy(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // VMPTR_OBJECTHANDLE GetVmObjectHandle(CORDB_ADDRESS handleAddress)
- void Unpack_GetVmObjectHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // BOOL IsVmObjectHandleValid(VMPTR_OBJECTHANDLE vmHandle)
- void Unpack_IsVmObjectHandleValid(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT IsWinRTModule(VMPTR_Module vmModule, BOOL & isWinRT)
- void Unpack_IsWinRTModule(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // ULONG GetAppDomainIdFromVmObjectHandle(VMPTR_OBJECTHANDLE vmHandle)
- void Unpack_GetAppDomainIdFromVmObjectHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CORDB_ADDRESS GetHandleAddressFromVmHandle(VMPTR_OBJECTHANDLE vmHandle)
- void Unpack_GetHandleAddressFromVmHandle(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // TargetBuffer GetObjectContents(VMPTR_Object obj)
- void Unpack_GetObjectContents(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateBlockingObjects(VMPTR_Thread vmThread, IDacDbiInterface::FP_BLOCKINGOBJECT_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateBlockingObjects(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // MonitorLockInfo GetThreadOwningMonitorLock(VMPTR_Object vmObject)
- void Unpack_GetThreadOwningMonitorLock(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void EnumerateMonitorEventWaitList(VMPTR_Object vmObject, IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- void Unpack_EnumerateMonitorEventWaitList(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // CLR_DEBUGGING_PROCESS_FLAGS GetAttachStateFlags()
- void Unpack_GetAttachStateFlags(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool GetMetaDataFileInfoFromPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwImageSize, bool & isNGEN, IStringHolder * pStrFilename)
- void Unpack_GetMetaDataFileInfoFromPEFile(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool GetILImageInfoFromNgenPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwSize, IStringHolder * pStrFilename)
- void Unpack_GetILImageInfoFromNgenPEFile(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool IsThreadSuspendedOrHijacked(VMPTR_Thread vmThread)
- void Unpack_IsThreadSuspendedOrHijacked(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool AreGCStructuresValid()
- void Unpack_AreGCStructuresValid(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT CreateHeapWalk(HeapWalkHandle * pHandle)
- void Unpack_CreateHeapWalk(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void DeleteHeapWalk(HeapWalkHandle handle)
- void Unpack_DeleteHeapWalk(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT WalkHeap(HeapWalkHandle handle, ULONG count, COR_HEAPOBJECT * objects, ULONG * pFetched)
- void Unpack_WalkHeap(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT GetHeapSegments(DacDbiArrayList<COR_SEGMENT> * pSegments)
- void Unpack_GetHeapSegments(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool IsValidObject(CORDB_ADDRESS obj)
- void Unpack_IsValidObject(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // bool GetAppDomainForObject(CORDB_ADDRESS obj, VMPTR_AppDomain * pApp, VMPTR_Module * pModule, VMPTR_DomainFile * pDomainFile)
- void Unpack_GetAppDomainForObject(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT CreateRefWalk(RefWalkHandle * pHandle, BOOL walkStacks, BOOL walkFQ, UINT32 handleWalkMask)
- void Unpack_CreateRefWalk(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void DeleteRefWalk(RefWalkHandle handle)
- void Unpack_DeleteRefWalk(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT WalkRefs(RefWalkHandle handle, ULONG count, DacGcReference * refs, ULONG * pFetched)
- void Unpack_WalkRefs(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT GetTypeID(CORDB_ADDRESS obj, COR_TYPEID * pType)
- void Unpack_GetTypeID(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT GetObjectFields(COR_TYPEID id, ULONG32 celt, COR_FIELD * layout, ULONG32 * pceltFetched)
- void Unpack_GetObjectFields(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT GetTypeLayout(COR_TYPEID id, COR_TYPE_LAYOUT * pLayout)
- void Unpack_GetTypeLayout(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // HRESULT GetArrayLayout(COR_TYPEID id, COR_ARRAY_LAYOUT * pLayout)
- void Unpack_GetArrayLayout(ReadBuffer * pSend, WriteBuffer * pResult);
-
- // void GetGCHeapInformation(COR_HEAPINFO * pHeapInfo)
- void Unpack_GetGCHeapInformation(ReadBuffer * pSend, WriteBuffer * pResult);
-
- };
-
-#endif // _DDUNPACK_H_
-
-#endif //FEATURE_DBGIPC_TRANSPORT_VM
-
-// end of file
diff --git a/src/debug/ee/debugger.cpp b/src/debug/ee/debugger.cpp
index f95e49b3f0..582a3954a9 100644
--- a/src/debug/ee/debugger.cpp
+++ b/src/debug/ee/debugger.cpp
@@ -38,8 +38,6 @@
#include "../../vm/excep.h"
#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
#include "dbgtransportsession.h"
-#include "dbgtransportproxy.h"
-#include "dbgsecureconnection.h"
#endif // FEATURE_DBGIPC_TRANSPORT_VM
@@ -1729,11 +1727,7 @@ void Debugger::RaiseStartupNotification()
// listening, and we will fail. However, we still want to initialize the variable above.
BOOL fRaiseStartupNotification = TRUE;
#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(useTransport)
- {
- fRaiseStartupNotification = (CORDebuggerAttached() ? TRUE : FALSE);
- }
+ fRaiseStartupNotification = (CORDebuggerAttached() ? TRUE : FALSE);
#endif
if (fRaiseStartupNotification)
{
@@ -1766,67 +1760,58 @@ void Debugger::RaiseStartupNotification()
void Debugger::SendRawEvent(const DebuggerIPCEvent * pManagedEvent)
{
#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(useTransport)
- {
- HRESULT hr = g_pDbgTransport->SendDebugEvent(const_cast<DebuggerIPCEvent *>(pManagedEvent));
+ HRESULT hr = g_pDbgTransport->SendDebugEvent(const_cast<DebuggerIPCEvent *>(pManagedEvent));
- if (FAILED(hr))
- {
- _ASSERTE(!"Failed to send debugger event");
+ if (FAILED(hr))
+ {
+ _ASSERTE(!"Failed to send debugger event");
- STRESS_LOG1(LF_CORDB, LL_INFO1000, "D::SendIPCEvent Error on Send with 0x%x\n", hr);
- UnrecoverableError(hr,
- 0,
- FILE_DEBUG,
- LINE_DEBUG,
- false);
+ STRESS_LOG1(LF_CORDB, LL_INFO1000, "D::SendIPCEvent Error on Send with 0x%x\n", hr);
+ UnrecoverableError(hr,
+ 0,
+ FILE_DEBUG,
+ LINE_DEBUG,
+ false);
- // @dbgtodo Mac - what can we do here?
- }
+ // @dbgtodo Mac - what can we do here?
}
- else
+#else
+ // We get to send an array of ULONG_PTRs as data with the notification.
+ // The debugger can then use ReadProcessMemory to read through this array.
+ ULONG_PTR rgData [] = {
+ CLRDBG_EXCEPTION_DATA_CHECKSUM,
+ (ULONG_PTR) g_pMSCorEE,
+ (ULONG_PTR) pManagedEvent
+ };
+
+ // If no debugger attached, then don't bother raising a 1st-chance exception because nobody will sniff it.
+ // @dbgtodo iDNA: in iDNA case, the recorder may sniff it.
+ if (!IsDebuggerPresent())
{
-#endif
- // We get to send an array of ULONG_PTRs as data with the notification.
- // The debugger can then use ReadProcessMemory to read through this array.
- ULONG_PTR rgData [] = {
- CLRDBG_EXCEPTION_DATA_CHECKSUM,
- (ULONG_PTR) g_pMSCorEE,
- (ULONG_PTR) pManagedEvent
- };
-
- // If no debugger attached, then don't bother raising a 1st-chance exception because nobody will sniff it.
- // @dbgtodo iDNA: in iDNA case, the recorder may sniff it.
- if (!IsDebuggerPresent())
- {
- return;
- }
-
- //
- // Physically send the event via an OS Exception. We're using exceptions as a notification
- // mechanism on top of the OS native debugging pipeline.
- // @dbgtodo cross-plat - this needs to be cross-plat.
- //
- EX_TRY
- {
- const DWORD dwFlags = 0; // continuable (eg, Debugger can continue GH)
- RaiseException(CLRDBG_NOTIFICATION_EXCEPTION_CODE, dwFlags, NumItems(rgData), rgData);
+ return;
+ }
- // If debugger continues "GH" (DBG_CONTINUE), then we land here.
- // This is the expected path for a well-behaved ICorDebug debugger.
- }
- EX_CATCH
- {
- // If no debugger is attached, or if the debugger continues "GN" (DBG_EXCEPTION_NOT_HANDLED), then we land here.
- // A naive (not-ICorDebug aware) native-debugger won't handle the exception and so land us here.
- // We may also get here if a debugger detaches at the Exception notification
- // (and thus implicitly continues GN).
- }
- EX_END_CATCH(SwallowAllExceptions);
+ //
+ // Physically send the event via an OS Exception. We're using exceptions as a notification
+ // mechanism on top of the OS native debugging pipeline.
+ // @dbgtodo cross-plat - this needs to be cross-plat.
+ //
+ EX_TRY
+ {
+ const DWORD dwFlags = 0; // continuable (eg, Debugger can continue GH)
+ RaiseException(CLRDBG_NOTIFICATION_EXCEPTION_CODE, dwFlags, NumItems(rgData), rgData);
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
+ // If debugger continues "GH" (DBG_CONTINUE), then we land here.
+ // This is the expected path for a well-behaved ICorDebug debugger.
+ }
+ EX_CATCH
+ {
+ // If no debugger is attached, or if the debugger continues "GN" (DBG_EXCEPTION_NOT_HANDLED), then we land here.
+ // A naive (not-ICorDebug aware) native-debugger won't handle the exception and so land us here.
+ // We may also get here if a debugger detaches at the Exception notification
+ // (and thus implicitly continues GN).
}
+ EX_END_CATCH(SwallowAllExceptions);
#endif // FEATURE_DBGIPC_TRANSPORT_VM
}
@@ -1992,15 +1977,9 @@ HRESULT Debugger::Startup(void)
// Iff the debug pack is installed, then go through the telesto debugging pipeline.
LOG((LF_CORDB, LL_INFO10, "Debugging service is enabled because debug pack is installed or Watson support is enabled)\n"));
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(!useTransport)
- {
-#endif
- // This may block while an attach occurs.
- NotifyDebuggerOfTelestoStartup();
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
- }
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM)
+ // This may block while an attach occurs.
+ NotifyDebuggerOfTelestoStartup();
#endif
}
else
@@ -2102,86 +2081,32 @@ HRESULT Debugger::Startup(void)
_ASSERTE(SUCCEEDED(hr)); // throws on error
#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(useTransport)
- {
- // The in-process DAC for Mac is lazily initialized when we get the first DDMessage.
- // We check whether the DAC and the runtime has matching versions when we do the initialization, and
- // we'll fail if the versions don't match. That's why we don't want to do the initialization here because
- // even if we have the wrong version of DAC, managed apps can still run. We just can't debug it.
-
- // Create transport control block and initialize it.
- g_pDbgTransport = new DbgTransportSession();
- hr = g_pDbgTransport->Init(m_pRCThread->GetDCB(), m_pAppDomainCB, &m_inProcDac);
- if (FAILED(hr))
- ThrowHR(hr);
-
- // Create interface to talk to debugger proxy and initialize it.
- DbgTransportProxy *pProxy = new DbgTransportProxy();
- hr = pProxy->Init(g_pDbgTransport->GetPort());
- if (FAILED(hr))
- ThrowHR(hr);
-
- // Contact the debugger proxy process for this machine. This has several purposes:
- // 1) Register this runtime instance as available for debugging.
- // 2) Check whether a debugger is already waiting to attach to us.
- // 3) Publish the port number we expect debugging requests to target.
- // The following call blocks until we receive a reply from the proxy or time out.
- DbgProxyResult result = pProxy->RegisterWithProxy();
- switch (result)
- {
- case RequestTimedOut:
- // The proxy doesn't appear to be there, we're not debuggable as a result.
- // To be careful (and avoid malicious types trying to connect to us even when the proxy is not up)
- // neuter the transport so that it won't accept any connections. Ideally we'd just shutdown the
- // debugger subsystem entirely, but this appears to be somewhat complex at this late stage.
- g_pDbgTransport->Neuter();
- break;
- case RequestSuccessful:
- // We registered with the proxy successfully. No debugger was interested in
- // us just yet.
- break;
- case PendingDebuggerAttach:
- // We registered with the proxy and found that a debugger was registered for
- // an early attach.
-
- // Mark this process as launched by the debugger and the debugger as attached.
- g_CORDebuggerControlFlags |= DBCF_GENERATE_DEBUG_CODE;
- MarkDebuggerAttachedInternal();
-
- LazyInit();
- DebuggerController::Initialize();
- break;
- default:
- _ASSERTE(!"Unknown result code from DbgTransportSession::RegisterWithProxy()");
- }
-
- // The debugger no longer needs to talk with the proxy.
- pProxy->Shutdown();
- delete pProxy;
- }
+ // Create transport session and initialize it.
+ g_pDbgTransport = new DbgTransportSession();
+ hr = g_pDbgTransport->Init(m_pRCThread->GetDCB(), m_pAppDomainCB);
+ if (FAILED(hr))
+ ThrowHR(hr);
+
+ bool waitForAttach = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgWaitForDebuggerAttach) != 0;
+ if (waitForAttach)
+ {
+ // Mark this process as launched by the debugger and the debugger as attached.
+ g_CORDebuggerControlFlags |= DBCF_GENERATE_DEBUG_CODE;
+ MarkDebuggerAttachedInternal();
+
+ LazyInit();
+ DebuggerController::Initialize();
+ }
#endif // FEATURE_DBGIPC_TRANSPORT_VM
RaiseStartupNotification();
// Also initialize the AppDomainEnumerationIPCBlock
-#if defined(FEATURE_IPCMAN)
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(useTransport)
- {
- m_pAppDomainCB = new (nothrow) AppDomainEnumerationIPCBlock();
- }
- else
- {
-#endif
- m_pAppDomainCB = g_pIPCManagerInterface->GetAppDomainBlock();
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- }
-#endif
-#else // FEATURE_IPCMAN
+#if !defined(FEATURE_IPCMAN) || defined(FEATURE_DBGIPC_TRANSPORT_VM)
m_pAppDomainCB = new (nothrow) AppDomainEnumerationIPCBlock();
-#endif // FEATURE_IPCMAN
+#else
+ m_pAppDomainCB = g_pIPCManagerInterface->GetAppDomainBlock();
+#endif
if (m_pAppDomainCB == NULL)
{
@@ -5551,19 +5476,13 @@ void Debugger::TrapAllRuntimeThreads()
}
CONTRACTL_END;
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(!useTransport)
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM)
+ // Only sync if RS requested it.
+ if (!m_RSRequestedSync)
{
-#endif
- // Only sync if RS requested it.
- if (!m_RSRequestedSync)
- {
- return;
- }
- m_RSRequestedSync = FALSE;
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
+ return;
}
+ m_RSRequestedSync = FALSE;
#endif
// If we're doing shutdown, then don't bother trying to communicate w/ the RS.
diff --git a/src/debug/ee/debugger.h b/src/debug/ee/debugger.h
index 41ff93d16f..6f71b5c74a 100644
--- a/src/debug/ee/debugger.h
+++ b/src/debug/ee/debugger.h
@@ -49,7 +49,6 @@
#include "dllimportcallback.h"
#include "canary.h"
-#include "inprocdac.h"
#undef ASSERT
#define CRASH(x) _ASSERTE(!x)
@@ -836,17 +835,9 @@ private:
DebuggerIPCEvent * GetRCThreadReceiveBuffer()
{
#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(useTransport)
- {
- return reinterpret_cast<DebuggerIPCEvent *>(&m_receiveBuffer[0]);
- }
- else
- {
-#endif // FEATURE_DBGIPC_TRANSPORT_VM
- return reinterpret_cast<DebuggerIPCEvent *>(&m_pDCB->m_receiveBuffer[0]);
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
- }
+ return reinterpret_cast<DebuggerIPCEvent *>(&m_receiveBuffer[0]);
+#else
+ return reinterpret_cast<DebuggerIPCEvent *>(&m_pDCB->m_receiveBuffer[0]);
#endif
}
@@ -855,17 +846,9 @@ private:
DebuggerIPCEvent * GetRCThreadSendBuffer()
{
#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(useTransport)
- {
- return reinterpret_cast<DebuggerIPCEvent *>(&m_sendBuffer[0]);
- }
- else
- {
-#endif // FEATURE_DBGIPC_TRANSPORT_VM
- return reinterpret_cast<DebuggerIPCEvent *>(&m_pDCB->m_sendBuffer[0]);
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
- }
+ return reinterpret_cast<DebuggerIPCEvent *>(&m_sendBuffer[0]);
+#else // FEATURE_DBGIPC_TRANSPORT_VM
+ return reinterpret_cast<DebuggerIPCEvent *>(&m_pDCB->m_sendBuffer[0]);
#endif // FEATURE_DBGIPC_TRANSPORT_VM
}
@@ -2805,11 +2788,6 @@ private:
PTR_DebuggerLazyInit m_pLazyData;
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- InProcDac m_inProcDac;
-#endif // FEATURE_DBGIPC_TRANSPORT_VM
-
-
// A list of all defines that affect layout of MD types
typedef enum _Target_Defines
diff --git a/src/debug/ee/inprocdac.cpp b/src/debug/ee/inprocdac.cpp
deleted file mode 100644
index e451cf08bb..0000000000
--- a/src/debug/ee/inprocdac.cpp
+++ /dev/null
@@ -1,432 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-//*****************************************************************************
-// File: InProcDac.cpp
-//
-
-//
-//
-//
-//*****************************************************************************
-
-#include "stdafx.h"
-
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
-
-#include "inprocdac.h"
-#include "dacdbiinterface.h"
-#include "cordebug.h"
-#include "metadata.h"
-
-InProcDac::InProcDac() :
- m_pDacDbi(NULL),
- m_pUnpacker(NULL)
-{
-}
-
-InProcDac::~InProcDac()
-{
- Cleanup();
-}
-
-//
-// Debugger::InitializeDAC
-//
-// DAC is used in-process on the Mac and ARM devices.
-// This is similar to CordbProcess::CreateDacDbiInterface on Windows.
-// @dbgtodo : try and share some of this code with the RS equivalent?
-//
-void InProcDac::Initialize()
-{
- CONTRACTL
- {
- THROWS;
- }
- CONTRACTL_END;
-
- // don't double-init
- _ASSERTE(m_pDataTarget == NULL);
- _ASSERTE(m_pDacDbi == NULL);
- _ASSERTE(m_pUnpacker == NULL);
-
- HRESULT hrStatus = S_OK;
- HModuleHolder hDacDll;
-
- //
- // Load the access DLL from the same directory as the the current CLR DLL.
- //
- WCHAR wszRuntimePath[MAX_PATH]; // base directory of the runtime (including trailing /)
- WCHAR wszAccessDllPath[MAX_PATH]; // full path to the DAC Dll
-
- if (!WszGetModuleFileName(GetCLRModule(), wszRuntimePath, NumItems(wszRuntimePath)))
- {
- ThrowLastError();
- }
-
- const char pathSep = '\\';
-
- // remove CLR filename
- PWSTR pPathTail = wcsrchr(wszRuntimePath, pathSep);
- if (!pPathTail)
- {
- ThrowHR(E_INVALIDARG);
- }
- pPathTail[1] = '\0';
-
- // In the case where this function is called multiple times, save the module handle to the DAC shared
- // library so that we won't try to free and load it multiple times.
- if (m_hDacModule == NULL)
- {
- if (wcscpy_s(wszAccessDllPath, _countof(wszAccessDllPath), wszRuntimePath) ||
- wcscat_s(wszAccessDllPath, _countof(wszAccessDllPath), MAKEDLLNAME_W(MAIN_DAC_MODULE_NAME_W)))
- {
- ThrowHR(E_INVALIDARG);
- }
-
- hDacDll.Assign(WszLoadLibrary(wszAccessDllPath));
- if (!hDacDll)
- {
- CONSISTENCY_CHECK_MSGF(false,("Unable to find DAC dll: %s", wszAccessDllPath));
-
- DWORD dwLastError = GetLastError();
- if (dwLastError == ERROR_MOD_NOT_FOUND)
- {
- // Give a more specific error in the case where we can't find the DAC dll.
- ThrowHR(CORDBG_E_DEBUG_COMPONENT_MISSING);
- }
- else
- {
- ThrowWin32(dwLastError);
- }
- }
-
- // Succeeded. Now copy out.
- m_hDacModule.Assign(hDacDll);
- hDacDll.SuppressRelease();
- }
-
- // Create the data target
- ReleaseHolder<InProcDataTarget> pDataTarget = new InProcDataTarget();
-
- //
- // Get the access interface, passing our callback interfaces (data target, and metadata lookup)
- //
-
- IDacDbiInterface::IMetaDataLookup * pMetaDataLookup = this;
- IDacDbiInterface::IAllocator * pAllocator = this;
-
- // Get the CLR instance ID - the base address of the CLR module
- CORDB_ADDRESS clrInstanceId = reinterpret_cast<CORDB_ADDRESS>(GetCLRModule());
-
- typedef HRESULT (STDAPICALLTYPE * PFN_DacDbiInterfaceInstance)(
- ICorDebugDataTarget *,
- CORDB_ADDRESS,
- IDacDbiInterface::IAllocator *,
- IDacDbiInterface::IMetaDataLookup *,
- IDacDbiInterface **);
-
- IDacDbiInterface* pInterfacePtr = NULL;
- PFN_DacDbiInterfaceInstance pfnEntry = (PFN_DacDbiInterfaceInstance)
- GetProcAddress(m_hDacModule, "DacDbiInterfaceInstance");
-
- if (!pfnEntry)
- {
- ThrowLastError();
- }
-
- hrStatus = pfnEntry(pDataTarget, clrInstanceId,
- pAllocator, pMetaDataLookup, &pInterfacePtr);
- IfFailThrow(hrStatus);
-
- // We now have a resource, pInterfacePtr, that needs to be freed.
-
- m_pDacDbi = pInterfacePtr;
- m_pDataTarget = pDataTarget.Extract();
-
- // Enable DAC target consistency checking - we're in-proc and so better always be consistent
- m_pDacDbi->DacSetTargetConsistencyChecks( true );
- m_pUnpacker = new DDUnpack(pInterfacePtr, pAllocator); // throws
-}
-
-void InProcDac::Cleanup()
-{
- CONTRACTL
- {
- NOTHROW; // backout code.
- }
- CONTRACTL_END;
-
- if (m_pDacDbi != NULL)
- {
- m_pDacDbi->Destroy();
- m_pDacDbi = NULL;
- }
-
- if(m_pUnpacker != NULL)
- {
- delete m_pUnpacker;
- m_pUnpacker = NULL;
- }
-
- if (m_pDataTarget != NULL)
- {
- m_pDataTarget.Clear();
- }
-
- // Note that once we release this handle, the DAC module can be unloaded and all calls
- // into DAC could be invalid.
- if (m_hDacModule != NULL)
- {
- m_hDacModule.Clear();
- }
-}
-
-HRESULT InProcDac::DoRequest(ReadBuffer * pSend, WriteBuffer * pResult)
-{
- HRESULT hr = S_OK;
-
- // Lazily initialize the DacDbiMarshalStub.
- if (m_pDacDbi == NULL)
- {
- EX_TRY
- {
- Initialize();
- }
- EX_CATCH_HRESULT(hr);
- IfFailRet(hr);
- }
-
- _ASSERTE(m_pDacDbi != NULL);
-
- /*
- * @dbgtodo : We have to make sure to call Flush whenever runtime data structures may have changed.
- * Eg:
- * - after every IPC event
- * - whenever we suspend the process
- * For now we rely on the RS to tell us when to flush, just like the Windows runtime. It's a little riskier
- * in this case because the target is actually running code. Since the cost of copying locally is fairly
- * low, it is probably best to just flush at the beginning and/or end of all DD requests (i.e. here).
- * Flushing more that necessary may be best for performance.
- * Note however that this could in theory expose lateng bugs where we've been getting away with bleeding
- * DAC state across DD calls on Windows.
- */
- EX_TRY
- {
- m_pUnpacker->HandleDDMessage(pSend, pResult);
- }
- EX_CATCH_HRESULT(hr);
- return hr;
-}
-
-#ifndef DACCESS_COMPILE
-IMDInternalImport * InProcDac::LookupMetaData(VMPTR_PEFile addressPEFile, bool &isILMetaDataForNGENImage)
-{
- isILMetaDataForNGENImage = false;
- PEFile* peFile = addressPEFile.GetRawPtr();
- return peFile->GetPersistentMDImport();
-}
-#endif
-//***************************************************************
-// InProcDataTarget implementation
-//***************************************************************
-
-//
-// InProcDataTarget ctor
-//
-// Instantiate an InProcDataTarget
-//
-InProcDac::InProcDataTarget::InProcDataTarget() :
- m_ref(0)
-{
-}
-
-//
-// InProcDataTarget dtor
-//
-//
-InProcDac::InProcDataTarget::~InProcDataTarget()
-{
-}
-
-// Standard impl of IUnknown::QueryInterface
-HRESULT STDMETHODCALLTYPE
-InProcDac::InProcDataTarget::QueryInterface(
- REFIID InterfaceId,
- PVOID* pInterface)
-{
- if (InterfaceId == IID_IUnknown)
- {
- *pInterface = static_cast<IUnknown *>(static_cast<ICorDebugDataTarget *>(this));
- }
- else if (InterfaceId == IID_ICorDebugDataTarget)
- {
- *pInterface = static_cast<ICorDebugDataTarget *>(this);
- }
- else if (InterfaceId == IID_ICorDebugMutableDataTarget)
- {
- *pInterface = static_cast<ICorDebugMutableDataTarget *>(this);
- }
- else
- {
- *pInterface = NULL;
- return E_NOINTERFACE;
- }
-
- AddRef();
- return S_OK;
-}
-
-// Standard impl of IUnknown::AddRef
-ULONG STDMETHODCALLTYPE
-InProcDac::InProcDataTarget::AddRef()
-{
- LONG ref = InterlockedIncrement(&m_ref);
- return ref;
-}
-
-// Standard impl of IUnknown::Release
-ULONG STDMETHODCALLTYPE
-InProcDac::InProcDataTarget::Release()
-{
- LONG ref = InterlockedDecrement(&m_ref);
- if (ref == 0)
- {
- delete this;
- }
- return ref;
-}
-
-// impl of interface method ICorDebugDataTarget::GetPlatform
-HRESULT STDMETHODCALLTYPE
-InProcDac::InProcDataTarget::GetPlatform(
- CorDebugPlatform * pPlatform)
-{
-#if defined(_TARGET_X86_)
- *pPlatform = CORDB_PLATFORM_WINDOWS_X86;
-#elif defined(_TARGET_AMD64_)
- *pPlatform = CORDB_PLATFORM_WINDOWS_AMD64;
-#elif defined(_TARGET_ARM_)
- *pPlatform = CORDB_PLATFORM_WINDOWS_ARM;
-#else
-#error Unknown Processor.
-#endif // platform
-
- return S_OK;
-}
-
-// impl of interface method ICorDebugDataTarget::ReadVirtual
-HRESULT STDMETHODCALLTYPE
-InProcDac::InProcDataTarget::ReadVirtual(
- CORDB_ADDRESS address,
- PBYTE pBuffer,
- ULONG32 cbRequestSize,
- ULONG32 * pcbRead)
-{
- void * pSrc = reinterpret_cast<void*>(address);
- memcpy(pBuffer, pSrc, cbRequestSize);
- if (pcbRead != NULL)
- {
- *pcbRead = cbRequestSize;
- }
- return S_OK;
-}
-
-// impl of interface method ICorDebugMutableDataTarget::WriteVirtual
-HRESULT STDMETHODCALLTYPE
-InProcDac::InProcDataTarget::WriteVirtual(
- CORDB_ADDRESS address,
- const BYTE * pBuffer,
- ULONG32 cbRequestSize)
-{
- void * pDst = reinterpret_cast<void*>(address);
- memcpy(pDst, pBuffer, cbRequestSize);
- return S_OK;
-}
-
-
-// impl of interface method ICorDebugDataTarget::GetThreadContext
-HRESULT STDMETHODCALLTYPE
-InProcDac::InProcDataTarget::GetThreadContext(
- DWORD dwThreadID,
- ULONG32 contextFlags,
- ULONG32 contextSize,
- PBYTE pContext)
-{
- if (contextSize < sizeof(CONTEXT))
- {
- return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
- }
-
- HandleHolder hThread = ::OpenThread(THREAD_GET_CONTEXT, FALSE, dwThreadID);
- if (hThread == NULL)
- {
- return HRESULT_FROM_GetLastError();
- }
-
- // This assumes pContext is appropriately aligned.
- CONTEXT * pCtx = reinterpret_cast<CONTEXT*>(pContext);
- pCtx->ContextFlags = contextFlags;
- if (!::GetThreadContext(hThread, pCtx))
- {
- return HRESULT_FROM_GetLastError();
- }
-
- return S_OK;
-}
-
-// impl of interface method ICorDebugMutableDataTarget::SetThreadContext
-HRESULT STDMETHODCALLTYPE
-InProcDac::InProcDataTarget::SetThreadContext(
- DWORD dwThreadID,
- ULONG32 contextSize,
- const BYTE * pContext)
-{
- if (contextSize < sizeof(CONTEXT))
- {
- return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
- }
-
- HandleHolder hThread = ::OpenThread(THREAD_SET_CONTEXT, FALSE, dwThreadID);
- if (hThread == NULL)
- {
- return HRESULT_FROM_GetLastError();
- }
-
- // This assumes pContext is appropriately aligned.
- const CONTEXT * pCtx = reinterpret_cast<const CONTEXT*>(pContext);
- if (!::SetThreadContext(hThread,pCtx))
- {
- return HRESULT_FROM_GetLastError();
- }
-
- return S_OK;
-}
-
-// implementation of ICorDebugMutableDataTarget::ContinueStatusChanged
-HRESULT STDMETHODCALLTYPE
-InProcDac::InProcDataTarget::ContinueStatusChanged(
- DWORD dwThreadId,
- CORDB_CONTINUE_STATUS continueStatus)
-{
- return E_NOTIMPL;
-}
-
-#ifndef DACCESS_COMPILE
-
-// Trivial implementation for IDacDbiInterface::IAllocator methods
-void * InProcDac::Alloc(SIZE_T lenBytes)
-{
- return new BYTE[lenBytes];
-}
-
-void InProcDac::Free(void * p)
-{
- BYTE* pB = static_cast<BYTE*>(p);
- delete[] pB;
-}
-
-#endif //!DACCESS_COMPILE
-
-#endif //FEATURE_DBGIPC_TRANSPORT_VM
diff --git a/src/debug/ee/inprocdac.h b/src/debug/ee/inprocdac.h
deleted file mode 100644
index 408159d12a..0000000000
--- a/src/debug/ee/inprocdac.h
+++ /dev/null
@@ -1,157 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-//*****************************************************************************
-// File: InProcDac.h
-//
-
-//
-//*****************************************************************************
-
-#ifndef _INPROCDAC_H
-#define _INPROCDAC_H
-
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
-#include "dacdbiinterface.h"
-#include "cordebug.h"
-#include "xcordebug.h"
-
-#ifndef DACCESS_COMPILE
-#include "ddunpack.h"
-#endif
-
-class IDacDbiMarshalStub;
-class ReadBuffer;
-class WriteBuffer;
-
-//
-// InProcDac is a helper class used by the Debugger class to make DAC and
-// the IDacDbiInterface available from within process.
-// This is done on the Macintosh because we don't have OS support for our
-// normal out-of-process access (eg. VM read as non-root user).
-//
-// Note that we don't ever actually use this in DACCESS_COMPILE builds - it's
-// implementation is compiled into just mscorwks, but the callbacks (data target
-// and IMetaDataLookup) are called from mscordacwks. We need the declaration
-// visible in DACCESS_COMPILE builds because a field of this type is contained
-// by-value in the Debugger class, and so we need the correct size for field
-// layout.
-//
-class InProcDac
- : private IDacDbiInterface::IMetaDataLookup,
- private IDacDbiInterface::IAllocator
-{
-public:
- InProcDac() DAC_EMPTY();
- ~InProcDac() DAC_EMPTY();
-
- void Initialize();
- void Cleanup();
-
- // This takes a marshalled version of a DD interface request
- HRESULT DoRequest(ReadBuffer * pSend, WriteBuffer * pResult);
-
-private:
-
- // IMetaDataLookup methods
- virtual IMDInternalImport * LookupMetaData(VMPTR_PEFile addressPEFile, bool &isILMetaDataForNGENImage);
-
- //
- // IAllocator interfaces
- //
- virtual void * Alloc(SIZE_T lenBytes) DAC_EMPTY_RET(NULL);
-
- virtual void Free(void * p) DAC_EMPTY();
-
- class InProcDataTarget :
- public ICorDebugMutableDataTarget
- {
- public:
- InProcDataTarget();
- virtual ~InProcDataTarget();
-
- // IUnknown.
- virtual HRESULT STDMETHODCALLTYPE QueryInterface(
- REFIID riid,
- void** ppInterface);
-
- virtual ULONG STDMETHODCALLTYPE AddRef();
-
- virtual ULONG STDMETHODCALLTYPE Release();
-
- // ICorDebugMutableDataTarget.
- virtual HRESULT STDMETHODCALLTYPE GetPlatform(
- CorDebugPlatform *pPlatform);
-
- virtual HRESULT STDMETHODCALLTYPE ReadVirtual(
- CORDB_ADDRESS address,
- PBYTE pBuffer,
- ULONG32 request,
- ULONG32 *pcbRead);
-
- virtual HRESULT STDMETHODCALLTYPE WriteVirtual(
- CORDB_ADDRESS address,
- const BYTE * pBuffer,
- ULONG32 request);
-
- virtual HRESULT STDMETHODCALLTYPE GetThreadContext(
- DWORD dwThreadID,
- ULONG32 contextFlags,
- ULONG32 contextSize,
- PBYTE context);
-
- virtual HRESULT STDMETHODCALLTYPE SetThreadContext(
- DWORD dwThreadID,
- ULONG32 contextSize,
- const BYTE * context);
-
- virtual HRESULT STDMETHODCALLTYPE ContinueStatusChanged(
- DWORD dwThreadId,
- CORDB_CONTINUE_STATUS continueStatus);
-
- private:
- LONG m_ref; // Reference count.
- };
-
-
-
-private:
- //
- // InProcDac Fields
- //
- ReleaseHolder<InProcDataTarget> m_pDataTarget;
- HModuleHolder m_hDacModule;
-#ifndef DACCESS_COMPILE
- IDacDbiInterface * m_pDacDbi;
- DDUnpack * m_pUnpacker;
-#else
- VOID * m_pDacDbi;
- VOID * m_pUnpacker;
-#endif
-};
-
-
-#ifdef DACCESS_COMPILE
-// This method is a funny case for DAC and DacCop. InProcDac isn't used in DACCESS_COMPILE builds at all
-// (inprocdac.cpp isn't compiled in DAC builds), but we need the declaration since an instance
-// of it is contained by-value in the Debugger class (need to know the right size so field layout
-// matches the target). The LookupMetadata function is called from DAC, and so DacCop searches
-// for all implementations of it in mscordacwks.dll and find this one (the real one is either in
-// mscordbi.dll or coreclr which DacCop doesn't analyze). We need an implementation of virtual
-// methods for the DACCESS_COMPILE build, but rather than use the usual DAC_EMPTY macros we'll
-// use this explicit implementation here to avoid a DacCop violation.
-inline IMDInternalImport * InProcDac::LookupMetaData(VMPTR_PEFile addressPEFile, bool &isILMetaDataForNGENImage)
-{
- SUPPORTS_DAC; // not really - but we should never be called
- _ASSERTE_MSG(false, "This implementation should never be called in DAC builds");
- DacError(E_UNEXPECTED);
- return NULL;
-}
-#endif // DACCESS_COMPILE
-
-
-
-#endif // FEATURE_DBGIPC_TRANSPORT_VM
-
-#endif //_INPROCDAC_H
diff --git a/src/debug/ee/rcthread.cpp b/src/debug/ee/rcthread.cpp
index 7e6f1ae304..896db99884 100644
--- a/src/debug/ee/rcthread.cpp
+++ b/src/debug/ee/rcthread.cpp
@@ -305,27 +305,21 @@ HRESULT DebuggerIPCControlBlock::Init(
m_bHostingInFiber = true;
}
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(!useTransport)
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM)
+ // Copy RSEA and RSER into the control block.
+ if (!m_rightSideEventAvailable.SetLocal(hRsea))
{
-#endif
- // Copy RSEA and RSER into the control block.
- if (!m_rightSideEventAvailable.SetLocal(hRsea))
- {
- ThrowLastError();
- }
+ ThrowLastError();
+ }
- if (!m_rightSideEventRead.SetLocal(hRser))
- {
- ThrowLastError();
- }
+ if (!m_rightSideEventRead.SetLocal(hRser))
+ {
+ ThrowLastError();
+ }
- if (!m_leftSideUnmanagedWaitEvent.SetLocal(hLsuwe))
- {
- ThrowLastError();
- }
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
+ if (!m_leftSideUnmanagedWaitEvent.SetLocal(hLsuwe))
+ {
+ ThrowLastError();
}
#endif // !FEATURE_DBGIPC_TRANSPORT_VM
@@ -420,78 +414,71 @@ HRESULT DebuggerRCThread::Init(void)
HRESULT hr;
#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(!useTransport)
+
+ if (m_pDCB)
{
-#endif
- IPCHostSecurityAttributeHolder sa(GetCurrentProcessId());
+ hr = m_pDCB->Init(NULL, NULL, NULL, NULL, NULL);
+ _ASSERTE(SUCCEEDED(hr)); // throws on error.
+ }
+#else //FEATURE_DBGIPC_TRANSPORT_VM
- // Create the events that the thread will need to receive events
- // from the out of process piece on the right side.
- // We will not fail out if CreateEvent fails for RSEA or RSER. Because
- // the worst case is that debugger cannot attach to debuggee.
- //
- HandleHolder rightSideEventAvailable(WszCreateEvent(sa.GetHostSA(), (BOOL) kAutoResetEvent, FALSE, NULL));
+ IPCHostSecurityAttributeHolder sa(GetCurrentProcessId());
- // Security fix:
- // We need to check the last error to see if the event was precreated or not
- // If so, we need to release the handle right now.
- //
- dwStatus = GetLastError();
- if (dwStatus == ERROR_ALREADY_EXISTS)
- {
- // clean up the handle now
- rightSideEventAvailable.Clear();
- }
+ // Create the events that the thread will need to receive events
+ // from the out of process piece on the right side.
+ // We will not fail out if CreateEvent fails for RSEA or RSER. Because
+ // the worst case is that debugger cannot attach to debuggee.
+ //
+ HandleHolder rightSideEventAvailable(WszCreateEvent(sa.GetHostSA(), (BOOL) kAutoResetEvent, FALSE, NULL));
- HandleHolder rightSideEventRead(WszCreateEvent(sa.GetHostSA(), (BOOL) kAutoResetEvent, FALSE, NULL));
+ // Security fix:
+ // We need to check the last error to see if the event was precreated or not
+ // If so, we need to release the handle right now.
+ //
+ dwStatus = GetLastError();
+ if (dwStatus == ERROR_ALREADY_EXISTS)
+ {
+ // clean up the handle now
+ rightSideEventAvailable.Clear();
+ }
- // Security fix:
- // We need to check the last error to see if the event was precreated or not
- // If so, we need to release the handle right now.
- //
- dwStatus = GetLastError();
- if (dwStatus == ERROR_ALREADY_EXISTS)
- {
- // clean up the handle now
- rightSideEventRead.Clear();
- }
+ HandleHolder rightSideEventRead(WszCreateEvent(sa.GetHostSA(), (BOOL) kAutoResetEvent, FALSE, NULL));
+ // Security fix:
+ // We need to check the last error to see if the event was precreated or not
+ // If so, we need to release the handle right now.
+ //
+ dwStatus = GetLastError();
+ if (dwStatus == ERROR_ALREADY_EXISTS)
+ {
+ // clean up the handle now
+ rightSideEventRead.Clear();
+ }
- HandleHolder leftSideUnmanagedWaitEvent(CreateWin32EventOrThrow(NULL, kManualResetEvent, FALSE));
- // Copy RSEA and RSER into the control block only if shared memory is created without error.
- if (m_pDCB)
- {
- // Since Init() gets ownership of handles as soon as it's called, we can
- // release our ownership now.
- rightSideEventAvailable.SuppressRelease();
- rightSideEventRead.SuppressRelease();
- leftSideUnmanagedWaitEvent.SuppressRelease();
-
- // NOTE: initialization of the debugger control block occurs partly on the left side and partly on
- // the right side. This initialization occurs in parallel, so it's unsafe to make assumptions about
- // the order in which the fields will be initialized.
- hr = m_pDCB->Init(rightSideEventAvailable,
- rightSideEventRead,
- NULL,
- NULL,
- leftSideUnmanagedWaitEvent);
-
- _ASSERTE(SUCCEEDED(hr)); // throws on error.
- }
+ HandleHolder leftSideUnmanagedWaitEvent(CreateWin32EventOrThrow(NULL, kManualResetEvent, FALSE));
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
- }
- else
+ // Copy RSEA and RSER into the control block only if shared memory is created without error.
+ if (m_pDCB)
{
- if (m_pDCB)
- {
- hr = m_pDCB->Init(NULL, NULL, NULL, NULL, NULL);
- _ASSERTE(SUCCEEDED(hr)); // throws on error.
- }
+ // Since Init() gets ownership of handles as soon as it's called, we can
+ // release our ownership now.
+ rightSideEventAvailable.SuppressRelease();
+ rightSideEventRead.SuppressRelease();
+ leftSideUnmanagedWaitEvent.SuppressRelease();
+
+ // NOTE: initialization of the debugger control block occurs partly on the left side and partly on
+ // the right side. This initialization occurs in parallel, so it's unsafe to make assumptions about
+ // the order in which the fields will be initialized.
+ hr = m_pDCB->Init(rightSideEventAvailable,
+ rightSideEventRead,
+ NULL,
+ NULL,
+ leftSideUnmanagedWaitEvent);
+
+ _ASSERTE(SUCCEEDED(hr)); // throws on error.
}
-#endif
+#endif //FEATURE_DBGIPC_TRANSPORT_VM
if(m_pDCB)
{
@@ -751,7 +738,7 @@ HRESULT DebuggerRCThread::SetupRuntimeOffsets(DebuggerIPCControlBlock * pDebugge
#if !defined(FEATURE_CORESYSTEM)
// Grab the address of RaiseException in kernel32 because we have to play some games with exceptions
// that are generated there (just another reason why mixed mode debugging is shady). See bug 476768.
- HMODULE hModule = WszGetModuleHandle(W("kernel32.dll"));
+ HMODULE hModule = WszGetModuleHandle(W("kernel32.dll"));
_ASSERTE(hModule != NULL);
PREFAST_ASSUME(hModule != NULL);
pDebuggerRuntimeOffsets->m_raiseExceptionAddr = GetProcAddress(hModule, "RaiseException");
@@ -1060,14 +1047,8 @@ void DebuggerRCThread::RightSideDetach(void)
{
_ASSERTE( m_fDetachRightSide == false );
m_fDetachRightSide = true;
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(!useTransport)
- {
-#endif
- CloseIPCHandles();
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
- }
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM)
+ CloseIPCHandles();
#endif // !FEATURE_DBGIPC_TRANSPORT_VM
}
@@ -1127,53 +1108,40 @@ bool DebuggerRCThread::HandleRSEA()
LOG((LF_CORDB,LL_INFO10000, "RSEA from out of process (right side)\n"));
DebuggerIPCEvent * e;
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(!useTransport)
- {
-#endif
- // Make room for any Right Side event on the stack.
- BYTE buffer[CorDBIPC_BUFFER_SIZE];
- e = (DebuggerIPCEvent *) buffer;
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM)
+ // Make room for any Right Side event on the stack.
+ BYTE buffer[CorDBIPC_BUFFER_SIZE];
+ e = (DebuggerIPCEvent *) buffer;
- // If the RSEA is signaled, then handle the event from the Right Side.
- memcpy(e, GetIPCEventReceiveBuffer(), CorDBIPC_BUFFER_SIZE);
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
- }
- else
- {
- // Be sure to fetch the event into the official receive buffer since some event handlers assume it's there
- // regardless of the the event buffer pointer passed to them.
- e = GetIPCEventReceiveBuffer();
- g_pDbgTransport->GetNextEvent(e, CorDBIPC_BUFFER_SIZE);
- }
+ // If the RSEA is signaled, then handle the event from the Right Side.
+ memcpy(e, GetIPCEventReceiveBuffer(), CorDBIPC_BUFFER_SIZE);
+#else
+ // Be sure to fetch the event into the official receive buffer since some event handlers assume it's there
+ // regardless of the the event buffer pointer passed to them.
+ e = GetIPCEventReceiveBuffer();
+ g_pDbgTransport->GetNextEvent(e, CorDBIPC_BUFFER_SIZE);
#endif // !FEATURE_DBGIPC_TRANSPOPRT
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- if(!useTransport)
- {
-#endif
- // If no reply is required, then let the Right Side go since we've got a copy of the event now.
- _ASSERTE(!e->asyncSend || !e->replyRequired);
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM)
+ // If no reply is required, then let the Right Side go since we've got a copy of the event now.
+ _ASSERTE(!e->asyncSend || !e->replyRequired);
- if (!e->replyRequired && !e->asyncSend)
- {
- LOG((LF_CORDB, LL_INFO1000, "DRCT::ML: no reply required, letting Right Side go.\n"));
+ if (!e->replyRequired && !e->asyncSend)
+ {
+ LOG((LF_CORDB, LL_INFO1000, "DRCT::ML: no reply required, letting Right Side go.\n"));
- BOOL succ = SetEvent(m_pDCB->m_rightSideEventRead);
+ BOOL succ = SetEvent(m_pDCB->m_rightSideEventRead);
- if (!succ)
- CORDBDebuggerSetUnrecoverableWin32Error(m_debugger, 0, true);
- }
+ if (!succ)
+ CORDBDebuggerSetUnrecoverableWin32Error(m_debugger, 0, true);
+ }
#ifdef LOGGING
- else if (e->asyncSend)
- LOG((LF_CORDB, LL_INFO1000, "DRCT::ML: async send.\n"));
- else
- LOG((LF_CORDB, LL_INFO1000, "DRCT::ML: reply required, holding Right Side...\n"));
+ else if (e->asyncSend)
+ LOG((LF_CORDB, LL_INFO1000, "DRCT::ML: async send.\n"));
+ else
+ LOG((LF_CORDB, LL_INFO1000, "DRCT::ML: reply required, holding Right Side...\n"));
#endif
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
- }
-#endif // FEATURE_DBGIPC_TRANSPORT_VM
+#endif // !FEATURE_DBGIPC_TRANSPORT_VM
// Pass the event to the debugger for handling. Returns true if the event was a Continue event and we can
// stop looking for stragglers. We wrap this whole thing in an exception handler to help us debug faults.
@@ -1227,18 +1195,10 @@ void DebuggerRCThread::MainLoop()
DWORD dwWaitTimeout = INFINITE;
rghWaitSet[DRCT_CONTROL_EVENT] = m_threadControlEvent;
rghWaitSet[DRCT_FAVORAVAIL] = GetFavorAvailableEvent();
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(!useTransport)
- {
-#endif // !FEATURE_DBGIPC_TRANSPORT_VM
- rghWaitSet[DRCT_RSEA] = m_pDCB->m_rightSideEventAvailable;
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
- }
- else
- {
- rghWaitSet[DRCT_RSEA] = g_pDbgTransport->GetIPCEventReadyEvent();
- }
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM)
+ rghWaitSet[DRCT_RSEA] = m_pDCB->m_rightSideEventAvailable;
+#else
+ rghWaitSet[DRCT_RSEA] = g_pDbgTransport->GetIPCEventReadyEvent();
#endif // !FEATURE_DBGIPC_TRANSPORT_VM
CONTRACT_VIOLATION(ThrowsViolation);// HndCreateHandle throws, and this loop is not backstopped by any EH
@@ -1251,38 +1211,28 @@ void DebuggerRCThread::MainLoop()
{
LOG((LF_CORDB, LL_INFO1000, "DRCT::ML: waiting for event.\n"));
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(!useTransport)
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM)
+ // If there is a debugger attached, wait on its handle, too...
+ if ((cWaitCount == DRCT_COUNT_INITIAL) &&
+ m_pDCB->m_rightSideProcessHandle.ImportToLocalProcess() != NULL)
{
-#endif // FEATURE_DBGIPC_TRANSPORT_VM
- // If there is a debugger attached, wait on its handle, too...
- if ((cWaitCount == DRCT_COUNT_INITIAL) &&
- m_pDCB->m_rightSideProcessHandle.ImportToLocalProcess() != NULL)
- {
- _ASSERTE((cWaitCount + 1) == DRCT_COUNT_FINAL);
- rghWaitSet[DRCT_DEBUGGER_EVENT] = m_pDCB->m_rightSideProcessHandle;
- cWaitCount = DRCT_COUNT_FINAL;
- }
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
+ _ASSERTE((cWaitCount + 1) == DRCT_COUNT_FINAL);
+ rghWaitSet[DRCT_DEBUGGER_EVENT] = m_pDCB->m_rightSideProcessHandle;
+ cWaitCount = DRCT_COUNT_FINAL;
}
-#endif // FEATURE_DBGIPC_TRANSPORT_VM
+#endif // !FEATURE_DBGIPC_TRANSPORT_VM
+
if (m_fDetachRightSide)
{
m_fDetachRightSide = false;
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- if(!useTransport)
- {
-#endif
- _ASSERTE(cWaitCount == DRCT_COUNT_FINAL);
- _ASSERTE((cWaitCount - 1) == DRCT_COUNT_INITIAL);
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM)
+ _ASSERTE(cWaitCount == DRCT_COUNT_FINAL);
+ _ASSERTE((cWaitCount - 1) == DRCT_COUNT_INITIAL);
- rghWaitSet[DRCT_DEBUGGER_EVENT] = NULL;
- cWaitCount = DRCT_COUNT_INITIAL;
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- }
+ rghWaitSet[DRCT_DEBUGGER_EVENT] = NULL;
+ cWaitCount = DRCT_COUNT_INITIAL;
#endif // !FEATURE_DBGIPC_TRANSPORT_VM
}
@@ -1491,18 +1441,10 @@ void DebuggerRCThread::TemporaryHelperThreadMainLoop()
DWORD dwWaitTimeout = INFINITE;
rghWaitSet[DRCT_CONTROL_EVENT] = m_threadControlEvent;
rghWaitSet[DRCT_FAVORAVAIL] = GetFavorAvailableEvent();
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(!useTransport)
- {
-#endif
- rghWaitSet[DRCT_RSEA] = m_pDCB->m_rightSideEventAvailable;
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
- }
- else
- {
- rghWaitSet[DRCT_RSEA] = g_pDbgTransport->GetIPCEventReadyEvent();
- }
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM)
+ rghWaitSet[DRCT_RSEA] = m_pDCB->m_rightSideEventAvailable;
+#else //FEATURE_DBGIPC_TRANSPORT_VM
+ rghWaitSet[DRCT_RSEA] = g_pDbgTransport->GetIPCEventReadyEvent();
#endif // !FEATURE_DBGIPC_TRANSPORT_VM
CONTRACT_VIOLATION(ThrowsViolation);// HndCreateHandle throws, and this loop is not backstopped by any EH
@@ -2153,31 +2095,23 @@ HRESULT DebuggerRCThread::SendIPCReply()
IPCENames::GetName(event->type)));
#endif
-#if defined(FEATURE_DBGIPC_TRANSPORT_VM)
- DWORD useTransport = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_DbgUseTransport);
- if(!useTransport)
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM)
+ BOOL succ = SetEvent(m_pDCB->m_rightSideEventRead);
+ if (!succ)
{
-#endif
- BOOL succ = SetEvent(m_pDCB->m_rightSideEventRead);
- if (!succ)
- {
- hr = CORDBDebuggerSetUnrecoverableWin32Error(m_debugger, 0, false);
- }
-#ifdef FEATURE_DBGIPC_TRANSPORT_VM
+ hr = CORDBDebuggerSetUnrecoverableWin32Error(m_debugger, 0, false);
}
- else
+#else // !FEATURE_DBGIPC_TRANSPORT_VM
+ hr = g_pDbgTransport->SendEvent(GetIPCEventReceiveBuffer());
+ if (FAILED(hr))
{
- hr = g_pDbgTransport->SendEvent(GetIPCEventReceiveBuffer());
- if (FAILED(hr))
- {
- m_debugger->UnrecoverableError(hr,
- 0,
- __FILE__,
- __LINE__,
- false);
- }
+ m_debugger->UnrecoverableError(hr,
+ 0,
+ __FILE__,
+ __LINE__,
+ false);
}
-#endif // FEATURE_DBGIPC_TRANSPORT_VM
+#endif // !FEATURE_DBGIPC_TRANSPORT_VM
return hr;
}
diff --git a/src/debug/inc/coreclrremotedebugginginterfaces.h b/src/debug/inc/coreclrremotedebugginginterfaces.h
index 59c8399354..160c40d52b 100644
--- a/src/debug/inc/coreclrremotedebugginginterfaces.h
+++ b/src/debug/inc/coreclrremotedebugginginterfaces.h
@@ -13,52 +13,9 @@
#define __PORT_SUPPLIER_INTERFACES_INCLUDED
-#include <dbgproxy.h>
class ICoreClrDebugTarget;
-// Mscordbi exports a number of C functions to aid in starting up and shutting down the transport manager
-// (which owns communication with remote machines) and getting a connection to a particular machine's proxy
-// (known as a target).
-extern "C" HRESULT __stdcall InitDbgTransportManager();
-extern "C" void __stdcall ShutdownDbgTransportManager();
-extern "C" HRESULT __stdcall CreateCoreClrDebugTarget(DWORD dwAddress, ICoreClrDebugTarget **ppTarget);
-
-
-// Definition of the data that ICoreClrDebugTarget will return about a remote process.
-struct CoreClrDebugProcInfo
-{
- DWORD m_dwPID; // OS assigned process ID
- DWORD m_dwInternalID; // Proxy assigned process ID (recycles less often)
- WCHAR m_wszName[kMaxCommandLine]; // Command and args process is running (possibly truncated)
-};
-
-
-// Definition of the data that ICoreClrDebugTarget will return about a remote runtime instance.
-struct CoreClrDebugRuntimeInfo
-{
- DWORD m_dwInternalID; // Proxy assigned runtime instance ID
-};
-
-
-// This pseudo-COM interface is provided by mscordbi and called by the port supplier to query details of a
-// remote target.
-class ICoreClrDebugTarget
-{
-public:
- STDMETHOD_(void, AddRef)() PURE;
- STDMETHOD_(void, Release)() PURE;
-
- // Enumerate all user's processes on the target machine (whether they are running managed code or not).
- STDMETHOD(EnumProcesses)(DWORD *pcProcs, CoreClrDebugProcInfo **ppProcs) PURE;
-
- // Enumerate all runtimes running within the process indicated via the internal process ID.
- STDMETHOD(EnumRuntimes)(DWORD dwInternalProcessID, DWORD *pcRuntimes, CoreClrDebugRuntimeInfo **ppRuntimes) PURE;
-
- // Free memory returned by Enum* methods.
- STDMETHOD_(void, FreeMemory)(void *pMemory) PURE;
-};
-
#endif // __PORT_SUPPLIER_INTERFACES_INCLUDED
diff --git a/src/debug/inc/dbgtransportsession.h b/src/debug/inc/dbgtransportsession.h
index f028c0bbae..4f844ba984 100644
--- a/src/debug/inc/dbgtransportsession.h
+++ b/src/debug/inc/dbgtransportsession.h
@@ -11,33 +11,24 @@
#include <utilcode.h>
#include <crst.h>
-class InProcDac;
#endif // !RIGHT_SIDE_COMPILE
#if defined(FEATURE_DBGIPC_TRANSPORT_VM) || defined(FEATURE_DBGIPC_TRANSPORT_DI)
-#include <dbgsecureconnection.h>
+#include <twowaypipe.h>
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ DbgTransportSession was originally designed around cross-machine debugging via sockets and it is supposed to
+ handle network interruptions. Right now we use pipes (see TwoWaypipe) and don't expect to have connection issues.
+ But there seem to be no good reason to try hard to get rid of existing working protocol even if it's a bit
+ cautious about connection quality. So please KEEP IN MIND THAT SOME COMMENTS REFERING TO NETWORK AND SOCKETS
+ CAN BE OUTDATED.
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//
// Provides a robust and secure transport session between a debugger and a debuggee that are potentially on
// different machines.
//
-// The current implementation utilizes a single SSL/TCP connection down which all traffic is multi-plexed
-// (session management, debugger events and event acknowledgements and miscellaneous debugger requests and
-// responses). Robustness to transitory network failures is dealt with by automatically reforming the
-// connection and resending unacknowledged messages.
-//
-// Each session adds one thread to the process. This transport thread is responsible for the setting up and
-// tearing down of the low level TCP thread and all receive operations on that connection while it is active.
-// This organization simplifies a lot of synchronization and allows us to avoid any async connection
-// operations (keeping the code a lot simpler in general). Sends, on the other hand, can be made from
-// aribtrary thread contexts (including the transport thread) and must use a lock to serialize access to the
-// connection (as well as synchronize themselves with session state changes). This is all handled internally
-// and is not visible to the session client (the debugger or the debugger code in the runtime).
-//
-// Access to the underlying SSL (Secure Socket Layer) connection is abstracted since the SSL API varies
-// significantly between Windows and Mac. The abstraction is described in clr/inc/DbgSecureConnection.h.
-//
// The following terminology is used for the wire protocol. The smallest meaningful entity written to or read
// from the connection is a "message". This consists of one or maybe two "blocks" where a block is a
// contiguous region of memory in the host machine. The first block is always a "message header" which is
@@ -95,6 +86,25 @@ enum DbgTransportLogClass
LC_Always = 0xffffffff, // Always log, regardless of class setting
};
+// Status codes that can be returned by various APIs that indicate some conditions of the error that a caller
+// might usefully pass on to a user (environmental factors that the user might have some control over).
+enum ConnStatus
+{
+ SCS_Success, // The request succeeded
+ SCS_OutOfMemory, // The request failed due to a low memory situation
+ SCS_InvalidConfiguration, // Initialize() failed because the debugger settings were not configured or
+ // have become corrupt
+ SCS_UnknownTarget, // Connect() failed because the remote machine at the given address could not
+ // be found
+ SCS_NoListener, // Connect() failed because the remote machine was not listening for requests
+ // on the given port (most likely the remote machine is not configured for
+ // debugging)
+ SCS_NetworkFailure, // Connect() failed due to miscellaneous network error
+ SCS_MismatchedCerts, // Connect()/Accept() failed because the remote party was using a different
+ // cert
+};
+
+
// Multiple clients can use a single DbgTransportSession, but only one can act as the debugger.
// A valid DebugTicket is given to the client who is acting as the debugger.
struct DebugTicket
@@ -307,9 +317,9 @@ public:
// requires the addresses of a couple of runtime data structures to service certain debugger requests that
// may be delivered once the session is established.
#ifdef RIGHT_SIDE_COMPILE
- HRESULT Init(DWORD dwAddress, USHORT usPort, HANDLE hProcessExited);
+ HRESULT Init(DWORD pid, HANDLE hProcessExited);
#else // RIGHT_SIDE_COMPILE
- HRESULT Init(DebuggerIPCControlBlock * pDCB, AppDomainEnumerationIPCBlock * pADB, InProcDac * pInProcDac);
+ HRESULT Init(DebuggerIPCControlBlock * pDCB, AppDomainEnumerationIPCBlock * pADB);
#endif // RIGHT_SIDE_COMPILE
// Drive the session to the SS_Closed state, which will deallocate all remaining transport resources
@@ -342,10 +352,6 @@ public:
// A valid ticket is required in order for this function to succeed. After this function succeeds,
// another client can request to be the debugger.
bool StopUsingAsDebugger(DebugTicket * pTicket);
-#else // RIGHT_SIDE_COMPILE
- // The LS needs to be able to tell the code that registers with the debugger proxy which port it will wait
- // on for debugger connections. Returns the port number in host byte order.
- USHORT GetPort();
#endif // RIGHT_SIDE_COMPILE
// Sends a pre-initialized event to the other side.
@@ -373,10 +379,6 @@ public:
// Read the AppDomain control block on the LS from the RS.
HRESULT GetAppDomainCB(AppDomainEnumerationIPCBlock *pADB);
- // Send a DD message to the LS and wait for a reply before returning.
- // This is the low level function which DDMarshal and DDUnmarshal build on.
- // This is for the remoted IDacDbiInterface. See code:IEventChannel for more information.
- HRESULT SendDDMessage(PBYTE pbSendBuffer, DWORD cbSendBuffer, PBYTE * ppbReceiveBuffer, DWORD * pcbReceiveBuffer);
#endif // RIGHT_SIDE_COMPILE
private:
@@ -418,7 +420,6 @@ private:
MT_GetDCB, // RS <-> LS : RS wants to read LS DCB (or LS is replying to such a request)
MT_SetDCB, // RS <-> LS : RS wants to write LS DCB (or LS is replying to such a request)
MT_GetAppDomainCB, // RS <-> LS : RS wants to read LS AppDomainCB (or LS is replying to such a request)
- MT_DDMessage, // RS <-> LS : RS wants to call into the in-proc DAC on the LS (or LS is replying to such a request)
};
// Reasons the LS can give for rejecting a session. These codes should *not* be changed other than by
@@ -480,12 +481,6 @@ private:
Portable<DWORD> m_eType; // Event type (useful for debugging)
} Event;
- // Used by MT_DDMessage.
- struct
- {
- Portable<HRESULT> m_hrResult;
- Portable<DWORD> m_eType; // DDMessage type (useful for debugging)
- } DDMessage;
} TypeSpecificData;
BYTE m_sMustBeZero[8]; // Set this to zero when initializing and never read the contents
@@ -682,30 +677,16 @@ private:
// back into the Connect()/Accept() phase (along with the resulting session state change).
HANDLE m_hTransportThread;
- // Low level connection manager. This object provides the transport with secure connections on request.
- SecConnMgr *m_pConnectionManager;
-
- // Low level connection. This is updated only on the transport thread (while the connection is being
- // formed no other thread can peform a SendMessage() since the session state will never be Open, when the
- // connection is deallocated this must be done under m_sStateLock along with the associated state change
- // to ensure that no other thread can successfully SendMessage() on the connection).
- SecConn *m_pConnection;
+ TwoWayPipe m_pipe;
#ifdef RIGHT_SIDE_COMPILE
// On the RS the transport thread needs to know the IP address and port number to Connect() to.
- DWORD m_dwLeftSideAddress; // IPv4 address in host byte order
- USHORT m_usLeftSidePort; // TCP port number in host byte order
+ DWORD m_pid; // Id of a process we're talking to.
HANDLE m_hProcessExited; // event which will be signaled when the debuggee is terminated
bool m_fDebuggerAttached;
-#else // RIGHT_SIDE_COMPILE
- // On the LS we always listen for low level transport connect requests. This is done on a special listen
- // socket on which we call accept() followed by Accept(). If Accept() completes successfully it returns a
- // SecConn instance; that's the m_pConnection above.
- SOCKET m_hListenSocket;
- USHORT m_usListenPort; // TCP port number in host byte order
-#endif // RIGHT_SIDE_COMPILE
+#endif
// Debugger event handling. To improve performance we allow the debugger to send as many events as it
// likes without acknowledgement from its peer. While not strictly adhering to the semantic provided by
@@ -734,7 +715,6 @@ private:
// These are provided by the runtime at intialization time.
DebuggerIPCControlBlock *m_pDCB;
AppDomainEnumerationIPCBlock *m_pADB;
- InProcDac * m_pInProcDac;
#endif // !RIGHT_SIDE_COMPILE
HRESULT SendEventWorker(DebuggerIPCEvent * pEvent, IPCEventType type);
diff --git a/src/debug/inc/ddmarshalutil.h b/src/debug/inc/ddmarshalutil.h
index e3237da800..458477777f 100644
--- a/src/debug/inc/ddmarshalutil.h
+++ b/src/debug/inc/ddmarshalutil.h
@@ -15,7 +15,6 @@ typedef IDacDbiInterface::HeapWalkHandle HeapWalkHandle;
typedef IDacDbiInterface::IStringHolder IStringHolder;
#include "stringcopyholder.h"
-#include "ddshared.h"
// @dbgtodo Mac - cleanup the buffer classes here. (are there pre-existing classes we could use instead?)
// These ultimately get included in the signature for IDacDbiMarshalStub::DoRequest.
@@ -226,12 +225,6 @@ void WriteToBuffer(WriteBuffer * p, T * pData)
}
inline
-void WriteToBuffer(WriteBuffer * p, enum DD_MessageId data)
-{
- p->WriteBlob(&data, sizeof(data));
-}
-
-inline
void WriteToBuffer(WriteBuffer * p, StringCopyHolder * pString)
{
const WCHAR * pData = NULL;
@@ -327,13 +320,6 @@ void ReadFromBuffer(ReadBuffer * p, T * pData)
}
inline
-void ReadFromBuffer(ReadBuffer * p, enum DD_MessageId & data)
-{
- p->ReadBlob(&data, sizeof(DD_MessageId));
-}
-
-
-inline
void ReadFromBuffer(ReadBuffer * p, IStringHolder * pString)
{
const WCHAR *pData = p->ReadString();
diff --git a/src/debug/inc/ddshared.h b/src/debug/inc/ddshared.h
deleted file mode 100644
index 36a034cd01..0000000000
--- a/src/debug/inc/ddshared.h
+++ /dev/null
@@ -1,155 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-// Common auto-generated header between Packer + Unpacker
-// Shared template
-
-// This would be the place to define structs taht get passed back and forth.
-
-#ifndef _DD_SHARED_H_
-#define _DD_SHARED_H_
-
-// Header?
-// Define unique message ID for each DD interface
-enum DD_MessageId {
- DDID_CheckDbiVersion, // HRESULT CheckDbiVersion(const DbiVersion * pVersion)
- DDID_GetLocalInterfaceHashAndTimestamp, // void GetLocalInterfaceHashAndTimestamp(DWORD & hash1, DWORD & hash2, DWORD & hash3, DWORD & hash4, DWORD & timestamp1, DWORD & timestamp2)
- DDID_GetRemoteInterfaceHashAndTimestamp, // void GetRemoteInterfaceHashAndTimestamp(DWORD & hash1, DWORD & hash2, DWORD & hash3, DWORD & hash4, DWORD & timestamp1, DWORD & timestamp2)
- DDID_FlushCache, // HRESULT FlushCache()
- DDID_DacSetTargetConsistencyChecks, // void DacSetTargetConsistencyChecks(bool fEnableAsserts)
- DDID_Destroy, // void Destroy()
- DDID_IsLeftSideInitialized, // BOOL IsLeftSideInitialized()
- DDID_GetAppDomainFromId, // VMPTR_AppDomain GetAppDomainFromId(ULONG appdomainId)
- DDID_GetAppDomainId, // ULONG GetAppDomainId(VMPTR_AppDomain vmAppDomain)
- DDID_GetAppDomainObject, // VMPTR_OBJECTHANDLE GetAppDomainObject(VMPTR_AppDomain vmAppDomain)
- DDID_IsDefaultDomain, // BOOL IsDefaultDomain(VMPTR_AppDomain vmAppDomain)
- DDID_GetAssemblyFromDomainAssembly, // void GetAssemblyFromDomainAssembly(VMPTR_DomainAssembly vmDomainAssembly, VMPTR_Assembly * vmAssembly)
- DDID_IsAssemblyFullyTrusted, // BOOL IsAssemblyFullyTrusted(VMPTR_DomainAssembly vmDomainAssembly)
- DDID_GetAppDomainFullName, // void GetAppDomainFullName(VMPTR_AppDomain vmAppDomain, IStringHolder * pStrName)
- DDID_GetModuleSimpleName, // void GetModuleSimpleName(VMPTR_Module vmModule, IStringHolder * pStrFilename)
- DDID_GetAssemblyPath, // BOOL GetAssemblyPath(VMPTR_Assembly vmAssembly, IStringHolder * pStrFilename)
- DDID_ResolveTypeReference, // void ResolveTypeReference(const TypeRefData * pTypeRefInfo, TypeRefData * pTargetRefInfo)
- DDID_GetModulePath, // BOOL GetModulePath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
- DDID_GetModuleNGenPath, // BOOL GetModuleNGenPath(VMPTR_Module vmModule, IStringHolder * pStrFilename)
- DDID_GetMetadata, // void GetMetadata(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer)
- DDID_GetSymbolsBuffer, // void GetSymbolsBuffer(VMPTR_Module vmModule, TargetBuffer * pTargetBuffer, IDacDbiInterface::SymbolFormat * pSymbolFormat)
- DDID_GetModuleData, // void GetModuleData(VMPTR_Module vmModule, ModuleInfo * pData)
- DDID_GetDomainFileData, // void GetDomainFileData(VMPTR_DomainFile vmDomainFile, DomainFileInfo * pData)
- DDID_GetModuleForDomainFile, // void GetModuleForDomainFile(VMPTR_DomainFile vmDomainFile, VMPTR_Module * pModule)
- DDID_GetAddressType, // IDacDbiInterface::AddressType GetAddressType(CORDB_ADDRESS address)
- DDID_IsTransitionStub, // BOOL IsTransitionStub(CORDB_ADDRESS address)
- DDID_GetCompilerFlags, // void GetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL * pfAllowJITOpts, BOOL * pfEnableEnC)
- DDID_SetCompilerFlags, // HRESULT SetCompilerFlags(VMPTR_DomainFile vmDomainFile, BOOL fAllowJitOpts, BOOL fEnableEnC)
- DDID_EnumerateAppDomains, // void EnumerateAppDomains(IDacDbiInterface::FP_APPDOMAIN_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- DDID_EnumerateAssembliesInAppDomain, // void EnumerateAssembliesInAppDomain(VMPTR_AppDomain vmAppDomain, IDacDbiInterface::FP_ASSEMBLY_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- DDID_EnumerateModulesInAssembly, // void EnumerateModulesInAssembly(VMPTR_DomainAssembly vmAssembly, IDacDbiInterface::FP_MODULE_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- DDID_RequestSyncAtEvent, // void RequestSyncAtEvent()
- DDID_MarkDebuggerAttachPending, // void MarkDebuggerAttachPending()
- DDID_MarkDebuggerAttached, // void MarkDebuggerAttached(BOOL fAttached)
- DDID_Hijack, // void Hijack(VMPTR_Thread vmThread, ULONG32 dwThreadId, const EXCEPTION_RECORD * pRecord, T_CONTEXT * pOriginalContext, ULONG32 cbSizeContext, EHijackReason::EHijackReason reason, void * pUserData, CORDB_ADDRESS * pRemoteContextAddr)
- DDID_EnumerateConnections, // void EnumerateConnections(IDacDbiInterface::FP_CONNECTION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- DDID_EnumerateThreads, // void EnumerateThreads(IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- DDID_IsThreadMarkedDead, // bool IsThreadMarkedDead(VMPTR_Thread vmThread)
- DDID_GetThreadHandle, // HANDLE GetThreadHandle(VMPTR_Thread vmThread)
- DDID_GetThreadObject, // VMPTR_OBJECTHANDLE GetThreadObject(VMPTR_Thread vmThread)
- DDID_SetDebugState, // void SetDebugState(VMPTR_Thread vmThread, CorDebugThreadState debugState)
- DDID_HasUnhandledException, // BOOL HasUnhandledException(VMPTR_Thread vmThread)
- DDID_GetUserState, // CorDebugUserState GetUserState(VMPTR_Thread vmThread)
- DDID_GetConnectionID, // CONNID GetConnectionID(VMPTR_Thread vmThread)
- DDID_GetTaskID, // TASKID GetTaskID(VMPTR_Thread vmThread)
- DDID_TryGetVolatileOSThreadID, // DWORD TryGetVolatileOSThreadID(VMPTR_Thread vmThread)
- DDID_GetUniqueThreadID, // DWORD GetUniqueThreadID(VMPTR_Thread vmThread)
- DDID_GetCurrentException, // VMPTR_OBJECTHANDLE GetCurrentException(VMPTR_Thread vmThread)
- DDID_GetCurrentCustomDebuggerNotification, // VMPTR_OBJECTHANDLE GetCurrentCustomDebuggerNotification(VMPTR_Thread vmThread)
- DDID_GetCurrentAppDomain, // VMPTR_AppDomain GetCurrentAppDomain(VMPTR_Thread vmThread)
- DDID_ResolveAssembly, // VMPTR_DomainAssembly ResolveAssembly(VMPTR_DomainFile vmScope, mdToken tkAssemblyRef)
- DDID_GetNativeCodeSequencePointsAndVarInfo, // void GetNativeCodeSequencePointsAndVarInfo(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS startAddress, BOOL fCodeAvailabe, NativeVarData * pNativeVarData, SequencePoints * pSequencePoints)
- DDID_GetManagedStoppedContext, // VMPTR_CONTEXT GetManagedStoppedContext(VMPTR_Thread vmThread)
- DDID_CreateStackWalk, // void CreateStackWalk(VMPTR_Thread vmThread, DT_CONTEXT * pInternalContextBuffer, StackWalkHandle * ppSFIHandle)
- DDID_DeleteStackWalk, // void DeleteStackWalk(StackWalkHandle ppSFIHandle)
- DDID_GetStackWalkCurrentContext, // void GetStackWalkCurrentContext(StackWalkHandle pSFIHandle, DT_CONTEXT * pContext)
- DDID_SetStackWalkCurrentContext, // void SetStackWalkCurrentContext(VMPTR_Thread vmThread, StackWalkHandle pSFIHandle, CorDebugSetContextFlag flag, DT_CONTEXT * pContext)
- DDID_UnwindStackWalkFrame, // BOOL UnwindStackWalkFrame(StackWalkHandle pSFIHandle)
- DDID_CheckContext, // HRESULT CheckContext(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
- DDID_GetStackWalkCurrentFrameInfo, // IDacDbiInterface::FrameType GetStackWalkCurrentFrameInfo(StackWalkHandle pSFIHandle, DebuggerIPCE_STRData * pFrameData)
- DDID_GetCountOfInternalFrames, // ULONG32 GetCountOfInternalFrames(VMPTR_Thread vmThread)
- DDID_EnumerateInternalFrames, // void EnumerateInternalFrames(VMPTR_Thread vmThread, IDacDbiInterface::FP_INTERNAL_FRAME_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- DDID_IsMatchingParentFrame, // BOOL IsMatchingParentFrame(FramePointer fpToCheck, FramePointer fpParent)
- DDID_GetStackParameterSize, // ULONG32 GetStackParameterSize(CORDB_ADDRESS controlPC)
- DDID_GetFramePointer, // FramePointer GetFramePointer(StackWalkHandle pSFIHandle)
- DDID_IsLeafFrame, // BOOL IsLeafFrame(VMPTR_Thread vmThread, const DT_CONTEXT * pContext)
- DDID_GetContext, // void GetContext(VMPTR_Thread vmThread, DT_CONTEXT * pContextBuffer)
- DDID_ConvertContextToDebuggerRegDisplay, // void ConvertContextToDebuggerRegDisplay(const DT_CONTEXT * pInContext, DebuggerREGDISPLAY * pOutDRD, BOOL fActive)
- DDID_IsILStubOrLCGMethod, // IDacDbiInterface::DynamicMethodType IsILStubOrLCGMethod(VMPTR_MethodDesc vmMethodDesc)
- DDID_GetVarArgSig, // TargetBuffer GetVarArgSig(CORDB_ADDRESS VASigCookieAddr, CORDB_ADDRESS * pArgBase)
- DDID_RequiresAlign8, // BOOL RequiresAlign8(VMPTR_TypeHandle thExact)
- DDID_ResolveExactGenericArgsToken, // GENERICS_TYPE_TOKEN ResolveExactGenericArgsToken(DWORD dwExactGenericArgsTokenIndex, GENERICS_TYPE_TOKEN rawToken)
- DDID_GetILCodeAndSig, // void GetILCodeAndSig(VMPTR_DomainFile vmDomainFile, mdToken functionToken, TargetBuffer * pCodeInfo, mdToken * pLocalSigToken)
- DDID_GetNativeCodeInfo, // void GetNativeCodeInfo(VMPTR_DomainFile vmDomainFile, mdToken functionToken, NativeCodeFunctionData * pCodeInfo)
- DDID_GetNativeCodeInfoForAddr, // void GetNativeCodeInfoForAddr(VMPTR_MethodDesc vmMethodDesc, CORDB_ADDRESS hotCodeStartAddr, NativeCodeFunctionData * pCodeInfo)
- DDID_GetClassInfo, // void GetClassInfo(VMPTR_AppDomain vmAppDomain, VMPTR_Module vmModule, mdTypeDef metadataToken, VMPTR_TypeHandle thExact, VMPTR_TypeHandle thApprox, ClassInfo * pData)
- DDID_GetInstantiationFieldInfo, // void GetInstantiationFieldInfo(VMPTR_DomainFile vmDomainFile, mdTypeDef metadataToken, VMPTR_TypeHandle vmThExact, VMPTR_TypeHandle vmThApprox, DacDbiArrayList<FieldData> * pFieldList, SIZE_T * pObjectSize)
- DDID_TypeHandleToExpandedTypeInfo, // void TypeHandleToExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
- DDID_GetObjectExpandedTypeInfo, // void GetObjectExpandedTypeInfo(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, CORDB_ADDRESS addr, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
- DDID_GetObjectExpandedTypeInfoFromID, // void GetObjectExpandedTypeInfoFromID(AreValueTypesBoxed boxed, VMPTR_AppDomain vmAppDomain, COR_TYPEID id, DebuggerIPCE_ExpandedTypeData * pTypeInfo)
- DDID_GetApproxTypeHandle, // VMPTR_TypeHandle GetApproxTypeHandle(TypeInfoList * pTypeData)
- DDID_GetExactTypeHandle, // HRESULT GetExactTypeHandle(DebuggerIPCE_ExpandedTypeData * pTypeData, ArgInfoList * pArgInfo, VMPTR_TypeHandle & vmTypeHandle)
- DDID_GetMethodDescParams, // void GetMethodDescParams(VMPTR_AppDomain vmAppDomain, VMPTR_MethodDesc vmMethodDesc, GENERICS_TYPE_TOKEN genericsToken, UINT32 * pcGenericClassTypeParams, TypeParamsList * pGenericTypeParams)
- DDID_GetThreadOrContextStaticAddress, // CORDB_ADDRESS GetThreadOrContextStaticAddress(VMPTR_FieldDesc vmField, VMPTR_Thread vmRuntimeThread)
- DDID_GetCollectibleTypeStaticAddress, // CORDB_ADDRESS GetCollectibleTypeStaticAddress(VMPTR_FieldDesc vmField, VMPTR_AppDomain vmAppDomain)
- DDID_GetEnCHangingFieldInfo, // void GetEnCHangingFieldInfo(const EnCHangingFieldInfo * pEnCFieldInfo, FieldData * pFieldData, BOOL * pfStatic)
- DDID_GetTypeHandleParams, // void GetTypeHandleParams(VMPTR_AppDomain vmAppDomain, VMPTR_TypeHandle vmTypeHandle, TypeParamsList * pParams)
- DDID_GetSimpleType, // void GetSimpleType(VMPTR_AppDomain vmAppDomain, CorElementType simpleType, mdTypeDef * pMetadataToken, VMPTR_Module * pVmModule, VMPTR_DomainFile * pVmDomainFile)
- DDID_IsExceptionObject, // BOOL IsExceptionObject(VMPTR_Object vmObject)
- DDID_GetStackFramesFromException, // void GetStackFramesFromException(VMPTR_Object vmObject, DacDbiArrayList<DacExceptionCallStackData> & dacStackFrames)
- DDID_IsRcw, // BOOL IsRcw(VMPTR_Object vmObject)
- DDID_GetRcwCachedInterfaceTypes, // void GetRcwCachedInterfaceTypes(VMPTR_Object vmObject, VMPTR_AppDomain vmAppDomain, BOOL bIInspectableOnly, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pDacInterfaces)
- DDID_GetRcwCachedInterfacePointers, // void GetRcwCachedInterfacePointers(VMPTR_Object vmObject, BOOL bIInspectableOnly, DacDbiArrayList<CORDB_ADDRESS> * pDacItfPtrs)
- DDID_GetCachedWinRTTypesForIIDs, // void GetCachedWinRTTypesForIIDs(VMPTR_AppDomain vmAppDomain, DacDbiArrayList<GUID> & iids, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes)
- DDID_GetCachedWinRTTypes, // void GetCachedWinRTTypes(VMPTR_AppDomain vmAppDomain, DacDbiArrayList<GUID> * piids, DacDbiArrayList<DebuggerIPCE_ExpandedTypeData> * pTypes)
- DDID_GetTypedByRefInfo, // void GetTypedByRefInfo(CORDB_ADDRESS pTypedByRef, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
- DDID_GetStringData, // void GetStringData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
- DDID_GetArrayData, // void GetArrayData(CORDB_ADDRESS objectAddress, DebuggerIPCE_ObjectData * pObjectData)
- DDID_GetBasicObjectInfo, // void GetBasicObjectInfo(CORDB_ADDRESS objectAddress, CorElementType type, VMPTR_AppDomain vmAppDomain, DebuggerIPCE_ObjectData * pObjectData)
- DDID_TestCrst, // void TestCrst(VMPTR_Crst vmCrst)
- DDID_TestRWLock, // void TestRWLock(VMPTR_SimpleRWLock vmRWLock)
- DDID_GetDebuggerControlBlockAddress, // CORDB_ADDRESS GetDebuggerControlBlockAddress()
- DDID_GetObjectFromRefPtr, // VMPTR_Object GetObjectFromRefPtr(CORDB_ADDRESS ptr)
- DDID_GetObject, // VMPTR_Object GetObject(CORDB_ADDRESS ptr)
- DDID_EnableNGENPolicy, // HRESULT EnableNGENPolicy(CorDebugNGENPolicy ePolicy)
- DDID_GetVmObjectHandle, // VMPTR_OBJECTHANDLE GetVmObjectHandle(CORDB_ADDRESS handleAddress)
- DDID_IsVmObjectHandleValid, // BOOL IsVmObjectHandleValid(VMPTR_OBJECTHANDLE vmHandle)
- DDID_IsWinRTModule, // HRESULT IsWinRTModule(VMPTR_Module vmModule, BOOL & isWinRT)
- DDID_GetAppDomainIdFromVmObjectHandle, // ULONG GetAppDomainIdFromVmObjectHandle(VMPTR_OBJECTHANDLE vmHandle)
- DDID_GetHandleAddressFromVmHandle, // CORDB_ADDRESS GetHandleAddressFromVmHandle(VMPTR_OBJECTHANDLE vmHandle)
- DDID_GetObjectContents, // TargetBuffer GetObjectContents(VMPTR_Object obj)
- DDID_EnumerateBlockingObjects, // void EnumerateBlockingObjects(VMPTR_Thread vmThread, IDacDbiInterface::FP_BLOCKINGOBJECT_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- DDID_GetThreadOwningMonitorLock, // MonitorLockInfo GetThreadOwningMonitorLock(VMPTR_Object vmObject)
- DDID_EnumerateMonitorEventWaitList, // void EnumerateMonitorEventWaitList(VMPTR_Object vmObject, IDacDbiInterface::FP_THREAD_ENUMERATION_CALLBACK fpCallback, CALLBACK_DATA pUserData)
- DDID_GetAttachStateFlags, // CLR_DEBUGGING_PROCESS_FLAGS GetAttachStateFlags()
- DDID_GetMetaDataFileInfoFromPEFile, // bool GetMetaDataFileInfoFromPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwImageSize, bool & isNGEN, IStringHolder * pStrFilename)
- DDID_GetILImageInfoFromNgenPEFile, // bool GetILImageInfoFromNgenPEFile(VMPTR_PEFile vmPEFile, DWORD & dwTimeStamp, DWORD & dwSize, IStringHolder * pStrFilename)
- DDID_IsThreadSuspendedOrHijacked, // bool IsThreadSuspendedOrHijacked(VMPTR_Thread vmThread)
- DDID_AreGCStructuresValid, // bool AreGCStructuresValid()
- DDID_CreateHeapWalk, // HRESULT CreateHeapWalk(HeapWalkHandle * pHandle)
- DDID_DeleteHeapWalk, // void DeleteHeapWalk(HeapWalkHandle handle)
- DDID_WalkHeap, // HRESULT WalkHeap(HeapWalkHandle handle, ULONG count, COR_HEAPOBJECT * objects, ULONG * pFetched)
- DDID_GetHeapSegments, // HRESULT GetHeapSegments(DacDbiArrayList<COR_SEGMENT> * pSegments)
- DDID_IsValidObject, // bool IsValidObject(CORDB_ADDRESS obj)
- DDID_GetAppDomainForObject, // bool GetAppDomainForObject(CORDB_ADDRESS obj, VMPTR_AppDomain * pApp, VMPTR_Module * pModule, VMPTR_DomainFile * pDomainFile)
- DDID_CreateRefWalk, // HRESULT CreateRefWalk(RefWalkHandle * pHandle, BOOL walkStacks, BOOL walkFQ, UINT32 handleWalkMask)
- DDID_DeleteRefWalk, // void DeleteRefWalk(RefWalkHandle handle)
- DDID_WalkRefs, // HRESULT WalkRefs(RefWalkHandle handle, ULONG count, DacGcReference * refs, ULONG * pFetched)
- DDID_GetTypeID, // HRESULT GetTypeID(CORDB_ADDRESS obj, COR_TYPEID * pType)
- DDID_GetObjectFields, // HRESULT GetObjectFields(COR_TYPEID id, ULONG32 celt, COR_FIELD * layout, ULONG32 * pceltFetched)
- DDID_GetTypeLayout, // HRESULT GetTypeLayout(COR_TYPEID id, COR_TYPE_LAYOUT * pLayout)
- DDID_GetArrayLayout, // HRESULT GetArrayLayout(COR_TYPEID id, COR_ARRAY_LAYOUT * pLayout)
- DDID_GetGCHeapInformation, // void GetGCHeapInformation(COR_HEAPINFO * pHeapInfo)
-}; // end enum MessageIds
-
-
-#endif // _DD_SHARED_H_
-
-// End of file
diff --git a/src/debug/inc/debug-pal.h b/src/debug/inc/debug-pal.h
new file mode 100644
index 0000000000..90cf0c822e
--- /dev/null
+++ b/src/debug/inc/debug-pal.h
@@ -0,0 +1,16 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+
+#ifndef Debug_PAL_H
+#define Debug_PAL_H
+
+#if defined(FEATURE_PAL)
+// This function looks for a dynamic module (libraryName) loaded into the process specified (pId)
+// and returns its load address. NULL is module is not loaded.
+void *GetDynamicLibraryAddressInProcess(DWORD pid, const char *libraryName);
+#endif
+
+#endif //Debug_PAL_H \ No newline at end of file
diff --git a/src/debug/inc/twowaypipe.h b/src/debug/inc/twowaypipe.h
new file mode 100644
index 0000000000..83dc28caf4
--- /dev/null
+++ b/src/debug/inc/twowaypipe.h
@@ -0,0 +1,99 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+
+#ifndef TwoWayPipe_H
+#define TwoWayPipe_H
+
+#ifdef FEATURE_PAL
+#define INVALID_PIPE -1
+#else
+#define INVALID_PIPE INVALID_HANDLE_VALUE
+#endif
+
+// This file contains definition of a simple IPC mechanism - bidirectional named pipe.
+// It is implemented on top of two one-directional names pipes (fifos on UNIX)
+
+// One Windows it is possible to ask OS to create a bidirectional pipe, but it is not the case on UNIX.
+// In order to unify implementation we use two pipes on all systems.
+
+// This all methods of this class are *NOT* thread safe: it is assumed the caller provides synchronization at a higher level.
+class TwoWayPipe
+{
+public:
+ enum State
+ {
+ NotInitialized, // Object didn't create or connect to any pipes.
+ Created, // Server side of the pipe has been created, but didn't bind it to a client.
+ ServerConnected, // Server side of the pipe is connected to a client
+ ClientConnected, // Client side of the pipe is connected to a server.
+ };
+
+ TwoWayPipe()
+ :m_state(NotInitialized),
+ m_inboundPipe(INVALID_PIPE),
+ m_outboundPipe(INVALID_PIPE)
+ {}
+
+
+ ~TwoWayPipe()
+ {
+ Disconnect();
+ }
+
+ // Creates a server side of the pipe.
+ // Id is used to create pipes names and uniquely identify the pipe on the machine.
+ // true - success, false - failure (use GetLastError() for more details)
+ bool CreateServer(DWORD id);
+
+ // Connects to a previously opened server side of the pipe.
+ // Id is used to locate the pipe on the machine.
+ // true - success, false - failure (use GetLastError() for more details)
+ bool Connect(DWORD id);
+
+ // Waits for incoming client connections, assumes GetState() == Created
+ // true - success, false - failure (use GetLastError() for more details)
+ bool WaitForConnection();
+
+ // Reads data from pipe. Returns number of bytes read or a negative number in case of an error.
+ // use GetLastError() for more details
+ int Read(void *buffer, DWORD bufferSize);
+
+ // Writes data to pipe. Returns number of bytes written or a negative number in case of an error.
+ // use GetLastError() for more details
+ int Write(const void *data, DWORD dataSize);
+
+ // Disconnects server or client side of the pipe.
+ // true - success, false - failure (use GetLastError() for more details)
+ bool Disconnect();
+
+ State GetState()
+ {
+ return m_state;
+ }
+
+private:
+
+ State m_state;
+
+
+#ifdef FEATURE_PAL
+ int m_id; //id that was passed to CreateServer() or Connect()
+ int m_inboundPipe, m_outboundPipe; //two one sided pipes used for communication
+
+#else
+ // Connects to a one sided pipe previously created by CreateOneWayPipe.
+ // In order to successfully connect id and inbound flag should be the same.
+ HANDLE OpenOneWayPipe(DWORD id, bool inbound);
+
+ // Creates a one way pipe, id and inboud flag are used for naming.
+ // Created pipe is supposed to be connected to by OpenOneWayPipe.
+ HANDLE CreateOneWayPipe(DWORD id, bool inbound);
+
+ HANDLE m_inboundPipe, m_outboundPipe; //two one sided pipes used for communication
+#endif //FEATURE_PAL
+};
+
+#endif //TwoWayPipe_H \ No newline at end of file
diff --git a/src/debug/shared/dbgtransportsession.cpp b/src/debug/shared/dbgtransportsession.cpp
index 8182a3ed9e..76c582a477 100644
--- a/src/debug/shared/dbgtransportsession.cpp
+++ b/src/debug/shared/dbgtransportsession.cpp
@@ -8,215 +8,6 @@
#if (!defined(RIGHT_SIDE_COMPILE) && defined(FEATURE_DBGIPC_TRANSPORT_VM)) || (defined(RIGHT_SIDE_COMPILE) && defined(FEATURE_DBGIPC_TRANSPORT_DI))
-#include <ddshared.h>
-
-#ifdef RIGHT_SIDE_COMPILE
-static const char *DDDescribe(DWORD dwCode) // @ARMTODO: remove this; brittle temporary logging
-{
- switch (dwCode)
- {
- case DDID_CheckDbiVersion:
- return "CheckDbiVersion";
- case DDID_FlushCache:
- return "FlushCache";
- case DDID_DacSetTargetConsistencyChecks:
- return "DacSetTargetConsistencyChecks";
- case DDID_Destroy:
- return "Destroy";
- case DDID_IsLeftSideInitialized:
- return "IsLeftSideInitialized";
- case DDID_GetAppDomainFromId:
- return "GetAppDomainFromId";
- case DDID_GetAppDomainId:
- return "GetAppDomainId";
- case DDID_IsDefaultDomain:
- return "IsDefaultDomain";
- case DDID_IsAssemblyFullyTrusted:
- return "IsAssemblyFullyTrusted";
- case DDID_GetAppDomainFullName:
- return "GetAppDomainFullName";
- case DDID_GetModuleSimpleName:
- return "GetModuleSimpleName";
- case DDID_GetAssemblyPath:
- return "GetAssemblyPath";
- case DDID_ResolveTypeReference:
- return "ResolveTypeReference";
- case DDID_GetModulePath:
- return "GetModulePath";
- case DDID_GetModuleNGenPath:
- return "GetModuleNGenPath";
- case DDID_GetMetadata:
- return "GetMetadata";
- case DDID_GetSymbolsBuffer:
- return "GetSymbolsBuffer";
- case DDID_GetModuleData:
- return "GetModuleData";
- case DDID_GetAddressType:
- return "GetAddressType";
- case DDID_IsTransitionStub:
- return "IsTransitionStub";
- case DDID_GetCompilerFlags:
- return "GetCompilerFlags";
- case DDID_SetCompilerFlags:
- return "SetCompilerFlags";
- case DDID_EnumerateAppDomains:
- return "EnumerateAppDomains";
- case DDID_EnumerateAssembliesInAppDomain:
- return "EnumerateAssembliesInAppDomain";
- case DDID_EnumerateModulesInAssembly:
- return "EnumerateModulesInAssembly";
- case DDID_RequestSyncAtEvent:
- return "RequestSyncAtEvent";
- case DDID_MarkDebuggerAttachPending:
- return "MarkDebuggerAttachPending";
- case DDID_MarkDebuggerAttached:
- return "MarkDebuggerAttached";
- case DDID_Hijack:
- return "Hijack";
- case DDID_EnumerateConnections:
- return "EnumerateConnections";
- case DDID_EnumerateThreads:
- return "EnumerateThreads";
- case DDID_IsThreadMarkedDead:
- return "IsThreadMarkedDead";
- case DDID_GetThreadHandle:
- return "GetThreadHandle";
- case DDID_GetThreadObject:
- return "GetThreadObject";
- case DDID_SetDebugState:
- return "SetDebugState";
- case DDID_HasUnhandledException:
- return "HasUnhandledException";
- case DDID_GetUserState:
- return "GetUserState";
- case DDID_GetConnectionID:
- return "GetConnectionID";
- case DDID_GetTaskID:
- return "GetTaskID";
- case DDID_TryGetVolatileOSThreadID:
- return "TryGetVolatileOSThreadID";
- case DDID_GetUniqueThreadID:
- return "GetUniqueThreadID";
- case DDID_GetCurrentException:
- return "GetCurrentException";
- case DDID_GetCurrentCustomDebuggerNotification:
- return "GetCurrentCustomDebuggerNotification";
- case DDID_GetCurrentAppDomain:
- return "GetCurrentAppDomain";
- case DDID_ResolveAssembly:
- return "ResolveAssembly";
- case DDID_GetNativeCodeSequencePointsAndVarInfo:
- return "GetNativeCodeSequencePointsAndVarInfo";
- case DDID_GetManagedStoppedContext:
- return "GetManagedStoppedContext";
- case DDID_CreateStackWalk:
- return "CreateStackWalk";
- case DDID_DeleteStackWalk:
- return "DeleteStackWalk";
- case DDID_GetStackWalkCurrentContext:
- return "GetStackWalkCurrentContext";
- case DDID_SetStackWalkCurrentContext:
- return "SetStackWalkCurrentContext";
- case DDID_UnwindStackWalkFrame:
- return "UnwindStackWalkFrame";
- case DDID_CheckContext:
- return "CheckContext";
- case DDID_GetStackWalkCurrentFrameInfo:
- return "GetStackWalkCurrentFrameInfo";
- case DDID_GetCountOfInternalFrames:
- return "GetCountOfInternalFrames";
- case DDID_EnumerateInternalFrames:
- return "EnumerateInternalFrames";
- case DDID_IsMatchingParentFrame:
- return "IsMatchingParentFrame";
- case DDID_GetStackParameterSize:
- return "GetStackParameterSize";
- case DDID_GetFramePointer:
- return "GetFramePointer";
- case DDID_IsLeafFrame:
- return "IsLeafFrame";
- case DDID_GetContext:
- return "GetContext";
- case DDID_ConvertContextToDebuggerRegDisplay:
- return "ConvertContextToDebuggerRegDisplay";
- case DDID_IsILStubOrLCGMethod:
- return "IsILStubOrLCGMethod";
- case DDID_GetVarArgSig:
- return "GetVarArgSig";
- case DDID_ResolveExactGenericArgsToken:
- return "ResolveExactGenericArgsToken";
- case DDID_GetILCodeAndSig:
- return "GetILCodeAndSig";
- case DDID_GetNativeCodeInfo:
- return "GetNativeCodeInfo";
- case DDID_GetClassInfo:
- return "GetClassInfo";
- case DDID_GetInstantiationFieldInfo:
- return "GetInstantiationFieldInfo";
- case DDID_TypeHandleToExpandedTypeInfo:
- return "TypeHandleToExpandedTypeInfo";
- case DDID_GetApproxTypeHandle:
- return "GetApproxTypeHandle";
- case DDID_GetExactTypeHandle:
- return "GetExactTypeHandle";
- case DDID_GetMethodDescParams:
- return "GetMethodDescParams";
- case DDID_GetThreadOrContextStaticAddress:
- return "GetThreadOrContextStaticAddress";
- case DDID_GetCollectibleTypeStaticAddress:
- return "GetCollectibleTypeStaticAddress";
- case DDID_GetEnCHangingFieldInfo:
- return "GetEnCHangingFieldInfo";
- case DDID_GetTypeHandleParams:
- return "GetTypeHandleParams";
- case DDID_GetSimpleType:
- return "GetSimpleType";
- case DDID_GetTypedByRefInfo:
- return "GetTypedByRefInfo";
- case DDID_GetStringData:
- return "GetStringData";
- case DDID_GetArrayData:
- return "GetArrayData";
- case DDID_GetBasicObjectInfo:
- return "GetBasicObjectInfo";
- case DDID_TestCrst:
- return "TestCrst";
- case DDID_TestRWLock:
- return "TestRWLock";
- case DDID_GetDebuggerControlBlockAddress:
- return "GetDebuggerControlBlockAddress";
- case DDID_GetObjectFromRefPtr:
- return "GetObjectFromRefPtr";
- case DDID_GetObject:
- return "GetObject";
- case DDID_GetVmObjectHandle:
- return "GetVmObjectHandle";
- case DDID_GetHandleAddressFromVmHandle:
- return "GetHandleAddressFromVmHandle";
- case DDID_GetObjectContents:
- return "GetObjectContents";
- case DDID_EnumerateBlockingObjects:
- return "EnumerateBlockingObjects";
- case DDID_GetThreadOwningMonitorLock:
- return "GetThreadOwningMonitorLock";
- case DDID_EnumerateMonitorEventWaitList:
- return "EnumerateMonitorEventWaitList";
- case DDID_GetAttachStateFlags:
- return "GetAttachStateFlags";
- case DDID_GetMetaDataFileInfoFromPEFile:
- return "GetMetaDataFileInfoFromPEFile";
- case DDID_GetILImageInfoFromNgenPEFile:
- return "GetILImageInfoFromNgenPEFile";
- default:
- {
- static char szBuffer[256];
- sprintf_s(szBuffer, sizeof(szBuffer), "<invalid type %u>", dwCode);
- return szBuffer;
- }
- }
-}
-#endif // RIGHT_SIDE_COMPILE
-
// This is the entry type for the IPC event queue owned by the transport.
// Each entry contains the multiplexing type of the IPC event plus the
// IPC event itself.
@@ -239,7 +30,6 @@ public:
// Debugger::Startup() in debugger.cpp).
DbgTransportSession *g_pDbgTransport = NULL;
-#include "inprocdac.h"
#include "ddmarshalutil.h"
#endif // !RIGHT_SIDE_COMPILE
@@ -256,9 +46,9 @@ DbgTransportSession::DbgTransportSession()
// addresses of a couple of runtime data structures to service certain debugger requests that may be delivered
// once the session is established.
#ifdef RIGHT_SIDE_COMPILE
-HRESULT DbgTransportSession::Init(DWORD dwAddress, USHORT usPort, HANDLE hProcessExited)
+HRESULT DbgTransportSession::Init(DWORD pid, HANDLE hProcessExited)
#else // RIGHT_SIDE_COMPILE
-HRESULT DbgTransportSession::Init(DebuggerIPCControlBlock *pDCB, AppDomainEnumerationIPCBlock *pADB, InProcDac * pInProcDac)
+HRESULT DbgTransportSession::Init(DebuggerIPCControlBlock *pDCB, AppDomainEnumerationIPCBlock *pADB)
#endif // RIGHT_SIDE_COMPILE
{
_ASSERTE(m_eState == SS_Closed);
@@ -266,9 +56,6 @@ HRESULT DbgTransportSession::Init(DebuggerIPCControlBlock *pDCB, AppDomainEnumer
// Start with a blank slate so that Shutdown() on a partially initialized instance will only do the
// cleanup necessary.
memset(this, 0, sizeof(*this));
-#ifndef RIGHT_SIDE_COMPILE
- m_hListenSocket = INVALID_SOCKET;
-#endif // !RIGHT_SIDE_COMPILE
// Initialize all per-session state variables.
InitSessionState();
@@ -280,49 +67,11 @@ HRESULT DbgTransportSession::Init(DebuggerIPCControlBlock *pDCB, AppDomainEnumer
HRESULT hr = CoCreateGuid(&m_sSessionID);
if (FAILED(hr))
return hr;
-#else // RIGHT_SIDE_COMPILE
- // The left-side still requires WinSock since it's our responsibility to allocate a socket on which to
- // listen for raw TCP connection requests.
-
- // Initialize WinSock and check that it supports version 2.2.
- WSADATA wsaData;
- int err = WSAStartup(MAKEWORD(2, 2), &wsaData);
- if (err)
- {
- _ASSERTE(!"WinSock failed to initialize");
- return HRESULT_FROM_WIN32(DBG_GET_LAST_WSA_ERROR());
- }
- m_fInitWSA = true;
-
- if (LOBYTE(wsaData.wVersion) != 2 ||
- HIBYTE(wsaData.wVersion) != 2)
- {
- _ASSERTE(!"WinSock doesn't support version 2.2");
- return E_FAIL;
- }
#endif // RIGHT_SIDE_COMPILE
- // Allocate and initialize the manager object from which we obtain secure connections.
- m_pConnectionManager = AllocateSecConnMgr();
- if (m_pConnectionManager == NULL)
- return E_OUTOFMEMORY;
- SecConnStatus eStatus = m_pConnectionManager->Initialize();
- if (eStatus != SCS_Success)
- {
- switch (eStatus)
- {
- case SCS_OutOfMemory:
- return E_OUTOFMEMORY;
- case SCS_InvalidConfiguration:
- return E_INVALIDARG;
- default:
- return E_FAIL;
- }
- }
#ifdef RIGHT_SIDE_COMPILE
- m_dwLeftSideAddress = dwAddress;
- m_usLeftSidePort = usPort;
+ m_pid = pid;
if (!DuplicateHandle(GetCurrentProcess(),
hProcessExited,
@@ -339,7 +88,6 @@ HRESULT DbgTransportSession::Init(DebuggerIPCControlBlock *pDCB, AppDomainEnumer
#else // RIGHT_SIDE_COMPILE
m_pDCB = pDCB;
m_pADB = pADB;
- m_pInProcDac = pInProcDac;
#endif // RIGHT_SIDE_COMPILE
m_sStateLock.Init();
@@ -351,43 +99,6 @@ HRESULT DbgTransportSession::Init(DebuggerIPCControlBlock *pDCB, AppDomainEnumer
return E_OUTOFMEMORY;
#endif // RIGHT_SIDE_COMPILE
-#ifndef RIGHT_SIDE_COMPILE
- // Socket used to listen for connection attempts.
- m_hListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (m_hListenSocket == INVALID_SOCKET)
- return E_OUTOFMEMORY;
-
- // Setup local endpoint information for bind.
- sockaddr_in listenEndpointAddress;
- listenEndpointAddress.sin_family = AF_INET;
- listenEndpointAddress.sin_port = 0; // Dynamically assigned port
- listenEndpointAddress.sin_addr.S_un.S_addr = INADDR_ANY;
- memset(&(listenEndpointAddress.sin_zero), 0, 8);
-
- // Bind endpoint address to listening socket.
- err = bind(m_hListenSocket,
- (sockaddr*)&listenEndpointAddress,
- sizeof(sockaddr_in));
- if (err == SOCKET_ERROR)
- return E_FAIL;
-
- // Find out which port we were assigned, we'll need to supply this information to the debugger proxy soon.
- int cbAddress = sizeof(sockaddr_in);
- err = getsockname(m_hListenSocket,
- (sockaddr*)&listenEndpointAddress,
- &cbAddress);
- if (err == SOCKET_ERROR)
- return E_FAIL;
- m_usListenPort = DBGIPC_NTOHS(listenEndpointAddress.sin_port);
-
- // Set up socket for listening. A depth of 1 is fine here, we don't expect more than one debugger
- // connection at once (and even if we get more we can't support it so we'd have to fail the extra
- // connection attempt anyway).
- err = listen(m_hListenSocket, 1);
- if (err == SOCKET_ERROR)
- return E_FAIL;
-#endif // !RIGHT_SIDE_COMPILE
-
// Allocate some buffers to receive incoming events. The initial number is chosen arbitrarily, tune as
// necessary. This array will need to grow if it fills with unread events (it takes our client a little
// time to process each incoming receive). In general, however, one side will not send an unbounded stream
@@ -449,39 +160,11 @@ void DbgTransportSession::Shutdown()
SessionState ePreviousState = m_eState;
m_eState = SS_Closed;
- // We want to shutdown the transport thread but it might be stuck in a blocking transport call
- // (accept() or Receive()). Perform a closesocket() or CancelReceive() if the state indicates this
- // is a valid thing to do. This will cancel any operation in progress and give the thread a chance
- // to notice the state transition we just made. The thread will clean up the socket resources for
- // us before exiting.
-
- // Unblock Receive() when we know m_hConnectionSocket is valid.
- // The session may already be in a closed state if there is a critical error on the session thread
- // (e.g. unexpected message while setting up the connection with the debuggee).
if ((ePreviousState != SS_Opening_NC) && (ePreviousState != SS_Resync_NC) && (ePreviousState != SS_Closed))
{
- _ASSERTE(m_pConnection != NULL);
- m_pConnection->CancelReceive();
+ m_pipe.Disconnect();
}
-#ifndef RIGHT_SIDE_COMPILE
- // On the LS we might be stuck in a accept() if our state was SS_Opening_NC or SS_Resync_NC (the RS
- // doesn't get stuck because Connect() won't block for an unbounded amount of time).
- if (ePreviousState == SS_Opening_NC || ePreviousState == SS_Resync_NC)
- {
- //We can't assert this... this code doesn't run atomically with respect to the connection setup
- //code. When we entered the NC state we didn't have a connection, but at some point before exiting
- //that state we do have a connection.
- //_ASSERTE(m_pConnection == NULL);
- _ASSERTE(m_hListenSocket != INVALID_SOCKET);
- // Shutdown() doesn't appear to be enough to budge an accept(). Use closesocket() instead
- // (there's a tiny race here, but it's very, very unlikely the haven't hit the accept() call
- // yet in this state).
- closesocket(m_hListenSocket);
- m_hListenSocket = INVALID_SOCKET;
- }
-#endif // !RIGHT_SIDE_COMPILE
-
} // Leave m_sStateLock
#ifdef RIGHT_SIDE_COMPILE
@@ -513,23 +196,11 @@ void DbgTransportSession::Shutdown()
{
CloseHandle(m_hProcessExited);
}
-#else
- if (m_hListenSocket != INVALID_SOCKET)
- closesocket(m_hListenSocket);
#endif // RIGHT_SIDE_COMPILE
if (m_fInitStateLock)
m_sStateLock.Destroy();
- // No further connection operations.
- if (m_pConnectionManager)
- m_pConnectionManager->Destroy();
-
-#ifndef RIGHT_SIDE_COMPILE
- // No further socket operations.
- if (m_fInitWSA)
- WSACleanup();
-#endif // !RIGHT_SIDE_COMPILE
}
#ifndef RIGHT_SIDE_COMPILE
@@ -628,13 +299,6 @@ bool DbgTransportSession::StopUsingAsDebugger(DebugTicket * pTicket)
return false;
}
}
-#else // RIGHT_SIDE_COMPILE
-// The LS needs to be able to tell the code that registers with the debugger proxy which port it will wait
-// on for debugger connections. Returns the port number in host byte order.
-USHORT DbgTransportSession::GetPort()
-{
- return m_usListenPort;
-}
#endif // RIGHT_SIDE_COMPILE
// Sends a pre-initialized event to the other side.
@@ -808,9 +472,9 @@ HRESULT DbgTransportSession::ReadMemory(PBYTE pbRemoteAddress, PBYTE pbBuffer, S
DBG_TRANSPORT_INC_STAT(SentReadMemory);
Message sMessage;
- sMessage.Init(MT_ReadMemory, NULL, 0, pbBuffer, cbBuffer);
+ sMessage.Init(MT_ReadMemory, NULL, 0, pbBuffer, (DWORD)cbBuffer);
sMessage.m_sHeader.TypeSpecificData.MemoryAccess.m_pbLeftSideBuffer = pbRemoteAddress;
- sMessage.m_sHeader.TypeSpecificData.MemoryAccess.m_cbLeftSideBuffer = cbBuffer;
+ sMessage.m_sHeader.TypeSpecificData.MemoryAccess.m_cbLeftSideBuffer = (DWORD)cbBuffer;
HRESULT hr = SendRequestMessageAndWait(&sMessage);
if (FAILED(hr))
@@ -827,9 +491,9 @@ HRESULT DbgTransportSession::WriteMemory(PBYTE pbRemoteAddress, PBYTE pbBuffer,
DBG_TRANSPORT_INC_STAT(SentWriteMemory);
Message sMessage;
- sMessage.Init(MT_WriteMemory, pbBuffer, cbBuffer);
+ sMessage.Init(MT_WriteMemory, pbBuffer, (DWORD)cbBuffer);
sMessage.m_sHeader.TypeSpecificData.MemoryAccess.m_pbLeftSideBuffer = pbRemoteAddress;
- sMessage.m_sHeader.TypeSpecificData.MemoryAccess.m_cbLeftSideBuffer = cbBuffer;
+ sMessage.m_sHeader.TypeSpecificData.MemoryAccess.m_cbLeftSideBuffer = (DWORD)cbBuffer;
HRESULT hr = SendRequestMessageAndWait(&sMessage);
if (FAILED(hr))
@@ -880,56 +544,6 @@ HRESULT DbgTransportSession::GetAppDomainCB(AppDomainEnumerationIPCBlock *pADB)
return SendRequestMessageAndWait(&sMessage);
}
-//-----------------------------------------------------------------------------
-//
-// Send a DDMessage to the LS.
-//
-// Arguments:
-// pbSendBuffer - byte array to be sent to the LS
-// cbSendBuffer - number of bytes in pbSendBuffer
-// ppbReceiveBuffer - out parameter; return the byte array sent back by the LS; caller owns the returned memory
-// pcbReceiveBuffer - out parameter; number of bytes in *ppbReceiveBuffer
-//
-// Return Value:
-// S_OK if successful
-//
-// Notes:
-// This function blocks until a reply is received.
-//
-
-HRESULT DbgTransportSession::SendDDMessage(PBYTE pbSendBuffer, DWORD cbSendBuffer, PBYTE * ppbReceiveBuffer, DWORD * pcbReceiveBuffer)
-{
- DbgTransportLog(LC_Requests, "Sending 'DDMessage(0x%08X, %u) [%s]'", pbSendBuffer, cbSendBuffer, DDDescribe(*(DWORD*)pbSendBuffer));
- DBG_TRANSPORT_INC_STAT(SentDDMessage);
-
- // Passing NULL as the reply block will cause the transport to allocate memory for the reply block for us.
- // The problem here is that we have no idea how big the reply block is going to be.
- Message sMessage;
- sMessage.Init(MT_DDMessage, pbSendBuffer, cbSendBuffer, NULL, 0);
-
-#if defined(_DEBUG)
- _ASSERTE(cbSendBuffer >= 4);
- sMessage.m_sHeader.TypeSpecificData.DDMessage.m_eType = *reinterpret_cast<DWORD *>(pbSendBuffer);
-#endif
-
- HRESULT hr = SendRequestMessageAndWait(&sMessage);
- if (FAILED(hr))
- {
- if (sMessage.m_pbReplyBlock)
- {
- delete [] sMessage.m_pbReplyBlock;
- }
- return hr;
- }
-
- // Transfer ownership of the reply block to the caller
- *ppbReceiveBuffer = sMessage.m_pbReplyBlock;
- *pcbReceiveBuffer = sMessage.m_cbReplyBlock;
-
- // If we reached here but m_hrResult is a failure HR, then the IDacDbiInterface call on the LS was
- // sucessful, but there were somoe other problems at the DDUnpack level on the LS.
- return sMessage.m_sHeader.TypeSpecificData.DDMessage.m_hrResult;
-}
#endif // RIGHT_SIDE_COMPILE
// Worker function for code:DbgTransportSession::SendEvent and code:DbgTransportSession::SendDebugEvent.
@@ -1170,7 +784,7 @@ HRESULT DbgTransportSession::SendRequestMessageAndWait(Message *pMessage)
bool DbgTransportSession::SendBlock(PBYTE pbBuffer, DWORD cbBuffer)
{
_ASSERTE(m_eState == SS_Opening || m_eState == SS_Resync || m_eState == SS_Open);
- _ASSERTE(m_pConnectionManager != NULL);
+ _ASSERTE(m_pipe.GetState() == TwoWayPipe::ServerConnected || m_pipe.GetState() == TwoWayPipe::ClientConnected);
_ASSERTE(cbBuffer > 0);
DBG_TRANSPORT_INC_STAT(SentBlocks);
@@ -1181,7 +795,7 @@ bool DbgTransportSession::SendBlock(PBYTE pbBuffer, DWORD cbBuffer)
if (DBG_TRANSPORT_SHOULD_INJECT_FAULT(Send))
fSuccess = false;
else
- fSuccess = m_pConnection->Send(pbBuffer, cbBuffer);
+ fSuccess = (m_pipe.Write(pbBuffer, cbBuffer) == cbBuffer);
if (!fSuccess)
{
@@ -1200,7 +814,7 @@ bool DbgTransportSession::SendBlock(PBYTE pbBuffer, DWORD cbBuffer)
// state).
bool DbgTransportSession::ReceiveBlock(PBYTE pbBuffer, DWORD cbBuffer)
{
- _ASSERTE(m_pConnection != NULL);
+ _ASSERTE(m_pipe.GetState() == TwoWayPipe::ServerConnected || m_pipe.GetState() == TwoWayPipe::ClientConnected);
_ASSERTE(cbBuffer > 0);
DBG_TRANSPORT_INC_STAT(ReceivedBlocks);
@@ -1212,7 +826,7 @@ bool DbgTransportSession::ReceiveBlock(PBYTE pbBuffer, DWORD cbBuffer)
if (DBG_TRANSPORT_SHOULD_INJECT_FAULT(Receive))
fSuccess = false;
else
- fSuccess = m_pConnection->Receive(pbBuffer, cbBuffer);
+ fSuccess = (m_pipe.Read(pbBuffer, cbBuffer) == cbBuffer);
if (!fSuccess)
{
@@ -1274,8 +888,7 @@ void DbgTransportSession::HandleNetworkError(bool fCallerHoldsStateLock)
// we'll call CancelReceive() to abort the operation. The transport thread itself will handle the
// actual Destroy() (having one thread do this management greatly simplifies things).
m_eState = SS_Resync_NC;
- _ASSERTE(m_pConnection != NULL);
- m_pConnection->CancelReceive();
+ m_pipe.Disconnect();
break;
default:
@@ -1312,8 +925,7 @@ void DbgTransportSession::FlushSendQueue(DWORD dwLastProcessedId)
eType != MT_WriteMemory &&
eType != MT_GetDCB &&
eType != MT_SetDCB &&
- eType != MT_GetAppDomainCB &&
- eType != MT_DDMessage)
+ eType != MT_GetAppDomainCB)
#endif // RIGHT_SIDE_COMPILE
{
#ifdef RIGHT_SIDE_COMPILE
@@ -1366,21 +978,9 @@ bool DbgTransportSession::ProcessReply(MessageHeader *pHeader)
return true;
}
- // If there is a reply block but the caller hasn't specified a reply buffer, then allocate a buffer for
- // the caller. This is used if the caller doesn't know ahead of time how much memory is needed for the
- // reply. Currently this is only used for sending DDMessages from the RS to the LS. The caller is
- // responsible for freeing the buffer.
- if ((pHeader->m_cbDataBlock != (DWORD)0) && (pMsg->m_pbReplyBlock == (PBYTE)NULL))
- {
- _ASSERTE(pHeader->m_eType == MT_DDMessage);
-
- pMsg->m_pbReplyBlock = new (nothrow) BYTE[pHeader->m_cbDataBlock];
- if (pMsg->m_pbReplyBlock == NULL)
- {
- return false;
- }
- pMsg->m_cbReplyBlock = pHeader->m_cbDataBlock;
- }
+ // If there is a reply block but the caller hasn't specified a reply buffer.
+ // This combination is not used any more.
+ _ASSERTE(! ((pHeader->m_cbDataBlock != (DWORD)0) && (pMsg->m_pbReplyBlock == (PBYTE)NULL)) );
// If there was an output buffer provided then we copy the data block in the reply into it (perhaps
// decrypting it first). If the reply header indicates there is no data block then presumably the request
@@ -1536,7 +1136,7 @@ HRESULT DbgTransportSession::CheckBufferAccess(__in_ecount(cbBuffer) PBYTE pbBuf
if ((pbBuffer + cbBuffer) > ((PBYTE)sMemInfo.BaseAddress + sMemInfo.RegionSize))
{
PBYTE pbRegionEnd = reinterpret_cast<PBYTE>(sMemInfo.BaseAddress) + sMemInfo.RegionSize;
- cbBuffer = (pbBuffer + cbBuffer) - pbRegionEnd;
+ cbBuffer = (DWORD)((pbBuffer + cbBuffer) - pbRegionEnd);
pbBuffer = pbRegionEnd;
}
else
@@ -1594,8 +1194,7 @@ DWORD WINAPI DbgTransportSession::TransportWorkerStatic(LPVOID pvContext)
// origin.
#define HANDLE_TRANSIENT_ERROR() do { \
HandleNetworkError(false); \
- m_pConnection->Destroy(); \
- m_pConnection = NULL; \
+ m_pipe.Disconnect(); \
goto ResetConnection; \
} while (false)
@@ -1621,7 +1220,6 @@ void DbgTransportSession::TransportWorker()
while (m_eState != SS_Closed)
{
_ASSERTE(m_eState == SS_Opening_NC || m_eState == SS_Resync_NC || m_eState == SS_Closed);
- _ASSERTE(m_pConnection == NULL);
DbgTransportLog(LC_Proxy, "Forming new connection");
@@ -1633,54 +1231,55 @@ void DbgTransportSession::TransportWorker()
// little while and retrying (the LS may take a little while to set up). If there's nobody listening
// the debugger will eventually get bored waiting for us and shutdown the session, which will
// terminate this loop.
- SecConnStatus eStatus;
+ ConnStatus eStatus;
if (DBG_TRANSPORT_SHOULD_INJECT_FAULT(Connect))
eStatus = SCS_NetworkFailure;
else
- eStatus = m_pConnectionManager->AllocateConnection(m_dwLeftSideAddress,
- m_usLeftSidePort,
- &m_pConnection);
+ {
+ if (m_pipe.Connect(m_pid))
+ {
+ eStatus = SCS_Success;
+ }
+ else
+ {
+ //not really sure that this is the real failure
+ //TODO: we probably need to analyse GetErrorCode() here
+ eStatus = SCS_NoListener;
+ }
+ }
+
if (eStatus != SCS_Success)
{
DbgTransportLog(LC_Proxy, "AllocateConnection() failed with %u\n", eStatus);
DBG_TRANSPORT_INC_STAT(MiscErrors);
- _ASSERTE(m_pConnection == NULL);
+ _ASSERTE(m_pipe.GetState() != TwoWayPipe::ClientConnected);
Sleep(1000);
continue;
}
#else // RIGHT_SIDE_COMPILE
- // On the left side we always listen for a connection request from the right side. Init() has already
- // allocated a listen socket for us, bound it to our local endpoint and set the listen depth. All we
- // have to do is a (blocking) accept() call to finalize the TCP connection followed by a
- // (non-blocking) Accept() call to create the SSL connection. This can be aborted by a Shutdown() (in
- // which case we'll see the SS_Closed state and exit). On network failure we'll wait a little while
- // and try again, much like the right side.
- sockaddr_in acceptEndpointAddress;
- int acceptAddressLen = sizeof(sockaddr_in);
- SOCKET hConnectionSocket = accept(m_hListenSocket,
- (sockaddr*)&acceptEndpointAddress,
- &acceptAddressLen);
- if (hConnectionSocket == INVALID_SOCKET)
- {
- DbgTransportLog(LC_NetErrors, "Network error %08X on accept()",
- HRESULT_FROM_WIN32(DBG_GET_LAST_WSA_ERROR()));
- DBG_TRANSPORT_INC_STAT(MiscErrors);
- Sleep(1000);
- continue;
- }
-
- SecConnStatus eStatus;
+ ConnStatus eStatus;
if (DBG_TRANSPORT_SHOULD_INJECT_FAULT(Accept))
eStatus = SCS_NetworkFailure;
else
- eStatus = m_pConnectionManager->Accept(hConnectionSocket, &m_pConnection);
+ {
+ DWORD pid = GetCurrentProcessId();
+ if (m_pipe.CreateServer(pid) && m_pipe.WaitForConnection())
+ {
+ eStatus = SCS_Success;
+ }
+ else
+ {
+ //not really sure that this is the real failure
+ //TODO: we probably need to analyse GetErrorCode() here
+ eStatus = SCS_NoListener;
+ }
+ }
if (eStatus != SCS_Success)
{
DbgTransportLog(LC_Proxy, "Accept() failed with %u\n", eStatus);
DBG_TRANSPORT_INC_STAT(MiscErrors);
- _ASSERTE(m_pConnection == NULL);
- closesocket(hConnectionSocket);
+ _ASSERTE(m_pipe.GetState() != TwoWayPipe::ServerConnected);
Sleep(1000);
continue;
}
@@ -1708,24 +1307,6 @@ void DbgTransportSession::TransportWorker()
_ASSERTE(!"Bad session state");
} // Leave m_sStateLock
-#ifdef RIGHT_SIDE_COMPILE
- // On the RS we still need to establish a SSL connection. We do this by calling Connect().
- // Surprisingly, the call to connect() doesn't fail even if the LS is not accepting any more
- // connection request. This means that we may block forever in Connect() when we try to receive
- // data from the LS for setting up a SSL connection. We need some way for another thread to unblock
- // us by calling CancelReceive(). This is why we need to allocate the SecConn above before we
- // actually try to establish a SSL connection.
- eStatus = m_pConnection->Connect();
- if (eStatus != SCS_Success)
- {
- DbgTransportLog(LC_Proxy, "Connect() failed with %u\n", eStatus);
- DBG_TRANSPORT_INC_STAT(MiscErrors);
- m_pConnection->Destroy();
- m_pConnection = NULL;
- Sleep(1000);
- continue;
- }
-#endif // RIGHT_SIDE_COMPILE
// Now we have a connection in place. Start reading messages and processing them. Which messages are
// valid depends on whether we're in SS_Opening or SS_Resync (the state can change at any time
@@ -1867,8 +1448,7 @@ void DbgTransportSession::TransportWorker()
// Check none of the sends failed.
if (m_eState != SS_Opening)
{
- m_pConnection->Destroy();
- m_pConnection = NULL;
+ m_pipe.Disconnect();
continue;
}
} // Leave m_sStateLock
@@ -2015,8 +1595,7 @@ void DbgTransportSession::TransportWorker()
break;
else if (m_eState == SS_Resync_NC)
{
- m_pConnection->Destroy();
- m_pConnection = NULL;
+ m_pipe.Disconnect();
continue;
}
else
@@ -2040,7 +1619,7 @@ void DbgTransportSession::TransportWorker()
// Since we care about security here, perform some additional validation checks that make it
// harder for a malicious sender to attack with random message data.
- if (sReceiveHeader.m_eType > MT_DDMessage ||
+ if (sReceiveHeader.m_eType > MT_GetAppDomainCB ||
(sReceiveHeader.m_dwId <= m_dwLastMessageIdSeen &&
sReceiveHeader.m_dwId != (DWORD)0) ||
(sReceiveHeader.m_dwReplyId >= m_dwNextMessageId &&
@@ -2146,8 +1725,7 @@ void DbgTransportSession::TransportWorker()
break;
}
- m_pConnection->Destroy();
- m_pConnection = NULL;
+ m_pipe.Disconnect();
// We could add code to drain the send queue here (like we have for SS_Closed at the end of
// this method) but I'm pretty sure we can only get a graceful session close with no
@@ -2368,47 +1946,6 @@ void DbgTransportSession::TransportWorker()
#endif // RIGHT_SIDE_COMPILE
break;
- case MT_DDMessage:
-#ifdef RIGHT_SIDE_COMPILE
- if (!ProcessReply(&sReceiveHeader))
- HANDLE_TRANSIENT_ERROR();
-#else // RIGHT_SIDE_COMPILE
- fReplyRequired = true;
-
- // Allocate memory for the pay load.
- BYTE * pbReceiveBuffer;
- pbReceiveBuffer = new (nothrow) BYTE[sReceiveHeader.m_cbDataBlock];
- if (pbReceiveBuffer == NULL)
- {
- HANDLE_TRANSIENT_ERROR();
- }
-
- // Receive the pay load.
- if (!ReceiveBlock(pbReceiveBuffer, sReceiveHeader.m_cbDataBlock))
- {
- delete [] pbReceiveBuffer;
- HANDLE_TRANSIENT_ERROR();
- }
-
- // Initialize a ReadBuffer. It takes ownership of the memory and will free it
- // in its destructor.
- receiveBuffer.OpenAndOwn(pbReceiveBuffer, sReceiveHeader.m_cbDataBlock);
-
- // Call the InProcDac which will utlimately call into the DacDbiInterfaceImpl.
- // Note that this is called on the transport thread.
- hr = m_pInProcDac->DoRequest(&receiveBuffer, &resultBuffer);
- sReceiveHeader.TypeSpecificData.DDMessage.m_hrResult = hr;
-
- // Getting the raw ptr - resultBuffer still owns the memory
- // make sure pbOptReplyData does not outlive resultBuffer or
- // the pointer will dangle.
- if (SUCCEEDED(hr))
- {
- resultBuffer.GetRawPtr(&pbOptReplyData, &cbOptReplyData);
- }
-#endif // RIGHT_SIDE_COMPILE
- break;
-
default:
_ASSERTE(!"Unknown message type");
HANDLE_CRITICAL_ERROR();
@@ -2472,13 +2009,8 @@ void DbgTransportSession::TransportWorker()
ResetEvent(m_hSessionOpenEvent);
#endif // RIGHT_SIDE_COMPILE
- // Close the connection socket if we haven't done so already. No race here, only the transport thread ever
- // closes the connection socket.
- if (m_pConnection)
- {
- m_pConnection->Destroy();
- m_pConnection = NULL;
- }
+ // Close the connection if we haven't done so already.
+ m_pipe.Disconnect();
// Drain any remaining entries in the send queue (aborting them when they need completions).
{
@@ -2519,7 +2051,6 @@ void DbgTransportSession::TransportWorker()
case MT_GetDCB:
case MT_SetDCB:
case MT_GetAppDomainCB:
- case MT_DDMessage:
// On the RS these are the original requests. Signal the completion event.
SignalReplyEvent(pMsg);
break;
@@ -2529,7 +2060,6 @@ void DbgTransportSession::TransportWorker()
case MT_GetDCB:
case MT_SetDCB:
case MT_GetAppDomainCB:
- case MT_DDMessage:
// On the LS these are replies to the original request. Nobody's waiting on these.
break;
#endif // RIGHT_SIDE_COMPILE
@@ -2908,8 +2438,6 @@ const char *DbgTransportSession::MessageName(MessageType eType)
return "SetDCB";
case MT_GetAppDomainCB:
return "GetAppDomainCB";
- case MT_DDMessage:
- return "DDMessage";
default:
_ASSERTE(!"Unknown message type");
return NULL;
@@ -2972,12 +2500,6 @@ void DbgTransportSession::DbgTransportLogMessageReceived(MessageHeader *pHeader)
DbgTransportLog(LC_Requests, "Received 'GetAppDomainCB' reply");
DBG_TRANSPORT_INC_STAT(ReceivedGetAppDomainCB);
return;
- case MT_DDMessage:
- DbgTransportLog(LC_Requests, "Received 'DDMessage(%u) [%s]' reply",
- (DWORD)pHeader->TypeSpecificData.DDMessage.m_eType,
- DDDescribe(pHeader->TypeSpecificData.DDMessage.m_eType));
- DBG_TRANSPORT_INC_STAT(ReceivedDDMessage);
- return;
#else // RIGHT_SIDE_COMPILE
case MT_ReadMemory:
DbgTransportLog(LC_Requests, "Received 'ReadMemory(0x%08X, %u)'",
@@ -3003,11 +2525,6 @@ void DbgTransportSession::DbgTransportLogMessageReceived(MessageHeader *pHeader)
DbgTransportLog(LC_Requests, "Received 'GetAppDomainCB'");
DBG_TRANSPORT_INC_STAT(ReceivedGetAppDomainCB);
return;
- case MT_DDMessage:
- DbgTransportLog(LC_Requests, "Received 'DDMessage(%u)'",
- (DWORD)pHeader->TypeSpecificData.DDMessage.m_eType);
- DBG_TRANSPORT_INC_STAT(ReceivedDDMessage);
- return;
#endif // RIGHT_SIDE_COMPILE
default:
_ASSERTE(!"Unknown message type");
diff --git a/src/debug/shared/utils.cpp b/src/debug/shared/utils.cpp
index 78e680d4ec..f67d6073be 100644
--- a/src/debug/shared/utils.cpp
+++ b/src/debug/shared/utils.cpp
@@ -71,6 +71,9 @@ CORDB_ADDRESS IsEventDebuggerNotification(
return NULL;
}
+ // TODO: We don't do this check in case of non-windows debugging now, because we don't support
+ // multi-instance debugging.
+#if !defined(FEATURE_DBGIPC_TRANSPORT_VM) && !defined(FEATURE_DBGIPC_TRANSPORT_DI)
// If base-address doesn't match, then it's likely an event from another version of the CLR
// in the target.
// We need to be careful here. CORDB_ADDRESS is a ULONG64, whereas ExceptionInformation[1]
@@ -80,6 +83,7 @@ CORDB_ADDRESS IsEventDebuggerNotification(
{
return NULL;
}
+#endif
// It passes all the format checks. So now get the payload.
CORDB_ADDRESS ptrRemoteManagedEvent = GetExceptionInfoAsAddress(pRecord, 2);
diff --git a/src/dlls/mscordbi/CMakeLists.txt b/src/dlls/mscordbi/CMakeLists.txt
index 5d1cf42e50..09e20e87d3 100644
--- a/src/dlls/mscordbi/CMakeLists.txt
+++ b/src/dlls/mscordbi/CMakeLists.txt
@@ -26,6 +26,7 @@ add_library(mscordbi SHARED
)
set(COREDBI_LIBRARIES
+ debug-pal
cordbdi
utilcodestaticnohost
ildbsymlib
diff --git a/src/dlls/mscordbi/mscordbi.src b/src/dlls/mscordbi/mscordbi.src
index 747ec0c98c..fb8d8b0ef0 100644
--- a/src/dlls/mscordbi/mscordbi.src
+++ b/src/dlls/mscordbi/mscordbi.src
@@ -25,9 +25,6 @@ EXPORTS
#endif // FEATURE_CORECLR
#if defined(FEATURE_DBGIPC_TRANSPORT_DI)
- InitDbgTransportManager
- ShutdownDbgTransportManager
- CreateCoreClrDebugTarget
DllGetClassObject private
#endif // FEATURE_DBGIPC_TRANSPORT_DI
diff --git a/src/dlls/mscoree/coreclr/CMakeLists.txt b/src/dlls/mscoree/coreclr/CMakeLists.txt
index f1a0270ca0..6deb2f2019 100644
--- a/src/dlls/mscoree/coreclr/CMakeLists.txt
+++ b/src/dlls/mscoree/coreclr/CMakeLists.txt
@@ -42,6 +42,7 @@ endif (CLR_CMAKE_PLATFORM_UNIX)
# library.
set(CORECLR_LIBRARIES
utilcode
+ debug-pal
${START_LIBRARY_GROUP} # Start group of libraries that have circular references
cordbee_wks
${LIB_UNWINDER}
diff --git a/src/inc/clrconfigvalues.h b/src/inc/clrconfigvalues.h
index e2fd665c01..6bfa645af4 100644
--- a/src/inc/clrconfigvalues.h
+++ b/src/inc/clrconfigvalues.h
@@ -242,7 +242,7 @@ CONFIG_DWORD_INFO_DIRECT_ACCESS(INTERNAL_DbgTransportLog, W("DbgTransportLog"),
CONFIG_DWORD_INFO_DIRECT_ACCESS(INTERNAL_DbgTransportLogClass, W("DbgTransportLogClass"), "mask to control what is logged in DbgTransportLog")
RETAIL_CONFIG_STRING_INFO_EX(UNSUPPORTED_DbgTransportProxyAddress, W("DbgTransportProxyAddress"), "allows specifying the transport proxy address", CLRConfig::REGUTIL_default)
CONFIG_DWORD_INFO_EX(INTERNAL_DbgTrapOnSkip, W("DbgTrapOnSkip"), 0, "allows breaking when we skip a breakpoint", CLRConfig::REGUTIL_default)
-RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_DbgUseTransport, W("DbgUseTransport"), 0, "Allows using the debug transport (1) or regular mscordbi debugging (0)")
+RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_DbgWaitForDebuggerAttach, W("DbgWaitForDebuggerAttach"), 0, "Makes CoreCLR wait for a managed debugger to attach on process start (1) or regular process start (0)")
CONFIG_DWORD_INFO_EX(INTERNAL_DbgWaitTimeout, W("DbgWaitTimeout"), 1, "specifies the timeout value for waits", CLRConfig::REGUTIL_default)
RETAIL_CONFIG_DWORD_INFO_EX(UNSUPPORTED_DbgWFDETimeout, W("DbgWFDETimeout"), 25, "specifies the timeout value for wait when waiting for a debug event", CLRConfig::REGUTIL_default)
CONFIG_DWORD_INFO_EX(INTERNAL_RaiseExceptionOnAssert, W("RaiseExceptionOnAssert"), 0, "Raise a first chance (if set to 1) or second chance (if set to 2) exception on asserts.", CLRConfig::REGUTIL_default)
diff --git a/src/inc/dbgproxy.h b/src/inc/dbgproxy.h
deleted file mode 100644
index 8a4cf67e38..0000000000
--- a/src/inc/dbgproxy.h
+++ /dev/null
@@ -1,389 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-#ifndef __DBG_PROXY_INCLUDED
-#define __DBG_PROXY_INCLUDED
-
-//
-// This header is used when managed debugging is performed over a network connection rather than via a shared
-// IPC memory block. It describes the format of the communication between a debugger or debuggee and the proxy
-// service that sits in the middle between the two.
-//
-// The proxy has its own process on the same machine as the debuggee. It is involved at the start of debugging
-// (where it launches processes, enumerates and detects runtime startups for the debugger) and at the end
-// (where it handles process termination commands from the debugger or sends process termination events back).
-// The interaction with the debuggee is limited to a single message exchange where the debuggee registers its
-// runtime with the proxy and the proxy responds with whether or not a debugger is currently waiting to
-// attach.
-//
-// The communication transport is SSL over TCP/IP.
-//
-// Note that this header uses very basic data types only as it is included from both Win32/PAL code and native
-// Mac code.
-//
-
-#include <dbgportable.h>
-
-// Constants describing the different platforms the debugger proxy can provide service for.
-enum DbgTargetPlatform
-{
- DTP_Unknown, // Not set yet
- DTP_MacPPC, // Macintosh, PPC 32-bit
- DTP_MacX86, // Macintosh, X86 32-bit
- DTP_WinARM, // Windows, ARM 32-bit
- DTP_MacX86_64, // Macintosh, X86 64-bit
-};
-
-// The proxy uses its own ID to track both processes and CoreCLR runtimes within those processes. Both come
-// from the same namespace (i.e. a given PRUID uniquely identifies either a process or a runtime).
-typedef unsigned int PRUID;
-
-// Codes for the different types of messages the proxy can send or receive. Each message is tagged with one
-// of these codes.
-enum DbgProxyMessageType
-{
- // Messages sent to the proxy from the debugger.
- DPMT_GetSystemInfo, // Query the remote system type and proxy version, must be first message sent
- DPMT_EnumProcesses, // List processes and runtimes on the target machine
- DPMT_LaunchProcess, // Run the given command line on the target machine
- DPMT_EarlyAttach, // Notify the proxy that the next runtime started on a process is to be debugged
- DPMT_TerminateProcess, // Terminate the specified process
-
- // Messages sent to the debugger from the proxy. Some are responses to requests from above and some are
- // asynchronous events.
- DPMT_SystemInfo, // Reply to GetSystemInfo
- DPMT_ProcessList, // Reply to EnumProcesses
- DPMT_ProcessLaunched, // Reply to LaunchProcess, indicates success status and PID/PRUID of new process
- DPMT_RuntimeStarted, // Event delivered every time a runtime registers for startup with the proxy
- DPMT_ProcessTerminated, // Event delivered every time a process terminates
- DPMT_EarlyAttachDone, // Reply to EarlyAttach
-
- // The only message sent from the debuggee to the proxy. The debuggee expects a RuntimeRegistered in
- // reply.
- DPMT_RegisterRuntime, // Tell the proxy a new runtime has started and provide useful info (port etc.)
-
- // The only message sent from the proxy to the debugee.
- DPMT_RuntimeRegistered, // Acknowledge registration, inform debuggee whether it should wait for debugger attach
-};
-
-// Status code returned in ProcessLaunched messages. Indicates whether the process creation succeeded or not.
-enum DbgProxyLaunchResult
-{
- DPLR_Success, // The process was launched successfully
- DPLR_OutOfMemory, // The request failed due to lack of resources
- DPLR_Denied, // The request failed for security reasons
- DPLR_NotFound, // The specified application cannot be found.
- DPLR_UnspecifiedError, // The request failed for unspecified reasons (catchall)
-};
-
-// The current protocol used by the proxy. Major versions increment for incompatible protocol updates, minor
-// versions for any other changes. Proxies (or their clients) will discard messages with a major protocol they
-// don't handle, but must handle any minor version within a supported major protocol version.
-#define kCurrentMajorVersion 2
-#define kCurrentMinorVersion 0
-
-// To enable a more flexible protocol we define the concept of an attribute block. This is a variable sized
-// record consisting of a header containing the overall length followed by zero or more records. Each record
-// has a tag (an enum value) and a variable sized binary blob value. The attribute block does not assign any
-// semantic to this value. Each record is padded to ensure that the next record (or the overall size of the
-// attribute block) is aligned on a 4 byte boundary. Value sizes are limited to 16-bit values (i.e. <= 65535
-// bytes).
-
-// Valid tag values for attribute blocks. More may be defined in the future with minimal impact on current
-// clients. Only one instance of a given tag should be present in a single block (the behavior is undefined
-// otherwise).
-enum DbgAttributeTag
-{
- DAT_CommandLine, // Value is a UTF8 string containing a shell command and its arguments (whitespace separated)
- DAT_DefaultDirectory, // Value is a UTF8 string containing the default directory to lauch a process under
- DAT_Environment // Value is a sequence of UTF8 strings containing an environment block
-};
-
-// The header present at the start of every attribute block.
-struct DbgAttributeBlockHeader
-{
- unsigned int m_cbBlockSize; // Count of bytes in the block (including this header)
-};
-
-// Helper class used to calculate the size of and then format an attribute block. First tell it the sizes of
-// all the values that will be stored, then ask for the total space needed, allocate a buffer large enough and
-// go back and fill in all the details.
-class DbgAttributeBlockWriter
-{
-public:
- DbgAttributeBlockWriter()
- {
- m_cbBuffer = sizeof(DbgAttributeBlockHeader);
- m_pbBuffer = NULL;
- m_pbNextEntry = NULL;
- }
-
- // Plan for adding a specific string value to the block.
- void ScheduleStringValue(LPCSTR szValue)
- {
- ScheduleValue((unsigned int)(strlen(szValue) + 1));
- }
-
- // Plan for adding a specific binary blob value to the block.
- void ScheduleValue(unsigned int cbValue)
- {
- _PASSERT(cbValue <= 0xffff);
- _PASSERT(m_pbBuffer == NULL);
-
- m_cbBuffer += sizeof(unsigned short); // Space for the record tag
- m_cbBuffer += sizeof(unsigned short); // Space for the value length
- m_cbBuffer += (cbValue + 3) & ~3; // Account for value size rounded up to nearest multiple of 4
- }
-
- // Get the total size of buffer required to hold a block with the values planned so far.
- unsigned int GetRequiredBufferSize()
- {
- return m_cbBuffer;
- }
-
- // Tell the writer where the buffer space for the block has been allocated and prepare to start
- // initializing records.
- void BeginFormatting(__inout_bcount(m_cbBuffer) char *pbBuffer)
- {
- _PASSERT(m_pbBuffer == NULL);
- m_pbBuffer = pbBuffer;
- m_pbNextEntry = m_pbBuffer;
-
- // Write the block header (just contains the total size of the block).
- *(unsigned int*)m_pbNextEntry = m_cbBuffer;
- m_pbNextEntry += sizeof(unsigned int);
- }
-
- // Add a string value to the block.
- void AddStringValue(DbgAttributeTag eTag, LPCSTR szValue)
- {
- AddValue(eTag, szValue, (unsigned int)(strlen(szValue) + 1));
- }
-
- // Add a binary blob value to the block.
- void AddValue(DbgAttributeTag eTag, __in_bcount(cbValue) const char *pbValue, unsigned int cbValue)
- {
- _PASSERT(cbValue <= 0xffff);
- _PASSERT(m_pbBuffer != NULL);
- _PASSERT(((unsigned int)(size_t)m_pbNextEntry & 3) == 0);
-
- // Write the record tag.
- *(unsigned short*)m_pbNextEntry = eTag;
- m_pbNextEntry += sizeof(unsigned short);
-
- // Write the value size.
- *(unsigned short*)m_pbNextEntry = cbValue;
- m_pbNextEntry += sizeof(unsigned short);
-
- // Copy the value over.
- memcpy(m_pbNextEntry, pbValue, cbValue);
- m_pbNextEntry += cbValue;
-
- // Calculate whether we need any padding to make the record a multiple of 4 bytes long.
- unsigned int cbPadding = 3 - ((cbValue + 3) & 3);
- if (cbPadding)
- {
- // We need padding, fill with zeroes.
- memset(m_pbNextEntry, 0, cbPadding);
- m_pbNextEntry += cbPadding;
- }
-
- _PASSERT(m_pbNextEntry <= (m_pbBuffer + m_cbBuffer));
- }
-
-private:
- unsigned int m_cbBuffer; // The bytes needed to represent the block so far
- char *m_pbBuffer; // The buffer allocated by the caller to hold the block (NULL during planning)
- char *m_pbNextEntry; // Current location as we format the block (NULL during planning)
-};
-
-// Helper class to interpret an initialized attribute block.
-class DbgAttributeBlockReader
-{
-public:
- DbgAttributeBlockReader(__in_bcount(*(unsigned int*)pbBuffer) char *pbBuffer)
- {
- m_pbBuffer = pbBuffer;
- }
-
- // Get the total size of the block in bytes.
- unsigned int GetBlockSize()
- {
- _PASSERT(*(unsigned int*)m_pbBuffer >= sizeof(unsigned int));
-
- return *(unsigned int*)m_pbBuffer;
- }
-
- // Locate a value with the given tag. If none exists NULL is returned. Otherwise a pointer to the start of
- // the value in the block is returned (along with, optionally, the length of the value).
- char *FindValue(DbgAttributeTag eTag, unsigned int *pcbValue = NULL)
- {
- unsigned int cbBuffer = GetBlockSize() - sizeof(unsigned int);
- char *pbEntry = m_pbBuffer + sizeof(unsigned int);
-
- // Step through the block while there are still records to parse.
- while (cbBuffer)
- {
- // Read the tag from the record and step over it.
- DbgAttributeTag eEntryTag = (DbgAttributeTag)*(unsigned short*)pbEntry;
- pbEntry += sizeof(unsigned short);
-
- // Read the value size from the record and step over it.
- unsigned int cbValue = *(unsigned short*)pbEntry;
- pbEntry += sizeof(unsigned short);
-
- // If the tags match then return the pointer (which is currently at the start of the value in the
- // record).
- if (eEntryTag == eTag)
- {
- if (pcbValue)
- *pcbValue = cbValue;
- return pbEntry;
- }
-
- // Calculate the size of any padding this record has.
- unsigned int cbPadding = 3 - ((cbValue + 3) & 3);
-
- // Step over the value and padding to the start of the next record.
- pbEntry += cbValue + cbPadding;
-
- _PASSERT(cbBuffer >= (sizeof(unsigned short) + sizeof(unsigned short) + cbValue + cbPadding));
- cbBuffer -= sizeof(unsigned short) + sizeof(unsigned short) + cbValue + cbPadding;
- }
-
- // If we get here we ran out of records, so no record with the given tag is present.
- if (pcbValue)
- *pcbValue = 0;
- return NULL;
- }
-
-private:
- char *m_pbBuffer;
-};
-
-// Maximum number of bytes of process command line that will be returned in a DbgProxyProcessInfo.
-#define kMaxCommandLine 256
-
-// Structure reported in ProcessList messages that describes a single process on the target machine.
-struct DbgProxyProcessInfo
-{
- Portable<unsigned> m_uiPID; // Host system PID of the process
- Portable<PRUID> m_pruidProcess; // Proxy allocated PRUID for the process
- char m_szCommandLine[kMaxCommandLine]; // Command and arguments the process is running
-};
-
-// Structure reported in ProcessList messages that describes a single CoreCLR runtime on the target machine.
-struct DbgProxyRuntimeInfo
-{
- Portable<PRUID> m_pruidProcess; // PRUID of the host process
- Portable<PRUID> m_pruidRuntime; // PRUID assigned by the proxy to this runtime
- Portable<unsigned short> m_usPort; // Port number the runtime listens for debuggers on (in network byte order)
-};
-
-// This structure describes the message header common to every proxy message.
-struct DbgProxyMessageHeader
-{
- Portable<DbgProxyMessageType> m_eType; // Describes the type of this message
- Portable<unsigned> m_uiRequestID; // Unique ID that links request/reply message pair
- Portable<unsigned> m_uiMagic; // Redundant field used to make random data attacks harder,
- // contains ~(m_eType + m_uiRequestID)
- Portable<unsigned> m_uiReserved; // Reserved for future expansion (must be initialized to zero and
- // never read)
-
- // Some message types require little or no additional data. For such types the extra fields are defined
- // inline in the header in the union below. More substantial data is sent as a seperate buffer.
- union _VariantData
- {
- struct _GetSystemInfo
- {
- Portable<unsigned> m_uiMajorVersion; // Major protocol being employed by the debugger
- Portable<unsigned> m_uiMinorVersion; // Minor version of the protocol above
- } GetSystemInfo;
-
- struct _LaunchProcess
- {
- Portable<unsigned> m_cbAttributeBlock; // Count of bytes in following attribute block
- } LaunchProcess;
-
- struct _EarlyAttach
- {
- Portable<PRUID> m_pruidProcess; // PRUID of process whose next runtime will be debugged
- } EarlyAttach;
-
- struct _TerminateProcess
- {
- Portable<PRUID> m_pruidProcess; // PRUID of process to terminate
- } TerminateProcess;
-
- struct _SystemInfo
- {
- Portable<unsigned> m_uiMajorVersion; // Major protocol being employed by the proxy
- Portable<unsigned> m_uiMinorVersion; // Minor version of the protocol above
- Portable<DbgTargetPlatform> m_ePlatform;// Platform code of target machine
- } SystemInfo;
-
- struct _ProcessList
- {
- Portable<unsigned> m_uiProcessRecords; // Total number of process records following
- Portable<unsigned> m_uiRuntimeRecords; // Total number of runtime records following
- } ProcessList;
-
- struct _ProcessLaunched
- {
- Portable<DbgProxyLaunchResult> m_eResult;// Whether the launch succeeded and if not, why not
- Portable<unsigned> m_uiPID; // PID of new process
- Portable<PRUID> m_pruidProcess; // PRUID of new process
- } ProcessLaunched;
-
- struct _ProcessTerminated
- {
- Portable<PRUID> m_pruidProcess; // PRUID of process which has exited
- } ProcessTerminated;
-
- struct _EarlyAttachDone
- {
- Portable<bool> m_fProcessExited; // True if the early attach was on a process which terminated
- } EarlyAttachDone;
-
- struct _RuntimeRegistered
- {
- Portable<unsigned> m_uiMajorVersion; // Major protocol being employed by the proxy
- Portable<unsigned> m_uiMinorVersion; // Minor version of the protocol above
- Portable<bool> m_fWaitForDebuggerAttach; // True if the debuggee should suspend startup and wait
- // for debugger attach
- } RuntimeRegistered;
- } VariantData;
-};
-
-// Calculate the expected value of the m_uiMagic field given a message header.
-#define DBGPROXY_MAGIC_VALUE(_header) (~(((unsigned int)(_header)->m_eType) + (_header)->m_uiRequestID))
-
-// Some messages require more data than will comfortably fit in a message header. Define aggregate structures
-// for these.
-
-struct DbgProxyLaunchProcessMessage
-{
- DbgProxyMessageHeader m_sHeader;
- DbgAttributeBlockHeader m_sLaunchAttributes; // Variable sized attribute block with launch
- // arguments
-};
-
-struct DbgProxyRuntimeStartedMessage
-{
- DbgProxyMessageHeader m_sHeader;
- DbgProxyProcessInfo m_sProcessInfo; // In case the process is new as well
- DbgProxyRuntimeInfo m_sRuntimeInfo;
-};
-
-struct DbgProxyRegisterRuntimeMessage
-{
- DbgProxyMessageHeader m_sHeader;
- Portable<unsigned> m_uiMajorVersion; // Major protocol being employed by the debuggee
- Portable<unsigned> m_uiMinorVersion; // Minor version of the protocol above
- Portable<unsigned> m_uiPID; // PID of process hosting this runtime
- Portable<unsigned short> m_usPort; // Port that runtime waits for debugger on (host byte order)
-};
-
-#endif // !__DBG_PROXY_INCLUDED
diff --git a/src/utilcode/CMakeLists.txt b/src/utilcode/CMakeLists.txt
index 3d2140bd79..4f5020e2ab 100644
--- a/src/utilcode/CMakeLists.txt
+++ b/src/utilcode/CMakeLists.txt
@@ -66,6 +66,7 @@ set(UTILCODE_SOURCES
stresslog.cpp
debug.cpp
pedecoder.cpp
+ winfix.cpp
)
# These source file do not yet compile on Linux.
@@ -82,7 +83,6 @@ if(WIN32)
securitywrapper.cpp
securityutil.cpp
stacktrace.cpp
- winfix.cpp
)
endif(WIN32)
diff --git a/src/utilcode/staticnohost/CMakeLists.txt b/src/utilcode/staticnohost/CMakeLists.txt
index ea662454f7..6b63b39f7b 100644
--- a/src/utilcode/staticnohost/CMakeLists.txt
+++ b/src/utilcode/staticnohost/CMakeLists.txt
@@ -1,11 +1,11 @@
add_definitions(-DSELF_NO_HOST)
+list(APPEND UTILCODE_SOURCES ../hostimpl.cpp)
+
if(WIN32)
add_definitions(-D_CRTIMP=) # use static version of crt
- list(APPEND UTILCODE_SOURCES ../hostimpl.cpp)
add_precompiled_header(stdafx.h ../stdafx.cpp UTILCODE_SOURCES)
- add_library(utilcodestaticnohost STATIC ${UTILCODE_SOURCES})
-elseif(CLR_CMAKE_PLATFORM_UNIX)
- add_library(utilcodestaticnohost STATIC ${UTILCODE_SOURCES})
endif(WIN32)
+
+add_library(utilcodestaticnohost STATIC ${UTILCODE_SOURCES})
diff --git a/src/utilcode/winfix.cpp b/src/utilcode/winfix.cpp
index 00c6392ec7..801cb5093c 100644
--- a/src/utilcode/winfix.cpp
+++ b/src/utilcode/winfix.cpp
@@ -23,6 +23,7 @@
#include "ndpversion.h"
#include "pedecoder.h"
+
// ====== READ BEFORE ADDING CONTRACTS ==================================================
// The functions in this file propagate SetLastError codes to their callers.
// Contracts are not guaranteed to preserve these codes (and no, we're not taking
@@ -131,6 +132,61 @@ class WinWrapperContract
ULONG g_dwMaxDBCSCharByteSize = 0;
+// The only purpose of this function is to make a local copy of lpCommandLine.
+// Because windows implementation of CreateProcessW can actually change lpCommandLine,
+// but we'd like to keep it const.
+BOOL
+WszCreateProcess(
+ LPCWSTR lpApplicationName,
+ LPCWSTR lpCommandLine,
+ LPSECURITY_ATTRIBUTES lpProcessAttributes,
+ LPSECURITY_ATTRIBUTES lpThreadAttributes,
+ BOOL bInheritHandles,
+ DWORD dwCreationFlags,
+ LPVOID lpEnvironment,
+ LPCWSTR lpCurrentDirectory,
+ LPSTARTUPINFOW lpStartupInfo,
+ LPPROCESS_INFORMATION lpProcessInformation
+ )
+{
+ WINWRAPPER_NO_CONTRACT(SetLastError(ERROR_OUTOFMEMORY); return 0;);
+
+ BOOL fResult;
+ DWORD err;
+ {
+ size_t commandLineLength = wcslen(lpCommandLine) + 1;
+ NewArrayHolder<WCHAR> nonConstCommandLine(new (nothrow) WCHAR[commandLineLength]);
+ if (nonConstCommandLine == NULL)
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ return 0;
+ }
+
+ memcpy(nonConstCommandLine, lpCommandLine, commandLineLength * sizeof(WCHAR));
+
+ fResult = CreateProcessW(lpApplicationName,
+ nonConstCommandLine,
+ lpProcessAttributes,
+ lpThreadAttributes,
+ bInheritHandles,
+ dwCreationFlags,
+ lpEnvironment,
+ (LPWSTR)lpCurrentDirectory,
+ lpStartupInfo,
+ lpProcessInformation);
+
+ // At the end of the current scope, the last error code will be overwritten by the destructor of
+ // NewArrayHolder. So we save the error code here, and restore it after the end of the current scope.
+ err = GetLastError();
+ }
+
+ SetLastError(err);
+ return fResult;
+}
+
+#ifndef FEATURE_PAL
+
+
#include "psapi.h"
#include "tlhelp32.h"
#include "winnls.h"
@@ -371,55 +427,6 @@ lExit:
}
-BOOL
-WszCreateProcess(
- LPCWSTR lpApplicationName,
- LPCWSTR lpCommandLine,
- LPSECURITY_ATTRIBUTES lpProcessAttributes,
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- BOOL bInheritHandles,
- DWORD dwCreationFlags,
- LPVOID lpEnvironment,
- LPCWSTR lpCurrentDirectory,
- LPSTARTUPINFOW lpStartupInfo,
- LPPROCESS_INFORMATION lpProcessInformation
- )
-{
- WINWRAPPER_NO_CONTRACT(SetLastError(ERROR_OUTOFMEMORY); return 0;);
-
- BOOL fResult;
- DWORD err;
- {
- size_t commandLineLength = wcslen(lpCommandLine) + 1;
- NewArrayHolder<WCHAR> nonConstCommandLine(new (nothrow) WCHAR[commandLineLength]);
- if (nonConstCommandLine == NULL)
- {
- SetLastError(ERROR_OUTOFMEMORY);
- return 0;
- }
-
- memcpy(nonConstCommandLine, lpCommandLine, commandLineLength * sizeof(WCHAR));
-
- fResult = CreateProcessW(lpApplicationName,
- nonConstCommandLine,
- lpProcessAttributes,
- lpThreadAttributes,
- bInheritHandles,
- dwCreationFlags,
- lpEnvironment,
- (LPWSTR)lpCurrentDirectory,
- lpStartupInfo,
- lpProcessInformation);
-
- // At the end of the current scope, the last error code will be overwritten by the destructor of
- // NewArrayHolder. So we save the error code here, and restore it after the end of the current scope.
- err = GetLastError();
- }
-
- SetLastError(err);
- return fResult;
-}
-
DWORD
WszGetWorkingSet()
@@ -513,3 +520,4 @@ WszGetProcessHandleCount()
return dwHandleCount;
}
+#endif //!FEATURE_PAL \ No newline at end of file