diff options
Diffstat (limited to 'src/vm/pefingerprint.h')
-rw-r--r-- | src/vm/pefingerprint.h | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/vm/pefingerprint.h b/src/vm/pefingerprint.h new file mode 100644 index 0000000000..357351f4ae --- /dev/null +++ b/src/vm/pefingerprint.h @@ -0,0 +1,126 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +// -------------------------------------------------------------------------------- +// PEFingerprint.h +// + +// -------------------------------------------------------------------------------- + +#ifndef PEFINGERPRINT_H_ +#define PEFINGERPRINT_H_ + + +#ifdef FEATURE_FUSION + +#include "corcompile.h" + +class PEImage; + +//================================================================================== +// This is the implementation of IILFingerprint object maintained by PEImage objects. +// IILFingerprint is described in detail in IILFingerprint.h +//================================================================================== +class PEFingerprint : public IILFingerprint +{ + public: + //---------------------------------------------------------------- + // IILFingerprint methods + //---------------------------------------------------------------- + STDMETHOD_(ULONG, AddRef)(); + STDMETHOD_(ULONG, Release)(); + STDMETHOD_(BOOL, CommitAndCompare)(ILFingerprintTag componentType, LPCVOID data); + STDMETHOD_(BOOL, CommitAndCompareMulti)(UINT numComponents, const ILFingerprintComponent *pComponents); + STDMETHOD_(void, LockAndLoadIL)(); + + //---------------------------------------------------------------- + // Non-interface public methods. + //---------------------------------------------------------------- + public: + static PEFingerprint* PEFingerprint::CreatePEFingerprint(PEImage *owner); + virtual ~PEFingerprint(); + + private: + PEFingerprint(PEImage *owner); + + //---------------------------------------------------------------- + // Private methods. + //---------------------------------------------------------------- + private: + + BOOL IsComponentCommitted(ILFingerprintTag tag) + { + LIMITED_METHOD_CONTRACT; + _ASSERTE(tag < ILFTagCount); + return 0 != (m_commitMask & (1 << tag)); + } + + void SetComponentCommitted(ILFingerprintTag tag) + { + LIMITED_METHOD_CONTRACT; + _ASSERTE(tag < ILFTagCount); + m_commitMask |= (1 << tag); + } + + LPVOID TagDataStart(ILFingerprintTag tag) + { + LIMITED_METHOD_CONTRACT; + _ASSERTE(tag < ILFTagCount); + return (LPVOID)(((LPBYTE)this) + s_offsets[tag]); + } + + DWORD TagDataSize(ILFingerprintTag tag) + { + LIMITED_METHOD_CONTRACT; + _ASSERTE(tag < ILFTagCount); + return s_sizes[tag]; + } + + + //---------------------------------------------------------------- + // Private instance data + //---------------------------------------------------------------- + private: + Crst *m_pcrst; // Synchronizes updates to fingerprint + PEImage *m_peimage; // Backpointer to PEImage (for ref-counting purposes, the PEImage and PEFingerprint have the same identity) + DWORD m_commitMask; // Bitmask to indicate which components have been committed ( fCommitted = (m_commitMask & (1 << tag)) ) + FILETIME m_timeStamp; // Component: File system lastwrite Timestamp + DWORD m_size; // Component: File size + GUID m_mvid; // Component: Mvid + + BOOL m_alreadyLoaded; // Turns repeated attempts to LockAndLoadIL() into NOP's + HRESULT m_priorLockAndLoadFailure; // If LockAndLoadIL() failed the first time, return the same failure on subsequent attempts. + + //---------------------------------------------------------------- + // Private static data + //---------------------------------------------------------------- + private: + const static size_t s_offsets[ILFTagCount]; // static: Maps tags to offsets within PEFingerprint + const static DWORD s_sizes[ILFTagCount]; // static: Maps tag to expected data size +}; + +#endif // FEATURE_FUSION + + +//================================================================================== +// This holder must be wrapped around any code that opens an IL image. +// It will verify that the actual fingerprint doesn't conflict with the stored +// assumptions in the PEFingerprint. (If it does, the holder constructor throws +// a torn state exception.) +// +// It is a holder because it needs to keep a file handle open to prevent +// anyone from overwriting the IL after the check has been done. Once +// you've opened the "real" handle to the IL (i.e. LoadLibrary/CreateFile), +// you can safely destruct the holder. +//================================================================================== +class PEFingerprintVerificationHolder +{ + public: + PEFingerprintVerificationHolder(PEImage *owner); + + private: + FileHandleHolder m_fileHandle; +}; + + +#endif //PEFINGERPRINT |