Hoi,
Ik ben bezig met een programma dat moet communiceren met een spel. Het spel schrijft data naar een Memory Mapped File, welke ik met mijn C# programma uitlees:
De Physics struct is een struct die nauw samen hangt met de struct zoals hij in C++ gedefinieerd is, waar het op neer komt is dat ik moet instellen wat de 'packsize' is en dat ik alle arrays fixed-length moet maken:
Om dit te doen moet ik de struct dus unsafe maken. Nu heb ik daar absoluut geen ervaring mee en hoe meer ik er over lees hoe minder ik dit wil doen... Blijkbaar moet ik nu zelf gaan memory management gaan doen en dat kan enorm mis gaan, zo niet kwetsbaar voor exploits zijn...?? Dit klinkt allemaal "beangstigend", is dat inderdaad zo of valt dat in de praktijk wel mee? Wat houdt dit voor mijn programma in, moet ik verder iets speciaals doen om hier mee om te gaan?
Als ik het hele unsafe en fixed gebeuren weg laat (en alle arrays als normale arrays definieer) gaat het mis (een error wat erop neerkomt dat hij beveiligde memory wil lezen), uiteraard omdat de grootte van de arrays nu niet bekend zijn en het mis gaat bij het overkopieren van de pointer. Ik weet geen andere manier om de lengte van de arrays aan te geven (is die er?).
Verder heb ik hier nog een probleem mee, mocht ik hiermee verder gaan. Hoe kan ik de waarden uit de arrays nu uitlezen? Ik ging er eigenlijk stiekem vanuit dat ik gewoon normale int[] en float[] arrays terug kreeg, maar helaas... ik krijg natuurlijk pointers terug. Daar heb ik dus geen kaas van gegeten, en ik moet dus de waarde van die pointer gaan opvragen - en daar heb ik dus weer unsafe code voor nodig.... Dat wil ik helemaal niet!
Kan ik hier op een of andere manier omheen of kan ik er niet onderuit om unsafe code te gaan gebruiken?
Ik ben bezig met een programma dat moet communiceren met een spel. Het spel schrijft data naar een Memory Mapped File, welke ik met mijn C# programma uitlees:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| _mmf = MemoryMappedFile.OpenExisting("Local\\acpmf_physics"); using (var stream = _mmf.CreateViewStream()) { using (var reader = new BinaryReader(stream)) { var size = Marshal.SizeOf(typeof(Physics)); var bytes = reader.ReadBytes(size); var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); var data = (Physics)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Physics)); handle.Free(); return data; } } |
De Physics struct is een struct die nauw samen hangt met de struct zoals hij in C++ gedefinieerd is, waar het op neer komt is dat ik moet instellen wat de 'packsize' is en dat ik alle arrays fixed-length moet maken:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi)] public unsafe struct Physics { public int PacketId; public float Gas; public float Brake; public float Fuel; public int Gear; public int Rpms; public float SteerAngle; public float SpeedKmh; public fixed float Velocity[3]; public fixed float AccG[3]; public fixed float WheelSlip[4]; public fixed float WheelLoad[4]; public fixed float WheelsPressure[4]; public fixed float WheelAngularSpeed[4]; public fixed float TyreWear[4]; public fixed float TyreDirtyLevel[4]; public fixed float TyreCoreTemperature[4]; public fixed float CamberRad[4]; public fixed float SuspensionTravel[4]; public fixed float CarDamage[5]; public int NumberOfTyresOut; } |
Om dit te doen moet ik de struct dus unsafe maken. Nu heb ik daar absoluut geen ervaring mee en hoe meer ik er over lees hoe minder ik dit wil doen... Blijkbaar moet ik nu zelf gaan memory management gaan doen en dat kan enorm mis gaan, zo niet kwetsbaar voor exploits zijn...?? Dit klinkt allemaal "beangstigend", is dat inderdaad zo of valt dat in de praktijk wel mee? Wat houdt dit voor mijn programma in, moet ik verder iets speciaals doen om hier mee om te gaan?
Als ik het hele unsafe en fixed gebeuren weg laat (en alle arrays als normale arrays definieer) gaat het mis (een error wat erop neerkomt dat hij beveiligde memory wil lezen), uiteraard omdat de grootte van de arrays nu niet bekend zijn en het mis gaat bij het overkopieren van de pointer. Ik weet geen andere manier om de lengte van de arrays aan te geven (is die er?).
Verder heb ik hier nog een probleem mee, mocht ik hiermee verder gaan. Hoe kan ik de waarden uit de arrays nu uitlezen? Ik ging er eigenlijk stiekem vanuit dat ik gewoon normale int[] en float[] arrays terug kreeg, maar helaas... ik krijg natuurlijk pointers terug. Daar heb ik dus geen kaas van gegeten, en ik moet dus de waarde van die pointer gaan opvragen - en daar heb ik dus weer unsafe code voor nodig.... Dat wil ik helemaal niet!
Kan ik hier op een of andere manier omheen of kan ik er niet onderuit om unsafe code te gaan gebruiken?