X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Runtime.InteropServices%2FMarshal.cs;h=f983beeb634111f050844731b252ead7ccf04db1;hb=c5cdfaec1e0973ced3f97ef589cd0bece56067ad;hp=424bb0b26079e1fd306dce70af519a8c634d7e70;hpb=31ca4c480c7cf3f94029222335d84e4fde6dfbc5;p=mono.git diff --git a/mcs/class/corlib/System.Runtime.InteropServices/Marshal.cs b/mcs/class/corlib/System.Runtime.InteropServices/Marshal.cs index 424bb0b2607..f983beeb634 100644 --- a/mcs/class/corlib/System.Runtime.InteropServices/Marshal.cs +++ b/mcs/class/corlib/System.Runtime.InteropServices/Marshal.cs @@ -408,10 +408,14 @@ namespace System.Runtime.InteropServices #if !FULL_AOT_RUNTIME public static int GetHRForException (Exception e) { +#if FEATURE_COMINTEROP var errorInfo = new ManagedErrorInfo(e); SetErrorInfo (0, errorInfo); - return e.hresult; + return e._HResult; +#else + return -1; +#endif } [MonoTODO] @@ -788,7 +792,7 @@ namespace System.Runtime.InteropServices return *(short*)addr; short s; - String.memcpy ((byte*)&s, (byte*)ptr, 2); + Buffer.Memcpy ((byte*)&s, (byte*)ptr, 2); return s; } @@ -800,7 +804,7 @@ namespace System.Runtime.InteropServices return *(short*)addr; short s; - String.memcpy ((byte*)&s, addr, 2); + Buffer.Memcpy ((byte*)&s, addr, 2); return s; } @@ -820,7 +824,7 @@ namespace System.Runtime.InteropServices return *(int*)addr; int s; - String.memcpy ((byte*)&s, addr, 4); + Buffer.Memcpy ((byte*)&s, addr, 4); return s; } @@ -833,7 +837,7 @@ namespace System.Runtime.InteropServices return *(int*)addr; else { int s; - String.memcpy ((byte*)&s, addr, 4); + Buffer.Memcpy ((byte*)&s, addr, 4); return s; } } @@ -857,7 +861,7 @@ namespace System.Runtime.InteropServices return *(long*)ptr; long s; - String.memcpy ((byte*)&s, addr, 8); + Buffer.Memcpy ((byte*)&s, addr, 8); return s; } @@ -869,7 +873,7 @@ namespace System.Runtime.InteropServices return *(long*)addr; long s; - String.memcpy ((byte*)&s, addr, 8); + Buffer.Memcpy ((byte*)&s, addr, 8); return s; } @@ -975,6 +979,21 @@ namespace System.Runtime.InteropServices return SizeOf (structure.GetType ()); } + internal static uint SizeOfType (Type type) + { + return (uint) SizeOf (type); + } + + internal static uint AlignedSizeOf () where T : struct + { + uint size = SizeOfType (typeof (T)); + if (size == 1 || size == 2) + return size; + if (IntPtr.Size == 8 && size == 4) + return size; + return (size + 3) & (~((uint)3)); + } + [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern static IntPtr StringToBSTR (string s); @@ -1032,25 +1051,21 @@ namespace System.Runtime.InteropServices { if (s == null) throw new ArgumentNullException ("s"); - int len = s.Length; - IntPtr ctm = AllocCoTaskMem ((len+1) * 2 + 4); - byte [] buffer = null; - WriteInt32 (ctm, 0, len*2); - try { - buffer = s.GetBuffer (); - for (int i = 0; i < len; i++) - WriteInt16 (ctm, 4 + (i * 2), (short) ((buffer [(i*2)] << 8) | (buffer [i*2+1]))); - WriteInt16 (ctm, 4 + buffer.Length, 0); - } finally { - if (buffer != null) - for (int i = buffer.Length; i > 0; ){ - i--; - buffer [i] = 0; - } + byte[] buffer = s.GetBuffer (); + int len = s.Length; + + // SecureString doesn't take endian-ness into account. + // Therefore swap bytes here before we send it to c-side if little-endian. + if (BitConverter.IsLittleEndian) { + for (int i = 0; i < buffer.Length; i += 2) { + byte b = buffer[i]; + buffer[i] = buffer[i + 1]; + buffer[i + 1] = b; + } } - return (IntPtr) ((long)ctm + 4); - } + return BufferToBSTR (buffer, len); + } public static IntPtr SecureStringToCoTaskMemAnsi (SecureString s) { @@ -1137,6 +1152,10 @@ namespace System.Runtime.InteropServices throw ex; } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public extern static IntPtr BufferToBSTR (Array ptr, int slen); + [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern static IntPtr UnsafeAddrOfPinnedArrayElement (Array arr, int index); @@ -1171,7 +1190,7 @@ namespace System.Runtime.InteropServices if (((uint)addr & 1) == 0) *(short*)addr = val; else - String.memcpy (addr, (byte*)&val, 2); + Buffer.Memcpy (addr, (byte*)&val, 2); } public static unsafe void WriteInt16 (IntPtr ptr, int ofs, short val) @@ -1181,7 +1200,7 @@ namespace System.Runtime.InteropServices if (((uint)addr & 1) == 0) *(short*)addr = val; else { - String.memcpy (addr, (byte*)&val, 2); + Buffer.Memcpy (addr, (byte*)&val, 2); } } @@ -1215,7 +1234,7 @@ namespace System.Runtime.InteropServices if (((uint)addr & 3) == 0) *(int*)addr = val; else { - String.memcpy (addr, (byte*)&val, 4); + Buffer.Memcpy (addr, (byte*)&val, 4); } } @@ -1226,7 +1245,7 @@ namespace System.Runtime.InteropServices if (((uint)addr & 3) == 0) *(int*)addr = val; else { - String.memcpy (addr, (byte*)&val, 4); + Buffer.Memcpy (addr, (byte*)&val, 4); } } @@ -1246,7 +1265,7 @@ namespace System.Runtime.InteropServices if (((uint)addr & 7) == 0) *(long*)addr = val; else - String.memcpy (addr, (byte*)&val, 8); + Buffer.Memcpy (addr, (byte*)&val, 8); } public static unsafe void WriteInt64 (IntPtr ptr, int ofs, long val) @@ -1258,7 +1277,7 @@ namespace System.Runtime.InteropServices if (((uint)addr & 7) == 0) *(long*)addr = val; else - String.memcpy (addr, (byte*)&val, 8); + Buffer.Memcpy (addr, (byte*)&val, 8); } [MonoTODO] @@ -1503,6 +1522,7 @@ namespace System.Runtime.InteropServices return null; } +#if FEATURE_COMINTEROP [DllImport ("oleaut32.dll", CharSet=CharSet.Unicode, EntryPoint = "SetErrorInfo")] static extern int _SetErrorInfo (int dwReserved, [MarshalAs(UnmanagedType.Interface)] IErrorInfo pIErrorInfo); @@ -1551,7 +1571,7 @@ namespace System.Runtime.InteropServices } return retVal; } - +#endif public static Exception GetExceptionForHR (int errorCode) { return GetExceptionForHR (errorCode, IntPtr.Zero); @@ -1559,7 +1579,7 @@ namespace System.Runtime.InteropServices public static Exception GetExceptionForHR (int errorCode, IntPtr errorInfo) { -#if !MOBILE +#if FEATURE_COMINTEROP IErrorInfo info = null; if (errorInfo != (IntPtr)(-1)) { if (errorInfo == IntPtr.Zero) { @@ -1571,7 +1591,7 @@ namespace System.Runtime.InteropServices } } - if (info is ManagedErrorInfo && ((ManagedErrorInfo) info).Exception.hresult == errorCode) { + if (info is ManagedErrorInfo && ((ManagedErrorInfo) info).Exception._HResult == errorCode) { return ((ManagedErrorInfo) info).Exception; } @@ -1644,5 +1664,9 @@ namespace System.Runtime.InteropServices return GetFunctionPointerForDelegateInternal ((Delegate)(object)d); } + + internal static void SetLastWin32Error (int error) + { + } } }