Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / BCL / System / StubHelpers.cs / 1 / StubHelpers.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== namespace System.StubHelpers { using System.Text; using Microsoft.Win32; using System.Security; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Runtime.ConstrainedExecution; #if WIN64 [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class AnsiCharMarshaler { static internal byte[] DoAnsiConversion(string str, bool fBestFit, bool fThrowOnUnmappableChar) { byte[] bytes = null; Encoding enc = null; bool fLegacyPath = false; if (fThrowOnUnmappableChar) { if (fBestFit) { fLegacyPath = true; } else { enc = Encoding.GetEncoding(0, EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback); } } else { if (fBestFit) { enc = Encoding.Default; } else { enc = Encoding.GetEncoding(0, EncoderFallback.ReplacementFallback, DecoderFallback.ReplacementFallback); } } if (fLegacyPath) { bytes = str.ConvertToAnsi_BestFit_Throw(Marshal.SystemMaxDBCSCharSize); } else { try { bytes = enc.GetBytes(str); } catch (EncoderFallbackException fallbackException) { throw new ArgumentException(Environment.GetResourceString("Interop_Marshal_Unmappable_Char"), fallbackException); } } return bytes; } static internal byte ConvertToNative(char managedChar, bool fBestFit, bool fThrowOnUnmappableChar) { byte[] bytes = DoAnsiConversion(managedChar.ToString(), fBestFit, fThrowOnUnmappableChar); return bytes[0]; } static internal char ConvertToManaged(byte nativeChar) { byte[] bytes = new byte[1] { nativeChar }; string str = Encoding.Default.GetString(bytes); return str[0]; } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class CSTRMarshaler { static internal unsafe IntPtr ConvertToNative(int flags, string strManaged) { if (null == strManaged) { return IntPtr.Zero; } else { int length = strManaged.Length; StubHelpers.CheckStringLength(length); byte[] bytes = null; int nb = 0; bytes = AnsiCharMarshaler.DoAnsiConversion(strManaged, 0 != (flags & 0xFF), 0 != (flags >> 8)); nb = bytes.Length; // + 1 for the null character from the user. + 1 for the null character we put in. int cbNativeBuffer = (length + 2) * Marshal.SystemMaxDBCSCharSize; // In the (fBestFit && fThrowOnUnmappableChar) case, we'll actually call ConvertToAnsi_BestFit_Throw() // to do the conversion. This method allocates the buffer according to the worst case scenario, just // like what we do here. Thus, the length of the returned array could be bigger than our estimate. // So we need to take the maximum of the two values here. cbNativeBuffer = Math.Max(cbNativeBuffer, nb + 2); byte* pbNativeBuffer = (byte*)Win32Native.CoTaskMemAlloc(cbNativeBuffer); BCLDebug.Assert((nb + 2) <= cbNativeBuffer, "Underestimated buffer size"); Buffer.memcpy(bytes, 0, pbNativeBuffer, 0, nb); pbNativeBuffer[nb] = 0x00; pbNativeBuffer[nb+1] = 0x00; return (IntPtr)pbNativeBuffer; } } static internal unsafe string ConvertToManaged(IntPtr cstr) { if (IntPtr.Zero == cstr) return null; else return new String((sbyte*)cstr); } static internal void ClearNative(IntPtr pNative) { Win32Native.CoTaskMemFree(pNative); } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class BSTRMarshaler { static internal IntPtr ConvertToNative(string strManaged) { if (null == strManaged) return IntPtr.Zero; else return Win32Native.SysAllocStringLen(strManaged, strManaged.Length); } static internal unsafe string ConvertToManaged(IntPtr bstr) { if (IntPtr.Zero == bstr) return null; else return new String((char*)bstr, 0, Win32Native.SysStringLen(bstr)); } static internal void ClearNative(IntPtr pNative) { if (IntPtr.Zero != pNative) { Win32Native.SysFreeString(pNative); } } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class VBByValStrMarshaler { static internal unsafe IntPtr ConvertToNative(string strManaged, bool fBestFit, bool fThrowOnUnmappableChar, ref int cch) { if (null == strManaged) { return IntPtr.Zero; } byte* pNative; cch = strManaged.Length; StubHelpers.CheckStringLength(cch); int nbytes = sizeof(uint) + (cch+1)*2; pNative = (byte*)Win32Native.CoTaskMemAlloc(nbytes); int* pLength = (int*)pNative; pNative = pNative + sizeof(uint); if (0 == cch) { *pNative = 0; *pLength = 0; } else { byte[] bytes = AnsiCharMarshaler.DoAnsiConversion(strManaged, fBestFit, fThrowOnUnmappableChar); int nbytesused = bytes.Length; Buffer.memcpy(bytes, 0, pNative, 0, nbytesused); pNative[nbytesused] = 0; *pLength = nbytesused; } return new IntPtr(pNative); } static internal unsafe string ConvertToManaged(IntPtr pNative, int cch) { if (IntPtr.Zero == pNative) { return null; } return new String((sbyte*)pNative, 0, cch); } static internal unsafe void ClearNative(IntPtr pNative) { if (IntPtr.Zero != pNative) { Win32Native.CoTaskMemFree((IntPtr)(((long)pNative) - sizeof(uint))); } } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class AnsiBSTRMarshaler { static internal unsafe IntPtr ConvertToNative(int flags, string strManaged) { if (null == strManaged) { return IntPtr.Zero; } int length = strManaged.Length; StubHelpers.CheckStringLength(length); byte[] bytes = null; int nb = 0; if (length > 0) { bytes = AnsiCharMarshaler.DoAnsiConversion(strManaged, 0 != (flags & 0xFF), 0 != (flags >> 8)); nb = bytes.Length; } // + 1 for the null character from the user. + 1 for the null character we put in. int cbNativeBuffer = (length + 2) * Marshal.SystemMaxDBCSCharSize + sizeof(int); // In the (fBestFit && fThrowOnUnmappableChar) case, we'll actually call ConvertToAnsi_BestFit_Throw() // to do the conversion. This method allocates the buffer according to the worst case scenario, just // like what we do here. Thus, the length of the returned array could be bigger than our estimate. // So we need to take the maximum of the two values here. cbNativeBuffer = Math.Max(cbNativeBuffer, nb + 2 + sizeof(int)); byte* pbNativeBuffer = ((byte*)Win32Native.CoTaskMemAlloc(cbNativeBuffer)) + sizeof(int); BCLDebug.Assert((nb + 2) <= cbNativeBuffer, "Underestimated buffer size"); Buffer.memcpy(bytes, 0, pbNativeBuffer, 0, nb); pbNativeBuffer[nb] = 0x00; pbNativeBuffer[nb+1] = 0x00; ((int*)pbNativeBuffer)[-1] = nb; return (IntPtr)pbNativeBuffer; } static internal unsafe string ConvertToManaged(IntPtr bstr) { if (IntPtr.Zero == bstr) return null; else return new String((sbyte*)bstr); } static internal unsafe void ClearNative(IntPtr pNative) { if (IntPtr.Zero != pNative) { Win32Native.CoTaskMemFree((IntPtr)(((long)pNative) - sizeof(uint))); } } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class WSTRBufferMarshaler { static internal IntPtr ConvertToNative(string strManaged) { BCLDebug.Assert(false, "NYI"); return IntPtr.Zero; } static internal unsafe string ConvertToManaged(IntPtr bstr) { BCLDebug.Assert(false, "NYI"); return null; } static internal void ClearNative(IntPtr pNative) { BCLDebug.Assert(false, "NYI"); } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class ObjectMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertToNative(object objSrc, IntPtr pDstVariant); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern object ConvertToManaged(IntPtr pSrcVariant); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr pVariant); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class ValueClassMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertToNative(IntPtr dst, IntPtr src, IntPtr pMT, IntPtr pCleanupWorkList); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertToManaged(IntPtr dst, IntPtr src, IntPtr pMT); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr dst, IntPtr pMT); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class DateMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern double ConvertToNative(DateTime managedDate); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern DateTime ConvertToManaged(double nativeDate); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class InterfaceMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr ConvertToNative(object objSrc, IntPtr itfMT, IntPtr classMT, int flags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern object ConvertToManaged(IntPtr pUnk, IntPtr itfMT, IntPtr classMT, int flags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr pUnk); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class MngdNativeArrayMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void CreateMarshaler(IntPtr pMarshalState, int sizeParam, IntPtr pMT, int additive, int multiplier, int dwFlags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertSpaceToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertSpaceToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNativeContents(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class MngdSafeArrayMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void CreateMarshaler(IntPtr pMarshalState, IntPtr pMT, int iRank, int dwFlags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertSpaceToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome, object pOriginalManaged); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertSpaceToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class MngdRefCustomMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void CreateMarshaler(IntPtr pMarshalState, IntPtr pCMHelper); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); } [StructLayout(LayoutKind.Sequential)] internal struct NativeVariant { ushort vt; ushort wReserved1; ushort wReserved2; ushort wReserved3; long data1; long data2; } // // This struct maps the the EE's Frame struct in vm\Frames.h // [StructLayout(LayoutKind.Sequential)] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal unsafe struct EEFrame { internal void* __VFN_table; internal void* m_Next; internal const long OFFSETOF__Thread__m_pFrame = 0x10L; // // pass in an explicit 'this' pointer so that we don't have to // use 'fixed' to take the address of 'this' // internal static void Push(void* pThis, void* pThread) { EEFrame* pThisFrame = (EEFrame*)pThis; #if _DEBUG StubHelpers.Verify__EEFrame__Push(pThisFrame, pThread, OFFSETOF__Thread__m_pFrame); #endif // _DEBUG void** ppFrame = (void**)(((byte*)pThread) + OFFSETOF__Thread__m_pFrame); pThisFrame->m_Next = *ppFrame; *ppFrame = pThis; } // // uses an explicit 'this' pointer to be consistent with Push above // internal static void Pop(void* pThis, void* pThread) { EEFrame* pThisFrame = (EEFrame*)pThis; #if _DEBUG StubHelpers.Verify__EEFrame__Pop(pThisFrame, pThread, OFFSETOF__Thread__m_pFrame); #endif // _DEBUG void** ppFrame = (void**)(((byte*)pThread) + OFFSETOF__Thread__m_pFrame); *ppFrame = pThisFrame->m_Next; } } [StructLayoutAttribute(LayoutKind.Sequential)] internal struct CY { internal long int64; } [StructLayout(LayoutKind.Sequential)] internal struct DECIMAL { internal short wReserved; internal short signscale; internal int Hi32; internal long Lo64; } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] [SuppressUnmanagedCodeSecurityAttribute()] internal static class StubHelpers { internal const String OLEAUT32 = "oleaut32.dll"; [DllImport(OLEAUT32)] internal extern static int VarCyFromDec(ref DECIMAL pdecIn, ref CY cyOut); [DllImport(OLEAUT32)] internal extern static int VarDecFromCy(CY cyIn, ref DECIMAL decOut); #if _DEBUG [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern void Verify__EEFrame__Pop(EEFrame* pFrame, void* pThread, long managed_OFFSETOF__Thread__m_pFrame); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern void Verify__EEFrame__Push(EEFrame* pFrame, void* pThread, long managed_OFFSETOF__Thread__m_pFrame); #endif // _DEBUG //-------------------------------------------------------- // PInvoke stub helpers //------------------------------------------------------- #if DEBUG [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern UIntPtr GetProcessGSCookie(); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void FailFast(); #endif [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void DoNDirectCall(); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void DoCLRToCOMCall(object thisPtr); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void SetLastError(); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr BeginStandalone(IntPtr pFrame, IntPtr pNMD, int dwStubFlags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr BeginStandaloneCleanup(IntPtr pFrame, IntPtr pNMD, int dwStubFlags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr BeginCLRToCOMStandalone(IntPtr pFrame, IntPtr pCPCMD, int dwStubFlags, object pThis); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr BeginCLRToCOMStandaloneCleanup(IntPtr pFrame, IntPtr pCPCMD, int dwStubFlags, object pThis); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ThrowDeferredException(); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ThrowInteropParamException(int resID, int paramIdx); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void CreateCleanupList(IntPtr pCleanupWorkList); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void DestroyCleanupList(IntPtr pFrameMem, bool fExceptionThrown); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern object GetHRExceptionObject(int hr); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern object GetCOMHRExceptionObject(int hr, IntPtr pFrame, object pThis); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr CreateCustomMarshalerHelper(IntPtr pMD, int paramToken, IntPtr hndManagedType); //------------------------------------------------------- // AsAnyAMarshaler, AsAnyWMarshaler //------------------------------------------------------- [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr MarshalAsAny(ref object pManagedHome, int dwFlags, IntPtr pvMarshaler, IntPtr pCleanupWorkList); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void UnmarshalAsAny(ref object pManagedHome, IntPtr pvMarshaler); //-------------------------------------------------------- // SafeHandle Helper //------------------------------------------------------- [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr SafeHandleC2NHelper(object pThis, IntPtr pCleanupWorkList); //-------------------------------------------------------- // Helper for the MDA ----OnRCWCleanup //-------------------------------------------------------- [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void StubRegisterRCW(object pThis, IntPtr pThread, IntPtr pCleanupWorkList); //------------------------------------------------------- // Profiler helpers //-------------------------------------------------------- [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr ProfilerBeginTransitionCallback(IntPtr pSecretParam, IntPtr pThread, object pThis); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ProfilerEndTransitionCallback(IntPtr pMD, IntPtr pThread); //------------------------------------------------------- // Debugger helpers //------------------------------------------------------- [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void DebuggerTraceCall(IntPtr pSecretParam); //----------------------------------------------------- // misc //------------------------------------------------------ static internal void CheckStringLength(int length) { if (length > 0x7ffffff0) { throw new MarshalDirectiveException(Environment.GetResourceString("Marshaler_StringTooLong")); } } [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern int strlen(sbyte* ptr); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern Decimal DecimalCanonicalizeInternal(Decimal dec); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern void FmtClassUpdateNativeInternal(object obj, byte* pNative, IntPtr pOptionalCleanupList); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern void FmtClassUpdateCLRInternal(object obj, byte* pNative); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern void LayoutDestroyNativeInternal(byte* pNative, IntPtr pMT); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern object AllocateInternal(IntPtr typeHandle); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr MarshalToUnmanagedVaListInternal(IntPtr pArgIterator); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void MarshalToManagedVaListInternal(IntPtr va_list, IntPtr pArgIterator); } #endif } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== namespace System.StubHelpers { using System.Text; using Microsoft.Win32; using System.Security; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Runtime.ConstrainedExecution; #if WIN64 [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class AnsiCharMarshaler { static internal byte[] DoAnsiConversion(string str, bool fBestFit, bool fThrowOnUnmappableChar) { byte[] bytes = null; Encoding enc = null; bool fLegacyPath = false; if (fThrowOnUnmappableChar) { if (fBestFit) { fLegacyPath = true; } else { enc = Encoding.GetEncoding(0, EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback); } } else { if (fBestFit) { enc = Encoding.Default; } else { enc = Encoding.GetEncoding(0, EncoderFallback.ReplacementFallback, DecoderFallback.ReplacementFallback); } } if (fLegacyPath) { bytes = str.ConvertToAnsi_BestFit_Throw(Marshal.SystemMaxDBCSCharSize); } else { try { bytes = enc.GetBytes(str); } catch (EncoderFallbackException fallbackException) { throw new ArgumentException(Environment.GetResourceString("Interop_Marshal_Unmappable_Char"), fallbackException); } } return bytes; } static internal byte ConvertToNative(char managedChar, bool fBestFit, bool fThrowOnUnmappableChar) { byte[] bytes = DoAnsiConversion(managedChar.ToString(), fBestFit, fThrowOnUnmappableChar); return bytes[0]; } static internal char ConvertToManaged(byte nativeChar) { byte[] bytes = new byte[1] { nativeChar }; string str = Encoding.Default.GetString(bytes); return str[0]; } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class CSTRMarshaler { static internal unsafe IntPtr ConvertToNative(int flags, string strManaged) { if (null == strManaged) { return IntPtr.Zero; } else { int length = strManaged.Length; StubHelpers.CheckStringLength(length); byte[] bytes = null; int nb = 0; bytes = AnsiCharMarshaler.DoAnsiConversion(strManaged, 0 != (flags & 0xFF), 0 != (flags >> 8)); nb = bytes.Length; // + 1 for the null character from the user. + 1 for the null character we put in. int cbNativeBuffer = (length + 2) * Marshal.SystemMaxDBCSCharSize; // In the (fBestFit && fThrowOnUnmappableChar) case, we'll actually call ConvertToAnsi_BestFit_Throw() // to do the conversion. This method allocates the buffer according to the worst case scenario, just // like what we do here. Thus, the length of the returned array could be bigger than our estimate. // So we need to take the maximum of the two values here. cbNativeBuffer = Math.Max(cbNativeBuffer, nb + 2); byte* pbNativeBuffer = (byte*)Win32Native.CoTaskMemAlloc(cbNativeBuffer); BCLDebug.Assert((nb + 2) <= cbNativeBuffer, "Underestimated buffer size"); Buffer.memcpy(bytes, 0, pbNativeBuffer, 0, nb); pbNativeBuffer[nb] = 0x00; pbNativeBuffer[nb+1] = 0x00; return (IntPtr)pbNativeBuffer; } } static internal unsafe string ConvertToManaged(IntPtr cstr) { if (IntPtr.Zero == cstr) return null; else return new String((sbyte*)cstr); } static internal void ClearNative(IntPtr pNative) { Win32Native.CoTaskMemFree(pNative); } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class BSTRMarshaler { static internal IntPtr ConvertToNative(string strManaged) { if (null == strManaged) return IntPtr.Zero; else return Win32Native.SysAllocStringLen(strManaged, strManaged.Length); } static internal unsafe string ConvertToManaged(IntPtr bstr) { if (IntPtr.Zero == bstr) return null; else return new String((char*)bstr, 0, Win32Native.SysStringLen(bstr)); } static internal void ClearNative(IntPtr pNative) { if (IntPtr.Zero != pNative) { Win32Native.SysFreeString(pNative); } } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class VBByValStrMarshaler { static internal unsafe IntPtr ConvertToNative(string strManaged, bool fBestFit, bool fThrowOnUnmappableChar, ref int cch) { if (null == strManaged) { return IntPtr.Zero; } byte* pNative; cch = strManaged.Length; StubHelpers.CheckStringLength(cch); int nbytes = sizeof(uint) + (cch+1)*2; pNative = (byte*)Win32Native.CoTaskMemAlloc(nbytes); int* pLength = (int*)pNative; pNative = pNative + sizeof(uint); if (0 == cch) { *pNative = 0; *pLength = 0; } else { byte[] bytes = AnsiCharMarshaler.DoAnsiConversion(strManaged, fBestFit, fThrowOnUnmappableChar); int nbytesused = bytes.Length; Buffer.memcpy(bytes, 0, pNative, 0, nbytesused); pNative[nbytesused] = 0; *pLength = nbytesused; } return new IntPtr(pNative); } static internal unsafe string ConvertToManaged(IntPtr pNative, int cch) { if (IntPtr.Zero == pNative) { return null; } return new String((sbyte*)pNative, 0, cch); } static internal unsafe void ClearNative(IntPtr pNative) { if (IntPtr.Zero != pNative) { Win32Native.CoTaskMemFree((IntPtr)(((long)pNative) - sizeof(uint))); } } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class AnsiBSTRMarshaler { static internal unsafe IntPtr ConvertToNative(int flags, string strManaged) { if (null == strManaged) { return IntPtr.Zero; } int length = strManaged.Length; StubHelpers.CheckStringLength(length); byte[] bytes = null; int nb = 0; if (length > 0) { bytes = AnsiCharMarshaler.DoAnsiConversion(strManaged, 0 != (flags & 0xFF), 0 != (flags >> 8)); nb = bytes.Length; } // + 1 for the null character from the user. + 1 for the null character we put in. int cbNativeBuffer = (length + 2) * Marshal.SystemMaxDBCSCharSize + sizeof(int); // In the (fBestFit && fThrowOnUnmappableChar) case, we'll actually call ConvertToAnsi_BestFit_Throw() // to do the conversion. This method allocates the buffer according to the worst case scenario, just // like what we do here. Thus, the length of the returned array could be bigger than our estimate. // So we need to take the maximum of the two values here. cbNativeBuffer = Math.Max(cbNativeBuffer, nb + 2 + sizeof(int)); byte* pbNativeBuffer = ((byte*)Win32Native.CoTaskMemAlloc(cbNativeBuffer)) + sizeof(int); BCLDebug.Assert((nb + 2) <= cbNativeBuffer, "Underestimated buffer size"); Buffer.memcpy(bytes, 0, pbNativeBuffer, 0, nb); pbNativeBuffer[nb] = 0x00; pbNativeBuffer[nb+1] = 0x00; ((int*)pbNativeBuffer)[-1] = nb; return (IntPtr)pbNativeBuffer; } static internal unsafe string ConvertToManaged(IntPtr bstr) { if (IntPtr.Zero == bstr) return null; else return new String((sbyte*)bstr); } static internal unsafe void ClearNative(IntPtr pNative) { if (IntPtr.Zero != pNative) { Win32Native.CoTaskMemFree((IntPtr)(((long)pNative) - sizeof(uint))); } } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class WSTRBufferMarshaler { static internal IntPtr ConvertToNative(string strManaged) { BCLDebug.Assert(false, "NYI"); return IntPtr.Zero; } static internal unsafe string ConvertToManaged(IntPtr bstr) { BCLDebug.Assert(false, "NYI"); return null; } static internal void ClearNative(IntPtr pNative) { BCLDebug.Assert(false, "NYI"); } } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class ObjectMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertToNative(object objSrc, IntPtr pDstVariant); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern object ConvertToManaged(IntPtr pSrcVariant); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr pVariant); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class ValueClassMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertToNative(IntPtr dst, IntPtr src, IntPtr pMT, IntPtr pCleanupWorkList); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertToManaged(IntPtr dst, IntPtr src, IntPtr pMT); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr dst, IntPtr pMT); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class DateMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern double ConvertToNative(DateTime managedDate); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern DateTime ConvertToManaged(double nativeDate); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class InterfaceMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr ConvertToNative(object objSrc, IntPtr itfMT, IntPtr classMT, int flags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern object ConvertToManaged(IntPtr pUnk, IntPtr itfMT, IntPtr classMT, int flags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr pUnk); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class MngdNativeArrayMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void CreateMarshaler(IntPtr pMarshalState, int sizeParam, IntPtr pMT, int additive, int multiplier, int dwFlags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertSpaceToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertSpaceToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNativeContents(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class MngdSafeArrayMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void CreateMarshaler(IntPtr pMarshalState, IntPtr pMT, int iRank, int dwFlags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertSpaceToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome, object pOriginalManaged); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertSpaceToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal static class MngdRefCustomMarshaler { [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void CreateMarshaler(IntPtr pMarshalState, IntPtr pCMHelper); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ConvertContentsToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ClearManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome); } [StructLayout(LayoutKind.Sequential)] internal struct NativeVariant { ushort vt; ushort wReserved1; ushort wReserved2; ushort wReserved3; long data1; long data2; } // // This struct maps the the EE's Frame struct in vm\Frames.h // [StructLayout(LayoutKind.Sequential)] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal unsafe struct EEFrame { internal void* __VFN_table; internal void* m_Next; internal const long OFFSETOF__Thread__m_pFrame = 0x10L; // // pass in an explicit 'this' pointer so that we don't have to // use 'fixed' to take the address of 'this' // internal static void Push(void* pThis, void* pThread) { EEFrame* pThisFrame = (EEFrame*)pThis; #if _DEBUG StubHelpers.Verify__EEFrame__Push(pThisFrame, pThread, OFFSETOF__Thread__m_pFrame); #endif // _DEBUG void** ppFrame = (void**)(((byte*)pThread) + OFFSETOF__Thread__m_pFrame); pThisFrame->m_Next = *ppFrame; *ppFrame = pThis; } // // uses an explicit 'this' pointer to be consistent with Push above // internal static void Pop(void* pThis, void* pThread) { EEFrame* pThisFrame = (EEFrame*)pThis; #if _DEBUG StubHelpers.Verify__EEFrame__Pop(pThisFrame, pThread, OFFSETOF__Thread__m_pFrame); #endif // _DEBUG void** ppFrame = (void**)(((byte*)pThread) + OFFSETOF__Thread__m_pFrame); *ppFrame = pThisFrame->m_Next; } } [StructLayoutAttribute(LayoutKind.Sequential)] internal struct CY { internal long int64; } [StructLayout(LayoutKind.Sequential)] internal struct DECIMAL { internal short wReserved; internal short signscale; internal int Hi32; internal long Lo64; } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] [SuppressUnmanagedCodeSecurityAttribute()] internal static class StubHelpers { internal const String OLEAUT32 = "oleaut32.dll"; [DllImport(OLEAUT32)] internal extern static int VarCyFromDec(ref DECIMAL pdecIn, ref CY cyOut); [DllImport(OLEAUT32)] internal extern static int VarDecFromCy(CY cyIn, ref DECIMAL decOut); #if _DEBUG [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern void Verify__EEFrame__Pop(EEFrame* pFrame, void* pThread, long managed_OFFSETOF__Thread__m_pFrame); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern void Verify__EEFrame__Push(EEFrame* pFrame, void* pThread, long managed_OFFSETOF__Thread__m_pFrame); #endif // _DEBUG //-------------------------------------------------------- // PInvoke stub helpers //------------------------------------------------------- #if DEBUG [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern UIntPtr GetProcessGSCookie(); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void FailFast(); #endif [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void DoNDirectCall(); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void DoCLRToCOMCall(object thisPtr); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void SetLastError(); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr BeginStandalone(IntPtr pFrame, IntPtr pNMD, int dwStubFlags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr BeginStandaloneCleanup(IntPtr pFrame, IntPtr pNMD, int dwStubFlags); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr BeginCLRToCOMStandalone(IntPtr pFrame, IntPtr pCPCMD, int dwStubFlags, object pThis); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr BeginCLRToCOMStandaloneCleanup(IntPtr pFrame, IntPtr pCPCMD, int dwStubFlags, object pThis); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ThrowDeferredException(); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ThrowInteropParamException(int resID, int paramIdx); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void CreateCleanupList(IntPtr pCleanupWorkList); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void DestroyCleanupList(IntPtr pFrameMem, bool fExceptionThrown); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern object GetHRExceptionObject(int hr); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern object GetCOMHRExceptionObject(int hr, IntPtr pFrame, object pThis); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr CreateCustomMarshalerHelper(IntPtr pMD, int paramToken, IntPtr hndManagedType); //------------------------------------------------------- // AsAnyAMarshaler, AsAnyWMarshaler //------------------------------------------------------- [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr MarshalAsAny(ref object pManagedHome, int dwFlags, IntPtr pvMarshaler, IntPtr pCleanupWorkList); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void UnmarshalAsAny(ref object pManagedHome, IntPtr pvMarshaler); //-------------------------------------------------------- // SafeHandle Helper //------------------------------------------------------- [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr SafeHandleC2NHelper(object pThis, IntPtr pCleanupWorkList); //-------------------------------------------------------- // Helper for the MDA ----OnRCWCleanup //-------------------------------------------------------- [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void StubRegisterRCW(object pThis, IntPtr pThread, IntPtr pCleanupWorkList); //------------------------------------------------------- // Profiler helpers //-------------------------------------------------------- [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr ProfilerBeginTransitionCallback(IntPtr pSecretParam, IntPtr pThread, object pThis); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void ProfilerEndTransitionCallback(IntPtr pMD, IntPtr pThread); //------------------------------------------------------- // Debugger helpers //------------------------------------------------------- [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void DebuggerTraceCall(IntPtr pSecretParam); //----------------------------------------------------- // misc //------------------------------------------------------ static internal void CheckStringLength(int length) { if (length > 0x7ffffff0) { throw new MarshalDirectiveException(Environment.GetResourceString("Marshaler_StringTooLong")); } } [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern int strlen(sbyte* ptr); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern Decimal DecimalCanonicalizeInternal(Decimal dec); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern void FmtClassUpdateNativeInternal(object obj, byte* pNative, IntPtr pOptionalCleanupList); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern void FmtClassUpdateCLRInternal(object obj, byte* pNative); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal unsafe extern void LayoutDestroyNativeInternal(byte* pNative, IntPtr pMT); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern object AllocateInternal(IntPtr typeHandle); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern IntPtr MarshalToUnmanagedVaListInternal(IntPtr pArgIterator); [MethodImplAttribute(MethodImplOptions.InternalCall)] static internal extern void MarshalToManagedVaListInternal(IntPtr va_list, IntPtr pArgIterator); } #endif } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Rfc2898DeriveBytes.cs
- EntityDescriptor.cs
- MetabaseReader.cs
- RuleSettings.cs
- PageWrapper.cs
- AddInControllerImpl.cs
- OutputCacheProfile.cs
- SvcMapFileLoader.cs
- ListViewItem.cs
- ConfigurationValue.cs
- ProcessThreadDesigner.cs
- TargetInvocationException.cs
- WindowsIdentity.cs
- DrawListViewColumnHeaderEventArgs.cs
- DataGridItemCollection.cs
- EditorZoneBase.cs
- securitycriticaldataformultiplegetandset.cs
- Metafile.cs
- WebPartVerbsEventArgs.cs
- transactioncontext.cs
- WindowsScrollBar.cs
- MailWriter.cs
- XmlSchemaSimpleContentExtension.cs
- LayoutTable.cs
- SelectionItemProviderWrapper.cs
- ContentType.cs
- XPathEmptyIterator.cs
- TypeHelper.cs
- UncommonField.cs
- PrivateFontCollection.cs
- StyleCollection.cs
- XmlSerializationReader.cs
- SemanticResolver.cs
- CompiledAction.cs
- BuildManagerHost.cs
- EventInfo.cs
- SBCSCodePageEncoding.cs
- ContentElementAutomationPeer.cs
- DependencyObject.cs
- VirtualPathUtility.cs
- SqlInternalConnectionSmi.cs
- DataObjectEventArgs.cs
- HtmlInputButton.cs
- StreamMarshaler.cs
- EntityDataSourceContextCreatedEventArgs.cs
- MarkupObject.cs
- AdPostCacheSubstitution.cs
- ShutDownListener.cs
- TheQuery.cs
- NameValuePair.cs
- Boolean.cs
- EntityObject.cs
- DesignerProperties.cs
- ImageMetadata.cs
- WpfKnownMember.cs
- Events.cs
- ResXDataNode.cs
- MultipleCopiesCollection.cs
- SystemGatewayIPAddressInformation.cs
- LineServices.cs
- XmlSchemaInferenceException.cs
- UIElement.cs
- Int16KeyFrameCollection.cs
- ConstructorBuilder.cs
- TextSpanModifier.cs
- ProgressiveCrcCalculatingStream.cs
- DocumentViewerAutomationPeer.cs
- SQLByte.cs
- BrowserCapabilitiesCodeGenerator.cs
- TextSelectionHighlightLayer.cs
- CodeConstructor.cs
- WindowsUserNameCachingSecurityTokenAuthenticator.cs
- ContextMenuService.cs
- TextClipboardData.cs
- RegistryDataKey.cs
- BlockCollection.cs
- LZCodec.cs
- CqlIdentifiers.cs
- InvalidCastException.cs
- DataGridViewDataErrorEventArgs.cs
- ListViewItem.cs
- SinglePageViewer.cs
- ThousandthOfEmRealPoints.cs
- RuntimeTrackingProfile.cs
- XamlStream.cs
- SerializationEventsCache.cs
- BackgroundWorker.cs
- COM2IPerPropertyBrowsingHandler.cs
- StoreAnnotationsMap.cs
- StopRoutingHandler.cs
- IndexedSelectQueryOperator.cs
- CustomTypeDescriptor.cs
- ManifestResourceInfo.cs
- Stackframe.cs
- VisualBrush.cs
- RoutedEvent.cs
- SoapRpcServiceAttribute.cs
- CurrencyWrapper.cs
- StackSpiller.cs
- DiscardableAttribute.cs