public void SafeReadWriteRaw(Reloaded.Memory.Sources.IMemory memorySource) { // Prepare int arrayElements = 13432; IMemoryTools.SwapExternalMemorySource(ref memorySource, _helloWorldProcess); IntPtr pointer = memorySource.Allocate(arrayElements); /* Start Test */ // Generate random int struct to read/write to. var randomByteArray = RandomByteArray.GenerateRandomByteArray(arrayElements); // Run the change permission function to deny read/write access. try { memorySource.ChangePermission(pointer, arrayElements, Kernel32.Kernel32.MEM_PROTECTION.PAGE_NOACCESS); } catch (NotImplementedException) { return; } // ChangePermission is optional to implement // Throws corrupted state exception if operations fail until restore. memorySource.SafeWriteRaw(pointer, randomByteArray.Array); memorySource.SafeReadRaw(pointer, out byte[] randomByteArrayCopy, randomByteArray.Array.Length); // Restore or NETCore execution engine will complain. try { memorySource.ChangePermission(pointer, arrayElements, Kernel32.Kernel32.MEM_PROTECTION.PAGE_EXECUTE_READWRITE); } catch (NotImplementedException) { return; } // ChangePermission is optional to implement // Compare before exiting test. Assert.Equal(randomByteArray.Array, randomByteArrayCopy); // Cleanup memorySource.Free(pointer); }
/// <summary> /// Tests the "Add" functionality of the <see cref="MemoryBuffer"/>, with raw data; /// including the return of the correct pointer and CanItemFit. /// </summary> private unsafe void MemoryBufferAddByteArray(MemoryBuffer buffer, Process process) { // Setup test. ExternalMemory externalMemory = new ExternalMemory(process); // Disable item alignment. var bufferHeader = buffer.Properties; buffer.Properties = bufferHeader; // Get remaining space, items to place. int remainingBufferSpace = bufferHeader.Remaining; var randomByteArray = RandomByteArray.GenerateRandomByteArray(remainingBufferSpace); byte[] rawArray = randomByteArray.Array; // Fill the buffer with the whole array. buffer.Add(rawArray, 1); // Compare against the array written. IntPtr bufferStartPtr = bufferHeader.DataPointer; for (int x = 0; x < remainingBufferSpace; x++) { IntPtr readAddress = bufferStartPtr + x; // Read back and compare. externalMemory.Read(readAddress, out byte actual); Assert.Equal(rawArray[x], actual); } // The array is full, calling CanItemFit should return false. Assert.False(buffer.CanItemFit(sizeof(byte))); // Likewise, calling Add should return IntPtr.Zero. byte testByte = 55; Assert.Equal(IntPtr.Zero, buffer.Add(ref testByte, false, 1)); }
public void ReadWriteRawData(Reloaded.Memory.Sources.IMemory memorySource) { // Prepare int allocationSize = 0x100; IMemoryTools.SwapExternalMemorySource(ref memorySource, _helloWorldProcess); IntPtr pointer = memorySource.Allocate(allocationSize); /* Start Test */ // Random integer read/write. for (int x = 0; x < 100; x++) { RandomByteArray randomArray = RandomByteArray.GenerateRandomByteArray(allocationSize); memorySource.WriteRaw(pointer, randomArray.Array); memorySource.ReadRaw(pointer, out byte[] randomValueCopy, randomArray.Array.Length); Assert.Equal(randomArray.Array, randomValueCopy); } /* End Test */ // Cleanup memorySource.Free(pointer); }