1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4//*****************************************************************************
5// ShimDataTarget.h
6//
7
8//
9// header for liveproc data targets
10//*****************************************************************************
11
12#ifndef SHIMDATATARGET_H_
13#define SHIMDATATARGET_H_
14
15
16// Function to invoke for
17typedef HRESULT (*FPContinueStatusChanged)(void * pUserData, DWORD dwThreadId, CORDB_CONTINUE_STATUS dwContinueStatus);
18
19
20//---------------------------------------------------------------------------------------
21// Data target for a live process. This is used by Shim.
22//
23class ShimDataTarget : public ICorDebugMutableDataTarget, ICorDebugDataTarget4
24{
25public:
26 virtual ~ShimDataTarget() {}
27
28 // Allow hooking an implementation for ContinueStatusChanged.
29 void HookContinueStatusChanged(FPContinueStatusChanged fpContinueStatusChanged, void * pUserData);
30
31 // Release any resources. Also called by destructor.
32 virtual void Dispose() = 0;
33
34 // Set data-target into an error mode. This can be used to mark that the process
35 // is unavailable because it's running
36 void SetError(HRESULT hr);
37
38 // Get the OS Process ID that this DataTarget is for.
39 DWORD GetPid();
40
41 //
42 // IUnknown.
43 //
44 virtual HRESULT STDMETHODCALLTYPE QueryInterface(
45 REFIID InterfaceId,
46 PVOID* Interface);
47
48 virtual ULONG STDMETHODCALLTYPE AddRef();
49
50 virtual ULONG STDMETHODCALLTYPE Release();
51
52 //
53 // ICorDebugMutableDataTarget.
54 //
55
56 virtual HRESULT STDMETHODCALLTYPE GetPlatform(
57 CorDebugPlatform * pPlatform) = 0;
58
59 virtual HRESULT STDMETHODCALLTYPE ReadVirtual(
60 CORDB_ADDRESS address,
61 BYTE * pBuffer,
62 ULONG32 request,
63 ULONG32 * pcbRead) = 0;
64
65 virtual HRESULT STDMETHODCALLTYPE WriteVirtual(
66 CORDB_ADDRESS address,
67 const BYTE * pBuffer,
68 ULONG32 request) = 0;
69
70 virtual HRESULT STDMETHODCALLTYPE GetThreadContext(
71 DWORD dwThreadID,
72 ULONG32 contextFlags,
73 ULONG32 contextSize,
74 BYTE * context) = 0;
75
76 virtual HRESULT STDMETHODCALLTYPE SetThreadContext(
77 DWORD dwThreadID,
78 ULONG32 contextSize,
79 const BYTE * context) = 0;
80
81 virtual HRESULT STDMETHODCALLTYPE ContinueStatusChanged(
82 DWORD dwThreadId,
83 CORDB_CONTINUE_STATUS dwContinueStatus) = 0;
84
85 // @dbgtodo - add Native Patch Table support
86
87 //
88 // ICorDebugDataTarget4
89 //
90
91 // Unwind to the next stack frame
92 virtual HRESULT STDMETHODCALLTYPE VirtualUnwind(
93 DWORD threadId, ULONG32 contextSize, PBYTE context) = 0;
94
95protected:
96 // Pid of the target process.
97 DWORD m_processId;
98
99 // If this HRESULT != S_OK, then all interface methods will return this.
100 // This provides a way to mark the debugggee as stopped / dead.
101 HRESULT m_hr;
102
103 FPContinueStatusChanged m_fpContinueStatusChanged;
104 void * m_pContinueStatusChangedUserData;
105
106 // Reference count.
107 LONG m_ref;
108};
109
110//---------------------------------------------------------------------------------------
111//
112// Construction method for data-target
113//
114// Arguments:
115// machineInfo - used for Mac debugging; uniquely identifies the debugger proxy on the remote machine
116// processId - (input) live OS process ID to build a data-target for.
117// ppDataTarget - (output) new data-target instance. This gets addreffed.
118//
119// Return Value:
120// S_OK on success.
121//
122// Assumptions:
123// pid must be for local, same architecture, process.
124// Caller must have security permissions for OpenProcess()
125// Caller must release *ppDataTarget.
126//
127
128HRESULT BuildPlatformSpecificDataTarget(MachineInfo machineInfo,
129 const ProcessDescriptor * pProcessDescriptor,
130 ShimDataTarget ** ppDataTarget);
131
132#endif // SHIMDATATARGET_H_
133
134