summaryrefslogtreecommitdiff
path: root/src/vm/pefingerprint.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/pefingerprint.h')
-rw-r--r--src/vm/pefingerprint.h126
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