1 |
using System; |
2 |
using System.Collections.Generic; |
3 |
using System.Text; |
4 |
|
5 |
using gr2lib.core.coretypes.native; |
6 |
using System.Runtime.InteropServices; |
7 |
|
8 |
namespace gr2lib.core.helpers |
9 |
{ |
10 |
internal class Helpers |
11 |
{ |
12 |
public static T ReadFromMemory<T>(IntPtr pointer) where T : struct |
13 |
{ |
14 |
try |
15 |
{ |
16 |
if (pointer == IntPtr.Zero) |
17 |
{ |
18 |
throw new InvalidOperationException(); |
19 |
} |
20 |
|
21 |
return (T)Marshal.PtrToStructure(pointer, typeof(T)); |
22 |
} |
23 |
catch (Exception ex) |
24 |
{ |
25 |
Console.WriteLine(ex.ToString()); |
26 |
return default(T); |
27 |
} |
28 |
} |
29 |
|
30 |
public static T[] ReadArrayFromMemory<T>(ArrayOfStructures array) where T : struct |
31 |
{ |
32 |
try |
33 |
{ |
34 |
return ReadArrayFromMemory<T>(array.Count, array.Pointer); |
35 |
} |
36 |
catch (Exception ex) |
37 |
{ |
38 |
Console.WriteLine(ex.ToString()); |
39 |
return default(T[]); |
40 |
} |
41 |
} |
42 |
|
43 |
public static T[] ReadArrayFromMemory<T>(int count, IntPtr pointer) where T : struct |
44 |
{ |
45 |
try |
46 |
{ |
47 |
T[] rez = new T[count]; |
48 |
int size = SizeOfStruct<T>(); |
49 |
for (int i = 0; i < count; i++) |
50 |
{ |
51 |
rez[i] = ReadFromMemory<T>(new IntPtr(pointer.ToInt32() + (i * size))); |
52 |
} |
53 |
return rez; |
54 |
} |
55 |
catch (Exception ex) |
56 |
{ |
57 |
Console.WriteLine(ex.ToString()); |
58 |
return default(T[]); |
59 |
} |
60 |
} |
61 |
|
62 |
public static IntPtr[] ReadPtrArrayFromMemory<T>(ArrayOfStructures array) where T : struct |
63 |
{ |
64 |
try |
65 |
{ |
66 |
return ReadPtrArrayFromMemory<T>(array.Count, array.Pointer); |
67 |
} |
68 |
catch (Exception ex) |
69 |
{ |
70 |
Console.WriteLine(ex.ToString()); |
71 |
return default(IntPtr[]); |
72 |
} |
73 |
} |
74 |
|
75 |
public static IntPtr[] ReadPtrArrayFromMemory<T>(int count, IntPtr pointer) where T : struct |
76 |
{ |
77 |
try |
78 |
{ |
79 |
IntPtr[] rez = new IntPtr[count]; |
80 |
int size = SizeOfStruct<T>(); |
81 |
for (int i = 0; i < count; i++) |
82 |
{ |
83 |
rez[i] = new IntPtr(pointer.ToInt32() + (i * size)); |
84 |
} |
85 |
return rez; |
86 |
} |
87 |
catch (Exception ex) |
88 |
{ |
89 |
Console.WriteLine(ex.ToString()); |
90 |
return default(IntPtr[]); |
91 |
} |
92 |
} |
93 |
|
94 |
public static IntPtr[] ReadArrayFromMemory(ArrayOfReferences array) |
95 |
{ |
96 |
try |
97 |
{ |
98 |
return ReadArrayFromMemory(array.Count, array.Pointer); |
99 |
} |
100 |
catch (Exception ex) |
101 |
{ |
102 |
Console.WriteLine(ex.ToString()); |
103 |
return default(IntPtr[]); |
104 |
} |
105 |
} |
106 |
|
107 |
public static IntPtr[] ReadArrayFromMemory(int count, IntPtr pointer) |
108 |
{ |
109 |
try |
110 |
{ |
111 |
IntPtr[] rez = new IntPtr[count]; |
112 |
for (int i = 0; i < count; i++) |
113 |
{ |
114 |
rez[i] = new IntPtr(Marshal.ReadInt32(new IntPtr(pointer.ToInt32() + (i * 4)))); |
115 |
} |
116 |
return rez; |
117 |
} |
118 |
catch (Exception ex) |
119 |
{ |
120 |
Console.WriteLine(ex.ToString()); |
121 |
return default(IntPtr[]); |
122 |
} |
123 |
} |
124 |
|
125 |
//public static VariantReference[] ReadArrayFromMemory(ArrayOfVariants array) |
126 |
//{ |
127 |
// Native.VariantReference[] rez = new Native.VariantReference[array.Count]; |
128 |
// for (int i = 0; i < array.Count; i++) |
129 |
// { |
130 |
// rez[i] = new Native.VariantReference(); |
131 |
// rez[i].Unknown1 = new IntPtr(Marshal.ReadInt32(new IntPtr(array.Pointer.Unknown1.ToInt32() + (i * 8)))); |
132 |
// rez[i].Unknown2 = new IntPtr(Marshal.ReadInt32(new IntPtr(array.Pointer.Unknown2.ToInt32() + (i * 8)))); |
133 |
// } |
134 |
// return rez; |
135 |
//} |
136 |
|
137 |
//public static StringMember[] ReadStrMemsFromMemory(IntPtr pointer) |
138 |
//{ |
139 |
// /*ATTENTION! |
140 |
// In original code, a null reference is StringMember[] sm is used to gather the number of string members: |
141 |
// * for(int i = 0; sm[i].Type; ++i) |
142 |
// * ++nVertexComponents |
143 |
// */ |
144 |
// List<Native.StringMember> smList = new List<Native.StringMember>(); |
145 |
// int count = 0; |
146 |
// int start = pointer.ToInt32(); |
147 |
// while (1 == 1) |
148 |
// { |
149 |
// try |
150 |
// { |
151 |
// Native.StringMember sm = ReadFromMemory<Native.StringMember>(new IntPtr(start + (count * 32))); |
152 |
// if (sm.Type == 0) break; |
153 |
// smList.Add(sm); |
154 |
// ++count; |
155 |
// } |
156 |
// catch (Exception) |
157 |
// { |
158 |
// break; |
159 |
// } |
160 |
// } |
161 |
// return smList.ToArray(); |
162 |
//} |
163 |
|
164 |
public static int SizeOfStruct<T>() where T : struct |
165 |
{ |
166 |
object[] attributes = typeof(T).GetCustomAttributes(false); |
167 |
if (attributes == null || attributes.Length < 1) return 0; |
168 |
int size = 0; |
169 |
foreach (object attribute in attributes) |
170 |
{ |
171 |
if (attribute is SizeAttribute) |
172 |
{ |
173 |
size = (attribute as SizeAttribute).Size; |
174 |
break; |
175 |
} |
176 |
} |
177 |
return size; |
178 |
} |
179 |
} |
180 |
} |