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 | // DacDbiImpl.inl |
6 | // |
7 | |
8 | // |
9 | // Inline functions for DacDbiImpl.h |
10 | // |
11 | //***************************************************************************** |
12 | |
13 | #ifndef _DACDBI_IMPL_INL_ |
14 | #define _DACDBI_IMPL_INL_ |
15 | |
16 | #include "dacdbiimpl.h" |
17 | |
18 | //--------------------------------------------------------------------------------------- |
19 | // Helper to write a structure to the target |
20 | // |
21 | // Arguments: |
22 | // T - type of structure to read. |
23 | // pRemotePtr - remote pointer into target (dest). |
24 | // pLocalBuffer - local buffer to write (Src). |
25 | // |
26 | // Return Value: |
27 | // Throws on error. |
28 | // |
29 | // Notes: |
30 | // This just does a raw Byte copy into the Target, but does not do any Marshalling. |
31 | // This fails if any part of the buffer can't be written. |
32 | // |
33 | // |
34 | //--------------------------------------------------------------------------------------- |
35 | template<typename T> |
36 | void DacDbiInterfaceImpl::SafeWriteStructOrThrow(CORDB_ADDRESS pRemotePtr, const T * pLocalBuffer) |
37 | { |
38 | HRESULT hr = m_pMutableTarget->WriteVirtual(pRemotePtr, |
39 | (BYTE *)(pLocalBuffer), sizeof(T)); |
40 | |
41 | if (FAILED(hr)) |
42 | { |
43 | ThrowHR(hr); |
44 | } |
45 | } |
46 | |
47 | //--------------------------------------------------------------------------------------- |
48 | // Helper to read a structure from the target process |
49 | // |
50 | // Arguments: |
51 | // T - type of structure to read |
52 | // pRemotePtr - remote pointer into the target process (src) |
53 | // pLocalBuffer - local buffer to store the structure (dest) |
54 | // |
55 | // Notes: |
56 | // This just does a raw Byte copy into the Target, but does not do any Marshalling. |
57 | // This fails if any part of the buffer can't be written. |
58 | // |
59 | |
60 | template<typename T> |
61 | void DacDbiInterfaceImpl::SafeReadStructOrThrow(CORDB_ADDRESS pRemotePtr, T * pLocalBuffer) |
62 | { |
63 | ULONG32 cbRead = 0; |
64 | |
65 | HRESULT hr = m_pTarget->ReadVirtual(pRemotePtr, |
66 | reinterpret_cast<BYTE *>(pLocalBuffer), sizeof(T), &cbRead); |
67 | |
68 | if (FAILED(hr)) |
69 | { |
70 | ThrowHR(CORDBG_E_READVIRTUAL_FAILURE); |
71 | } |
72 | |
73 | if (cbRead != sizeof(T)) |
74 | { |
75 | ThrowWin32(ERROR_PARTIAL_COPY); |
76 | } |
77 | } |
78 | |
79 | #endif // _DACDBI_IMPL_INL_ |
80 | |