| 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 | // | 
| 6 | |
| 7 | #ifndef PEIMAGEVIEW_INL_ | 
| 8 | #define PEIMAGEVIEW_INL_ | 
| 9 | |
| 10 | #include "util.hpp" | 
| 11 | #include "peimage.h" | 
| 12 | |
| 13 | inline const SString &PEImageLayout::GetPath() | 
| 14 | { | 
| 15 | LIMITED_METHOD_CONTRACT; | 
| 16 | return m_pOwner?m_pOwner->GetPath():SString::Empty(); | 
| 17 | } | 
| 18 | |
| 19 | inline void PEImageLayout::AddRef() | 
| 20 | { | 
| 21 | CONTRACT_VOID | 
| 22 | { | 
| 23 | PRECONDITION(m_refCount>0 && m_refCount < COUNT_T_MAX); | 
| 24 | NOTHROW; | 
| 25 | GC_NOTRIGGER; | 
| 26 | } | 
| 27 | CONTRACT_END; | 
| 28 | |
| 29 | FastInterlockIncrement(&m_refCount); | 
| 30 | |
| 31 | RETURN; | 
| 32 | } | 
| 33 | |
| 34 | inline ULONG PEImageLayout::Release() | 
| 35 | { | 
| 36 | CONTRACTL | 
| 37 | { | 
| 38 | DESTRUCTOR_CHECK; | 
| 39 | NOTHROW; | 
| 40 | MODE_ANY; | 
| 41 | FORBID_FAULT; | 
| 42 | } | 
| 43 | CONTRACTL_END; | 
| 44 | |
| 45 | #ifdef DACCESS_COMPILE | 
| 46 | // when DAC accesses layouts via PEImage it does not addref | 
| 47 | if (m_pOwner) | 
| 48 | return m_refCount; | 
| 49 | #endif | 
| 50 | |
| 51 | ULONG result=FastInterlockDecrement(&m_refCount); | 
| 52 | if (result == 0 ) | 
| 53 | { | 
| 54 | delete this; | 
| 55 | } | 
| 56 | return result; | 
| 57 | } | 
| 58 | |
| 59 | |
| 60 | inline PEImageLayout::~PEImageLayout() | 
| 61 | { | 
| 62 | CONTRACTL | 
| 63 | { | 
| 64 | DESTRUCTOR_CHECK; | 
| 65 | NOTHROW; | 
| 66 | GC_TRIGGERS; | 
| 67 | MODE_ANY; | 
| 68 | } | 
| 69 | CONTRACTL_END; | 
| 70 | } | 
| 71 | |
| 72 | inline PEImageLayout::PEImageLayout() | 
| 73 | : m_refCount(1) | 
| 74 | , m_pOwner(NULL) | 
| 75 | { | 
| 76 | LIMITED_METHOD_CONTRACT; | 
| 77 | } | 
| 78 | |
| 79 | inline void PEImageLayout::Startup() | 
| 80 | { | 
| 81 | CONTRACT_VOID | 
| 82 | { | 
| 83 | THROWS; | 
| 84 | GC_NOTRIGGER; | 
| 85 | MODE_ANY; | 
| 86 | POSTCONDITION(CheckStartup()); | 
| 87 | INJECT_FAULT(COMPlusThrowOM();); | 
| 88 | } | 
| 89 | CONTRACT_END; | 
| 90 | |
| 91 | if (CheckStartup()) | 
| 92 | RETURN; | 
| 93 | |
| 94 | RETURN; | 
| 95 | } | 
| 96 | |
| 97 | inline CHECK PEImageLayout::CheckStartup() | 
| 98 | { | 
| 99 | WRAPPER_NO_CONTRACT; | 
| 100 | CHECK_OK; | 
| 101 | } | 
| 102 | |
| 103 | inline BOOL PEImageLayout::CompareBase(UPTR base, UPTR mapping) | 
| 104 | { | 
| 105 | CONTRACTL | 
| 106 | { | 
| 107 | PRECONDITION(CheckPointer((PEImageLayout *)mapping)); | 
| 108 | PRECONDITION(CheckPointer((PEImageLayout *)(base<<1),NULL_OK)); | 
| 109 | SO_TOLERANT; | 
| 110 | NOTHROW; | 
| 111 | GC_NOTRIGGER; | 
| 112 | MODE_ANY; | 
| 113 | } | 
| 114 | CONTRACTL_END; | 
| 115 | if (base==NULL) //we were searching for 'Any' | 
| 116 | return TRUE; | 
| 117 | return ((PEImageLayout*)mapping)->GetBase()==((PEImageLayout*)(base<<1))->GetBase(); | 
| 118 | |
| 119 | } | 
| 120 | |
| 121 | #endif //PEIMAGEVIEW_INL_ | 
| 122 | 
