/// <summary> /// Записать текст в память /// </summary> /// <param name="Address">Адрес записи</param> /// <param name="Text">Текст который будет записан в память</param> public static bool WriteString(ulong Address, string Text) { if (Address > ProtectedLowAddressZone) { fixed(char *ptr = Text) //Фиксируем текст и записываем куда надо return(InternalMagic.ReadWriteBytes(Address, (void *)(ptr), (uint)Text.Length, false)); } return(false); }
/// <summary> /// Записать число в память /// В среднем занимает 1,250326 тика для uint /// </summary> /// <typeparam name="T">Число</typeparam> /// <param name="Address">Адрес записи</param> /// <param name="Value">Записываемое число</param> public static bool Write <T>(ulong Address, T Value) { if (Address > ProtectedLowAddressZone) { TypedReference tRef = __makeref(Value); //Грязные хаками получаем адрес 'T Value' return(InternalMagic.ReadWriteBytes(Address, (void *)*(UInt64 *)(&tRef), (uint)Marshal.SizeOf(typeof(T)), false)); } return(false); }
/// <summary> /// Записать массив байт /// </summary> /// <param name="Address">Адрес записи</param> /// <param name="Bytes">Массив байт который буем записывать</param> public static bool WriteBytes(ulong Address, byte[] Bytes) { if ((Address > ProtectedLowAddressZone) || (Bytes != null)) { fixed(byte *ptr = Bytes) //Фиксируем массив, и драйвер все сам прочитает return(InternalMagic.ReadWriteBytes(Address, ptr, (uint)Bytes.Length, false)); } return(false); }
/// <summary> /// Прочитать в уже инициализированный массив байт /// </summary> /// <param name="Address">Адрес чтения</param> /// <param name="Bytes">Инициализированный массив байт</param> public static bool ReadBytes(ulong Address, ref byte[] Bytes) { if ((Address > ProtectedLowAddressZone) || (Bytes != null)) { fixed(byte *ptr = Bytes) //Фиксируем массив, и после драйвер все пихнет в него сам return(InternalMagic.ReadWriteBytes(Address, ptr, (uint)Bytes.Length, true)); } return(false); }
/// <summary> /// Записать число в память /// Самый молниеносный способ! /// В среднем занимает 1,079411 тика для uint /// </summary> /// <param name="Address">Адрес записи</param> /// <param name="ValueAddress">Адрес записываемого числа</param> /// <param name="ValueSize">Размер записываемого числа</param> public static bool Write(ulong Address, void *ValueAddress, uint ValueSize) { if (Address > ProtectedLowAddressZone) { return(InternalMagic.ReadWriteBytes(Address, ValueAddress, ValueSize, false)); } else { return(false); } }
//Прочитать строку по нужному адрессу и в нужной кодировке с ограничением по длине private static string ReadStringInternal(Encoding Encoding, ulong Address, ushort MaxLenght) { byte[] Array = new byte[MaxLenght]; fixed(byte *ptr = Array) { if (InternalMagic.ReadWriteBytes(Address, ptr, (uint)Array.Length, true)) { //Сквозь массив ищем null терминатор строки for (int i = 0; i < MaxLenght; i++) { if (*(ptr + i) == '\0') //Ищем null терминатор { return(Encoding.GetString(Array, 0, i)); } } //Окей, мы не нашли конец строке, вернем все! return(Encoding.GetString(Array)); } return(""); //Ошибка! } }