The Labs \ Source Viewer \ SSCLI \ System.Runtime.InteropServices \ Marshal

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. /*=============================================================================
  16. **
  17. ** Class: Marshal
  18. **
  19. **
  20. ** Purpose: This class contains methods that are mainly used to marshal
  21. **          between unmanaged and managed types.
  22. **
  23. **
  24. =============================================================================*/
  25. namespace System.Runtime.InteropServices
  26. {
  27.     using System;
  28.     using System.Collections.Generic;
  29.     using System.Reflection;
  30.     using System.Reflection.Emit;
  31.     using System.Security;
  32.     using System.Security.Permissions;
  33.     using System.Text;
  34.     using System.Threading;
  35.     using System.Runtime.Remoting;
  36.     using System.Runtime.Remoting.Activation;
  37.     using System.Runtime.CompilerServices;
  38.     using System.Runtime.Remoting.Proxies;
  39.     using System.Globalization;
  40.     using System.Runtime.ConstrainedExecution;
  41.     using System.Runtime.Versioning;
  42.     using Win32Native = Microsoft.Win32.Win32Native;
  43.     using Microsoft.Win32.SafeHandles;
  44.    
  45.     //========================================================================
  46.     // All public methods, including PInvoke, are protected with linkchecks.
  47.     // Remove the default demands for all PInvoke methods with this global
  48.     // declaration on the class.
  49.     //========================================================================
  50.    
  51.     [SuppressUnmanagedCodeSecurityAttribute()]
  52.     public static class Marshal
  53.     {
  54.         //====================================================================
  55.         // Defines used inside the Marshal class.
  56.         //====================================================================
  57.         private const int LMEM_FIXED = 0;
  58.        
  59.         // Win32 has the concept of Atoms, where a pointer can either be a pointer
  60.         // or an int. If it's less than 64K, this is guaranteed to NOT be a
  61.         // pointer since the bottom 64K bytes are reserved in a process' page table.
  62.         // We should be careful about deallocating this stuff. Extracted to
  63.         // a function to avoid C# problems with lack of support for IntPtr.
  64.         // We have 2 of these methods for slightly different semantics for NULL.
  65.         private static bool IsWin32Atom(IntPtr ptr)
  66.         {
  67.             return false;
  68.         }
  69.        
  70.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  71.         private static bool IsNotWin32Atom(IntPtr ptr)
  72.         {
  73.             return false;
  74.         }
  75.        
  76.         //====================================================================
  77.         // The default character size for the system.
  78.         //====================================================================
  79.         public static readonly int SystemDefaultCharSize = 3 - Win32Native.lstrlen(new sbyte[] {65, 65, 0, 0});
  80.        
  81.         //====================================================================
  82.         // The max DBCS character size for the system.
  83.         //====================================================================
  84.         public static readonly int SystemMaxDBCSCharSize = GetSystemMaxDBCSCharSize();
  85.        
  86.        
  87.         //====================================================================
  88.         // The name, title and description of the assembly that will contain
  89.         // the dynamically generated interop types.
  90.         //====================================================================
  91.         private const string s_strConvertedTypeInfoAssemblyName = "InteropDynamicTypes";
  92.         private const string s_strConvertedTypeInfoAssemblyTitle = "Interop Dynamic Types";
  93.         private const string s_strConvertedTypeInfoAssemblyDesc = "Type dynamically generated from ITypeInfo's";
  94.         private const string s_strConvertedTypeInfoNameSpace = "InteropDynamicTypes";
  95.        
  96.        
  97.         //====================================================================
  98.         // Helper method to retrieve the system's maximum DBCS character size.
  99.         //====================================================================
  100.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  101.         private static extern int GetSystemMaxDBCSCharSize();
  102.        
  103.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  104.         public static string PtrToStringAnsi(IntPtr ptr)
  105.         {
  106.             if (Win32Native.NULL == ptr) {
  107.                 return null;
  108.             }
  109.             else if (IsWin32Atom(ptr)) {
  110.                 return null;
  111.             }
  112.             else {
  113.                 int nb = Win32Native.lstrlenA(ptr);
  114.                 if (nb == 0) {
  115.                     return string.Empty;
  116.                 }
  117.                 else {
  118.                     StringBuilder sb = new StringBuilder(nb);
  119.                     Win32Native.CopyMemoryAnsi(sb, ptr, new IntPtr(1 + nb));
  120.                     return sb.ToString();
  121.                 }
  122.             }
  123.         }
  124.        
  125.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  126.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  127.         public static extern string PtrToStringAnsi(IntPtr ptr, int len);
  128.        
  129.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  130.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  131.         public static extern string PtrToStringUni(IntPtr ptr, int len);
  132.        
  133.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  134.         public static string PtrToStringAuto(IntPtr ptr, int len)
  135.         {
  136.             return (SystemDefaultCharSize == 1) ? PtrToStringAnsi(ptr, len) : PtrToStringUni(ptr, len);
  137.         }
  138.        
  139.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  140.         public static string PtrToStringUni(IntPtr ptr)
  141.         {
  142.             if (Win32Native.NULL == ptr) {
  143.                 return null;
  144.             }
  145.             else if (IsWin32Atom(ptr)) {
  146.                 return null;
  147.             }
  148.             else {
  149.                 int nc = Win32Native.lstrlenW(ptr);
  150.                 StringBuilder sb = new StringBuilder(nc);
  151.                 Win32Native.CopyMemoryUni(sb, ptr, new IntPtr(2 * (1 + nc)));
  152.                 return sb.ToString();
  153.             }
  154.         }
  155.        
  156.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  157.         public static string PtrToStringAuto(IntPtr ptr)
  158.         {
  159.             if (Win32Native.NULL == ptr) {
  160.                 return null;
  161.             }
  162.             else if (IsWin32Atom(ptr)) {
  163.                 return null;
  164.             }
  165.             else {
  166.                 int nc = Win32Native.lstrlen(ptr);
  167.                 StringBuilder sb = new StringBuilder(nc);
  168.                 Win32Native.lstrcpy(sb, ptr);
  169.                 return sb.ToString();
  170.             }
  171.         }
  172.        
  173.         //====================================================================
  174.         // SizeOf()
  175.         //====================================================================
  176.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  177.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  178.        
  179.         [System.Runtime.InteropServices.ComVisible(true)]
  180.         public static extern int SizeOf(object structure);
  181.        
  182.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  183.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  184.         public static extern int SizeOf(Type t);
  185.        
  186.        
  187.         //====================================================================
  188.         // OffsetOf()
  189.         //====================================================================
  190.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  191.         public static IntPtr OffsetOf(Type t, string fieldName)
  192.         {
  193.             if (t == null)
  194.                 throw new ArgumentNullException("t");
  195.            
  196.             FieldInfo f = t.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
  197.             if (f == null)
  198.                 throw new ArgumentException(Environment.GetResourceString("Argument_OffsetOfFieldNotFound", t.FullName), "fieldName");
  199.             else if (!(f is RuntimeFieldInfo))
  200.                 throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeFieldInfo"), "fieldName");
  201.            
  202.             return OffsetOfHelper(((RuntimeFieldInfo)f).GetFieldHandle().Value);
  203.         }
  204.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  205.         private static extern IntPtr OffsetOfHelper(IntPtr f);
  206.        
  207.         //====================================================================
  208.         // UnsafeAddrOfPinnedArrayElement()
  209.         //
  210.         // IMPORTANT NOTICE: This method does not do any verification on the
  211.         // array. It must be used with EXTREME CAUTION since passing in
  212.         // an array that is not pinned or in the fixed heap can cause
  213.         // unexpected results !
  214.         //====================================================================
  215.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  216.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  217.         public static extern IntPtr UnsafeAddrOfPinnedArrayElement(Array arr, int index);
  218.        
  219.        
  220.         //====================================================================
  221.         // Copy blocks from CLR arrays to native memory.
  222.         //====================================================================
  223.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  224.         public static void Copy(int[] source, int startIndex, IntPtr destination, int length)
  225.         {
  226.             CopyToNative(source, startIndex, destination, length);
  227.         }
  228.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  229.         public static void Copy(char[] source, int startIndex, IntPtr destination, int length)
  230.         {
  231.             CopyToNative(source, startIndex, destination, length);
  232.         }
  233.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  234.         public static void Copy(short[] source, int startIndex, IntPtr destination, int length)
  235.         {
  236.             CopyToNative(source, startIndex, destination, length);
  237.         }
  238.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  239.         public static void Copy(long[] source, int startIndex, IntPtr destination, int length)
  240.         {
  241.             CopyToNative(source, startIndex, destination, length);
  242.         }
  243.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  244.         public static void Copy(float[] source, int startIndex, IntPtr destination, int length)
  245.         {
  246.             CopyToNative(source, startIndex, destination, length);
  247.         }
  248.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  249.         public static void Copy(double[] source, int startIndex, IntPtr destination, int length)
  250.         {
  251.             CopyToNative(source, startIndex, destination, length);
  252.         }
  253.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  254.         public static void Copy(byte[] source, int startIndex, IntPtr destination, int length)
  255.         {
  256.             CopyToNative(source, startIndex, destination, length);
  257.         }
  258.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  259.         public static void Copy(IntPtr[] source, int startIndex, IntPtr destination, int length)
  260.         {
  261.             CopyToNative(source, startIndex, destination, length);
  262.         }
  263.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  264.         private static extern void CopyToNative(object source, int startIndex, IntPtr destination, int length);
  265.        
  266.         //====================================================================
  267.         // Copy blocks from native memory to CLR arrays
  268.         //====================================================================
  269.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  270.         public static void Copy(IntPtr source, int[] destination, int startIndex, int length)
  271.         {
  272.             CopyToManaged(source, destination, startIndex, length);
  273.         }
  274.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  275.         public static void Copy(IntPtr source, char[] destination, int startIndex, int length)
  276.         {
  277.             CopyToManaged(source, destination, startIndex, length);
  278.         }
  279.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  280.         public static void Copy(IntPtr source, short[] destination, int startIndex, int length)
  281.         {
  282.             CopyToManaged(source, destination, startIndex, length);
  283.         }
  284.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  285.         public static void Copy(IntPtr source, long[] destination, int startIndex, int length)
  286.         {
  287.             CopyToManaged(source, destination, startIndex, length);
  288.         }
  289.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  290.         public static void Copy(IntPtr source, float[] destination, int startIndex, int length)
  291.         {
  292.             CopyToManaged(source, destination, startIndex, length);
  293.         }
  294.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  295.         public static void Copy(IntPtr source, double[] destination, int startIndex, int length)
  296.         {
  297.             CopyToManaged(source, destination, startIndex, length);
  298.         }
  299.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  300.         public static void Copy(IntPtr source, byte[] destination, int startIndex, int length)
  301.         {
  302.             CopyToManaged(source, destination, startIndex, length);
  303.         }
  304.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  305.         public static void Copy(IntPtr source, IntPtr[] destination, int startIndex, int length)
  306.         {
  307.             CopyToManaged(source, destination, startIndex, length);
  308.         }
  309.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  310.         private static extern void CopyToManaged(IntPtr source, object destination, int startIndex, int length);
  311.        
  312.         //====================================================================
  313.         // Read from memory
  314.         //====================================================================
  315.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_RU1")]
  316.         [ResourceExposure(ResourceScope.None)]
  317.         public static extern byte ReadByte(        [MarshalAs(UnmanagedType.AsAny), In()]
  318. object ptr, int ofs);
  319.        
  320.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_RU1")]
  321.         [ResourceExposure(ResourceScope.None)]
  322.         public static extern byte ReadByte(IntPtr ptr, int ofs);
  323.        
  324.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  325.         public static byte ReadByte(IntPtr ptr)
  326.         {
  327.             return ReadByte(ptr, 0);
  328.         }
  329.        
  330.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_RI2")]
  331.         [ResourceExposure(ResourceScope.None)]
  332.         public static extern short ReadInt16(        [MarshalAs(UnmanagedType.AsAny), In()]
  333. object ptr, int ofs);
  334.        
  335.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_RI2")]
  336.         [ResourceExposure(ResourceScope.None)]
  337.         public static extern short ReadInt16(IntPtr ptr, int ofs);
  338.        
  339.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  340.         public static short ReadInt16(IntPtr ptr)
  341.         {
  342.             return ReadInt16(ptr, 0);
  343.         }
  344.        
  345.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_RI4"), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  346.         [ResourceExposure(ResourceScope.None)]
  347.         public static extern int ReadInt32(        [MarshalAs(UnmanagedType.AsAny), In()]
  348. object ptr, int ofs);
  349.        
  350.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_RI4"), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  351.         [ResourceExposure(ResourceScope.None)]
  352.         public static extern int ReadInt32(IntPtr ptr, int ofs);
  353.        
  354.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  355.         public static int ReadInt32(IntPtr ptr)
  356.         {
  357.             return ReadInt32(ptr, 0);
  358.         }
  359.        
  360.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  361.         public static IntPtr ReadIntPtr(        [MarshalAs(UnmanagedType.AsAny), In()]
  362. object ptr, int ofs)
  363.         {
  364.             #if WIN32
  365.             return (IntPtr)ReadInt32(ptr, ofs);
  366.             #else
  367.             return (IntPtr)ReadInt64(ptr, ofs);
  368.             #endif
  369.         }
  370.        
  371.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  372.         public static IntPtr ReadIntPtr(IntPtr ptr, int ofs)
  373.         {
  374.             #if WIN32
  375.             return (IntPtr)ReadInt32(ptr, ofs);
  376.             #else
  377.             return (IntPtr)ReadInt64(ptr, ofs);
  378.             #endif
  379.         }
  380.        
  381.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  382.         public static IntPtr ReadIntPtr(IntPtr ptr)
  383.         {
  384.             #if WIN32
  385.             return (IntPtr)ReadInt32(ptr, 0);
  386.             #else
  387.             return (IntPtr)ReadInt64(ptr, 0);
  388.             #endif
  389.         }
  390.        
  391.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_RI8"), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  392.         public static extern long ReadInt64(        [MarshalAs(UnmanagedType.AsAny), In()]
  393. object ptr, int ofs);
  394.        
  395.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_RI8"), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  396.         public static extern long ReadInt64(IntPtr ptr, int ofs);
  397.        
  398.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  399.         public static long ReadInt64(IntPtr ptr)
  400.         {
  401.             return ReadInt64(ptr, 0);
  402.         }
  403.        
  404.        
  405.         //====================================================================
  406.         // Write to memory
  407.         //====================================================================
  408.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_WU1")]
  409.         public static extern void WriteByte(IntPtr ptr, int ofs, byte val);
  410.        
  411.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_WU1")]
  412.         public static extern void WriteByte(        [MarshalAs(UnmanagedType.AsAny), In(), Out()]
  413. object ptr, int ofs, byte val);
  414.        
  415.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  416.         public static void WriteByte(IntPtr ptr, byte val)
  417.         {
  418.             WriteByte(ptr, 0, val);
  419.         }
  420.        
  421.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_WI2")]
  422.         public static extern void WriteInt16(IntPtr ptr, int ofs, short val);
  423.        
  424.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_WI2")]
  425.         public static extern void WriteInt16(        [MarshalAs(UnmanagedType.AsAny), In(), Out()]
  426. object ptr, int ofs, short val);
  427.        
  428.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  429.         public static void WriteInt16(IntPtr ptr, short val)
  430.         {
  431.             WriteInt16(ptr, 0, val);
  432.         }
  433.        
  434.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  435.         public static void WriteInt16(IntPtr ptr, int ofs, char val)
  436.         {
  437.             WriteInt16(ptr, ofs, (short)val);
  438.         }
  439.        
  440.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  441.         public static void WriteInt16(        [In(), Out()]
  442. object ptr, int ofs, char val)
  443.         {
  444.             WriteInt16(ptr, ofs, (short)val);
  445.         }
  446.        
  447.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  448.         public static void WriteInt16(IntPtr ptr, char val)
  449.         {
  450.             WriteInt16(ptr, 0, (short)val);
  451.         }
  452.        
  453.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_WI4")]
  454.         public static extern void WriteInt32(IntPtr ptr, int ofs, int val);
  455.        
  456.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_WI4")]
  457.         public static extern void WriteInt32(        [MarshalAs(UnmanagedType.AsAny), In(), Out()]
  458. object ptr, int ofs, int val);
  459.        
  460.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  461.         public static void WriteInt32(IntPtr ptr, int val)
  462.         {
  463.             WriteInt32(ptr, 0, val);
  464.         }
  465.        
  466.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  467.         public static void WriteIntPtr(IntPtr ptr, int ofs, IntPtr val)
  468.         {
  469.             #if WIN32
  470.             WriteInt32(ptr, ofs, (int)val);
  471.             #else
  472.             WriteInt64(ptr, ofs, (long)val);
  473.             #endif
  474.         }
  475.        
  476.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  477.         public static void WriteIntPtr(        [MarshalAs(UnmanagedType.AsAny), In(), Out()]
  478. object ptr, int ofs, IntPtr val)
  479.         {
  480.             #if WIN32
  481.             WriteInt32(ptr, ofs, (int)val);
  482.             #else
  483.             WriteInt64(ptr, ofs, (long)val);
  484.             #endif
  485.         }
  486.        
  487.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  488.         public static void WriteIntPtr(IntPtr ptr, IntPtr val)
  489.         {
  490.             #if WIN32
  491.             WriteInt32(ptr, 0, (int)val);
  492.             #else
  493.             WriteInt64(ptr, 0, (long)val);
  494.             #endif
  495.         }
  496.        
  497.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_WI8")]
  498.         public static extern void WriteInt64(IntPtr ptr, int ofs, long val);
  499.        
  500.         [DllImport(Win32Native.SHIM, EntryPoint = "ND_WI8")]
  501.         public static extern void WriteInt64(        [MarshalAs(UnmanagedType.AsAny), In(), Out()]
  502. object ptr, int ofs, long val);
  503.        
  504.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  505.         public static void WriteInt64(IntPtr ptr, long val)
  506.         {
  507.             WriteInt64(ptr, 0, val);
  508.         }
  509.        
  510.        
  511.         //====================================================================
  512.         // GetLastWin32Error
  513.         //====================================================================
  514.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  515.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  516.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  517.         public static extern int GetLastWin32Error();
  518.        
  519.        
  520.         //====================================================================
  521.         // SetLastWin32Error
  522.         //====================================================================
  523.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  524.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  525.         static internal extern void SetLastWin32Error(int error);
  526.        
  527.        
  528.         //====================================================================
  529.         // GetHRForLastWin32Error
  530.         //====================================================================
  531.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  532.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  533.         public static int GetHRForLastWin32Error()
  534.         {
  535.             int dwLastError = GetLastWin32Error();
  536.             if ((dwLastError & 2147483648u) == 2147483648u)
  537.                 return dwLastError;
  538.             else
  539.                 return (dwLastError & 65535) | unchecked((int)2147942400u);
  540.         }
  541.        
  542.        
  543.         //====================================================================
  544.         // Prelink
  545.         //====================================================================
  546.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  547.         public static void Prelink(MethodInfo m)
  548.         {
  549.             if (m == null)
  550.                 throw new ArgumentNullException("m");
  551.            
  552.             if (!(m is RuntimeMethodInfo))
  553.                 throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeMethodInfo"));
  554.            
  555.             RuntimeMethodHandle method = m.MethodHandle;
  556.            
  557.             InternalPrelink(method.Value);
  558.         }
  559.        
  560.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  561.         private static extern void InternalPrelink(IntPtr m);
  562.        
  563.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  564.         public static void PrelinkAll(Type c)
  565.         {
  566.             if (c == null)
  567.                 throw new ArgumentNullException("c");
  568.            
  569.             MethodInfo[] mi = c.GetMethods();
  570.             if (mi != null) {
  571.                 for (int i = 0; i < mi.Length; i++) {
  572.                     Prelink(mi[i]);
  573.                 }
  574.             }
  575.         }
  576.        
  577.         //====================================================================
  578.         // NumParamBytes
  579.         //====================================================================
  580.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  581.         public static int NumParamBytes(MethodInfo m)
  582.         {
  583.             if (m == null)
  584.                 throw new ArgumentNullException("m");
  585.            
  586.             if (!(m is RuntimeMethodInfo))
  587.                 throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeMethodInfo"));
  588.            
  589.             RuntimeMethodHandle method = m.GetMethodHandle();
  590.            
  591.             return InternalNumParamBytes(method.Value);
  592.         }
  593.        
  594.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  595.         private static extern int InternalNumParamBytes(IntPtr m);
  596.        
  597.         //====================================================================
  598.         // Win32 Exception stuff
  599.         // These are mostly interesting for Structured exception handling,
  600.         // but need to be exposed for all exceptions (not just SEHException).
  601.         //====================================================================
  602.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  603.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  604.         [System.Runtime.InteropServices.ComVisible(true)]
  605.             /* struct _EXCEPTION_POINTERS* */        public static extern IntPtr GetExceptionPointers();
  606.        
  607.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  608.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  609.         public static extern int GetExceptionCode();
  610.        
  611.        
  612.         //====================================================================
  613.         // Marshals data from a structure class to a native memory block.
  614.         // If the structure contains pointers to allocated blocks and
  615.         // "fDeleteOld" is true, this routine will call DestroyStructure() first.
  616.         //====================================================================
  617.         [MethodImplAttribute(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
  618.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  619.         [System.Runtime.InteropServices.ComVisible(true)]
  620.         public static extern void StructureToPtr(object structure, IntPtr ptr, bool fDeleteOld);
  621.        
  622.        
  623.         //====================================================================
  624.         // Marshals data from a native memory block to a preallocated structure class.
  625.         //====================================================================
  626.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  627.         [System.Runtime.InteropServices.ComVisible(true)]
  628.         public static void PtrToStructure(IntPtr ptr, object structure)
  629.         {
  630.             PtrToStructureHelper(ptr, structure, false);
  631.         }
  632.        
  633.        
  634.         //====================================================================
  635.         // Creates a new instance of "structuretype" and marshals data from a
  636.         // native memory block to it.
  637.         //====================================================================
  638.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  639.         [System.Runtime.InteropServices.ComVisible(true)]
  640.         public static object PtrToStructure(IntPtr ptr, Type structureType)
  641.         {
  642.             if (ptr == Win32Native.NULL)
  643.                 return null;
  644.            
  645.             if (structureType == null)
  646.                 throw new ArgumentNullException("structureType");
  647.            
  648.             if (structureType.IsGenericType)
  649.                 throw new ArgumentException(Environment.GetResourceString("Argument_NeedNonGenericType"), "structureType");
  650.            
  651.             object structure = Activator.InternalCreateInstanceWithNoMemberAccessCheck(structureType, true);
  652.             PtrToStructureHelper(ptr, structure, true);
  653.             return structure;
  654.         }
  655.        
  656.        
  657.         //====================================================================
  658.         // Helper function to copy a pointer into a preallocated structure.
  659.         //====================================================================
  660.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  661.         private static extern void PtrToStructureHelper(IntPtr ptr, object structure, bool allowValueClasses);
  662.        
  663.        
  664.         //====================================================================
  665.         // Freeds all substructures pointed to by the native memory block.
  666.         // "structureclass" is used to provide layout information.
  667.         //====================================================================
  668.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  669.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  670.         [System.Runtime.InteropServices.ComVisible(true)]
  671.         public static extern void DestroyStructure(IntPtr ptr, Type structuretype);
  672.        
  673.        
  674.         //====================================================================
  675.         // Returns the HInstance for this module. Returns -1 if the module
  676.         // doesn't have an HInstance. In Memory (Dynamic) Modules won't have
  677.         // an HInstance.
  678.         //====================================================================
  679.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  680.         public static IntPtr GetHINSTANCE(Module m)
  681.         {
  682.             if (m == null)
  683.                 throw new ArgumentNullException("m");
  684.             return m.GetHINSTANCE();
  685.         }
  686.        
  687.        
  688.         //====================================================================
  689.         // Throws a CLR exception based on the HRESULT.
  690.         //====================================================================
  691.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  692.         public static void ThrowExceptionForHR(int errorCode)
  693.         {
  694.             if (errorCode < 0)
  695.                 ThrowExceptionForHRInternal(errorCode, Win32Native.NULL);
  696.         }
  697.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  698.         public static void ThrowExceptionForHR(int errorCode, IntPtr errorInfo)
  699.         {
  700.             if (errorCode < 0)
  701.                 ThrowExceptionForHRInternal(errorCode, errorInfo);
  702.         }
  703.        
  704.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  705.         static internal extern void ThrowExceptionForHRInternal(int errorCode, IntPtr errorInfo);
  706.        
  707.        
  708.         //====================================================================
  709.         // Converts the HRESULT to a CLR exception.
  710.         //====================================================================
  711.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  712.         public static Exception GetExceptionForHR(int errorCode)
  713.         {
  714.             if (errorCode < 0)
  715.                 return GetExceptionForHRInternal(errorCode, Win32Native.NULL);
  716.             else
  717.                 return null;
  718.         }
  719.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  720.         public static Exception GetExceptionForHR(int errorCode, IntPtr errorInfo)
  721.         {
  722.             if (errorCode < 0)
  723.                 return GetExceptionForHRInternal(errorCode, errorInfo);
  724.             else
  725.                 return null;
  726.         }
  727.        
  728.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  729.         static internal extern Exception GetExceptionForHRInternal(int errorCode, IntPtr errorInfo);
  730.        
  731.        
  732.         //====================================================================
  733.         // Converts the CLR exception to an HRESULT. This function also sets
  734.         // up an IErrorInfo for the exception.
  735.         //====================================================================
  736.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  737.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  738.         public static extern int GetHRForException(Exception e);
  739.        
  740.        
  741.        
  742.         //====================================================================
  743.         // Memory allocation and dealocation.
  744.         //====================================================================
  745.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  746.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
  747.         public static IntPtr AllocHGlobal(IntPtr cb)
  748.         {
  749.             IntPtr pNewMem = Win32Native.LocalAlloc_NoSafeHandle(LMEM_FIXED, cb);
  750.            
  751.             if (pNewMem == Win32Native.NULL) {
  752.                 throw new OutOfMemoryException();
  753.             }
  754.             return pNewMem;
  755.         }
  756.        
  757.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  758.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
  759.         public static IntPtr AllocHGlobal(int cb)
  760.         {
  761.             return AllocHGlobal((IntPtr)cb);
  762.         }
  763.        
  764.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  765.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  766.         public static void FreeHGlobal(IntPtr hglobal)
  767.         {
  768.             if (IsNotWin32Atom(hglobal)) {
  769.                 if (Win32Native.NULL != Win32Native.LocalFree(hglobal)) {
  770.                     ThrowExceptionForHR(GetHRForLastWin32Error());
  771.                 }
  772.             }
  773.         }
  774.        
  775.        
  776.        
  777.        
  778.         //====================================================================
  779.         // check if the object is classic COM component
  780.         //====================================================================
  781.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  782.         public static bool IsComObject(object o)
  783.         {
  784.             return false;
  785.         }
  786.        
  787.        
  788.        
  789.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  790.         public static Delegate GetDelegateForFunctionPointer(IntPtr ptr, Type t)
  791.         {
  792.             // Validate the parameters
  793.             if (ptr == IntPtr.Zero)
  794.                 throw new ArgumentNullException("ptr");
  795.            
  796.             if (t == null)
  797.                 throw new ArgumentNullException("t");
  798.            
  799.             if ((t as RuntimeType) == null)
  800.                 throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"), "t");
  801.            
  802.             if (t.IsGenericType)
  803.                 throw new ArgumentException(Environment.GetResourceString("Argument_NeedNonGenericType"), "t");
  804.            
  805.             Type c = t.BaseType;
  806.             if (c == null || (c != typeof(Delegate) && c != typeof(MulticastDelegate)))
  807.                 throw new ArgumentException(Environment.GetResourceString("Arg_MustBeDelegate"), "t");
  808.            
  809.             return GetDelegateForFunctionPointerInternal(ptr, t);
  810.         }
  811.        
  812.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  813.         static internal extern Delegate GetDelegateForFunctionPointerInternal(IntPtr ptr, Type t);
  814.        
  815.         [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  816.         public static IntPtr GetFunctionPointerForDelegate(Delegate d)
  817.         {
  818.             if (d == null)
  819.                 throw new ArgumentNullException("d");
  820.            
  821.             return GetFunctionPointerForDelegateInternal(d);
  822.         }
  823.        
  824.         [MethodImplAttribute(MethodImplOptions.InternalCall)]
  825.         static internal extern IntPtr GetFunctionPointerForDelegateInternal(Delegate d);
  826.        
  827.     }
  828.    
  829. }

Developer Fusion