Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
BSTRMarshaler.cs
Go to the documentation of this file.
2
3namespace System.StubHelpers;
4
5internal static class BSTRMarshaler
6{
7 internal unsafe static IntPtr ConvertToNative(string strManaged, IntPtr pNativeBuffer)
8 {
9 if (strManaged == null)
10 {
11 return IntPtr.Zero;
12 }
13 byte data;
14 bool flag = strManaged.TryGetTrailByte(out data);
15 uint num = (uint)(strManaged.Length * 2);
16 if (flag)
17 {
18 num++;
19 }
20 byte* ptr;
21 if (pNativeBuffer != IntPtr.Zero)
22 {
23 *(uint*)(void*)pNativeBuffer = num;
24 ptr = (byte*)(void*)pNativeBuffer + 4;
25 }
26 else
27 {
28 ptr = (byte*)(void*)Marshal.AllocBSTRByteLen(num);
29 }
30 Buffer.Memmove(ref *(char*)ptr, ref strManaged.GetRawStringData(), (nuint)strManaged.Length + (nuint)1u);
31 if (flag)
32 {
33 ptr[num - 1] = data;
34 }
35 return (IntPtr)ptr;
36 }
37
38 internal unsafe static string ConvertToManaged(IntPtr bstr)
39 {
40 if (IntPtr.Zero == bstr)
41 {
42 return null;
43 }
44 uint num = Marshal.SysStringByteLen(bstr);
46 string text = ((num != 1) ? new string((char*)(void*)bstr, 0, (int)(num / 2)) : string.FastAllocateString(0));
47 if ((num & 1) == 1)
48 {
49 text.SetTrailByte(((byte*)(void*)bstr)[num - 1]);
50 }
51 return text;
52 }
53
54 internal static void ClearNative(IntPtr pNative)
55 {
56 Marshal.FreeBSTR(pNative);
57 }
58}
static void Memmove(ref byte dest, ref byte src, nuint len)
Definition Buffer.cs:215
static unsafe uint SysStringByteLen(IntPtr s)
Definition Marshal.cs:1551
static IntPtr AllocBSTRByteLen(uint length)
Definition Marshal.cs:1740
static void FreeBSTR(IntPtr ptr)
Definition Marshal.cs:1750
static unsafe IntPtr ConvertToNative(string strManaged, IntPtr pNativeBuffer)
static void ClearNative(IntPtr pNative)
static unsafe string ConvertToManaged(IntPtr bstr)
static void CheckStringLength(int length)
static readonly IntPtr Zero
Definition IntPtr.cs:18