diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/program/model/mem/WrappedMemoryBufferTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/program/model/mem/WrappedMemoryBufferTest.java index 755d651573..f470064f9b 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/program/model/mem/WrappedMemoryBufferTest.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/program/model/mem/WrappedMemoryBufferTest.java @@ -80,81 +80,228 @@ public class WrappedMemoryBufferTest extends AbstractGhidraHeadedIntegrationTest Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 0, 0, 0, 0 }, bytes); } - + @Test public void testGetBytesBuffered() throws Exception { loadProgram("notepad"); Address minAddr = program.getMinAddress(); Address maxAddr = program.getMaxAddress(); - setBytes(minAddr, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }); + setBytes(minAddr, + new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }); memBuf = new MemoryBufferImpl(program.getMemory(), minAddr); memBuf = new WrappedMemBuffer(memBuf, 4, 0); byte[] bytes = new byte[6]; // test get too many for cache assertEquals(6, memBuf.getBytes(bytes, 2)); - Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 2, 3, 4, 5, 6, 7 }, - bytes); + Assert.assertArrayEquals("Unexpected bytes read from memBuf", + new byte[] { 2, 3, 4, 5, 6, 7 }, bytes); // test not in buffer memBuf = new WrappedMemBuffer(memBuf, 6, 0); assertEquals(6, memBuf.getBytes(bytes, 0)); - Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 0, 1, 2, 3, 4, 5 }, - bytes); + Assert.assertArrayEquals("Unexpected bytes read from memBuf", + new byte[] { 0, 1, 2, 3, 4, 5 }, bytes); assertEquals(6, memBuf.getBytes(bytes, 2)); - Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 2, 3, 4, 5, 6, 7 }, - bytes); + Assert.assertArrayEquals("Unexpected bytes read from memBuf", + new byte[] { 2, 3, 4, 5, 6, 7 }, bytes); assertEquals(6, memBuf.getBytes(bytes, 8)); - Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 8, 9, 10, 11, 12, 13 }, - bytes); + Assert.assertArrayEquals("Unexpected bytes read from memBuf", + new byte[] { 8, 9, 10, 11, 12, 13 }, bytes); assertEquals(6, memBuf.getBytes(bytes, 1)); - Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 1, 2, 3, 4, 5, 6 }, - bytes); - + Assert.assertArrayEquals("Unexpected bytes read from memBuf", + new byte[] { 1, 2, 3, 4, 5, 6 }, bytes); + assertEquals(10, memBuf.getByte(10)); assertEquals(0, memBuf.getByte(0)); assertEquals(5, memBuf.getByte(5)); assertEquals(6, memBuf.getByte(6)); } - + @Test public void testGetBytesNoBuffered() throws Exception { loadProgram("notepad"); Address minAddr = program.getMinAddress(); Address maxAddr = program.getMaxAddress(); - setBytes(minAddr, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }); + setBytes(minAddr, + new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }); memBuf = new MemoryBufferImpl(program.getMemory(), minAddr); memBuf = new WrappedMemBuffer(memBuf, 0, 0); byte[] bytes = new byte[6]; // test get too many for cache assertEquals(6, memBuf.getBytes(bytes, 2)); - Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 2, 3, 4, 5, 6, 7 }, - bytes); + Assert.assertArrayEquals("Unexpected bytes read from memBuf", + new byte[] { 2, 3, 4, 5, 6, 7 }, bytes); // test not in buffer memBuf = new WrappedMemBuffer(memBuf, 0, 0); assertEquals(6, memBuf.getBytes(bytes, 0)); - Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 0, 1, 2, 3, 4, 5 }, - bytes); + Assert.assertArrayEquals("Unexpected bytes read from memBuf", + new byte[] { 0, 1, 2, 3, 4, 5 }, bytes); assertEquals(6, memBuf.getBytes(bytes, 2)); - Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 2, 3, 4, 5, 6, 7 }, - bytes); + Assert.assertArrayEquals("Unexpected bytes read from memBuf", + new byte[] { 2, 3, 4, 5, 6, 7 }, bytes); assertEquals(6, memBuf.getBytes(bytes, 8)); - Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 8, 9, 10, 11, 12, 13 }, - bytes); + Assert.assertArrayEquals("Unexpected bytes read from memBuf", + new byte[] { 8, 9, 10, 11, 12, 13 }, bytes); assertEquals(6, memBuf.getBytes(bytes, 1)); - Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 1, 2, 3, 4, 5, 6 }, - bytes); - + Assert.assertArrayEquals("Unexpected bytes read from memBuf", + new byte[] { 1, 2, 3, 4, 5, 6 }, bytes); + assertEquals(10, memBuf.getByte(10)); assertEquals(0, memBuf.getByte(0)); assertEquals(5, memBuf.getByte(5)); assertEquals(6, memBuf.getByte(6)); } + @Test + public void testGetIntBuffered() throws Exception { + loadProgram("notepad"); + int value; + + Address minAddr = program.getMinAddress(); + Address maxAddr = program.getMaxAddress(); + setBytes(minAddr, new byte[] { 0, 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, 26, 27, 28, 29, 30, 31, 32 }); + + memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr); + memBuf = new WrappedMemBuffer(memBuf, 3, 0); + + value = memBuf.getInt(0); + assertEquals(value, 0x00010203); + value = memBuf.getInt(1); + assertEquals(value, 0x01020304); + value = memBuf.getInt(3); + assertEquals(value, 0x03040506); + value = memBuf.getInt(8); + assertEquals(value, 0x08090A0B); + + memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr); + memBuf = new WrappedMemBuffer(memBuf, 4, 0); + value = memBuf.getInt(0); + assertEquals(value, 0x00010203); + value = memBuf.getInt(1); + assertEquals(value, 0x01020304); + value = memBuf.getInt(3); + assertEquals(value, 0x03040506); + value = memBuf.getInt(8); + assertEquals(value, 0x08090A0B); + + memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr); + memBuf = new WrappedMemBuffer(memBuf, 5, 0); + value = memBuf.getInt(0); + assertEquals(value, 0x00010203); + value = memBuf.getInt(1); + assertEquals(value, 0x01020304); + value = memBuf.getInt(3); + assertEquals(value, 0x03040506); + value = memBuf.getInt(8); + assertEquals(value, 0x08090A0B); + + memBuf = new MemoryBufferImpl(program.getMemory(), minAddr); + memBuf = new WrappedMemBuffer(memBuf, 3, 4); + value = memBuf.getInt(0); + assertEquals(value, 0x04050607); + value = memBuf.getInt(1); + assertEquals(value, 0x05060708); + value = memBuf.getInt(3); + assertEquals(value, 0x0708090A); + value = memBuf.getInt(8); + assertEquals(value, 0x0C0D0E0F); + + memBuf = new MemoryBufferImpl(program.getMemory(), minAddr); + memBuf = new WrappedMemBuffer(memBuf, 4, 4); + value = memBuf.getInt(0); + assertEquals(value, 0x04050607); + value = memBuf.getInt(1); + assertEquals(value, 0x05060708); + value = memBuf.getInt(3); + assertEquals(value, 0x0708090A); + value = memBuf.getInt(8); + assertEquals(value, 0x0C0D0E0F); + + memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr); + memBuf = new WrappedMemBuffer(memBuf, 5, 4); + value = memBuf.getInt(0); + assertEquals(value, 0x04050607); + value = memBuf.getInt(1); + assertEquals(value, 0x05060708); + value = memBuf.getInt(3); + assertEquals(value, 0x0708090A); + value = memBuf.getInt(8); + assertEquals(value, 0x0C0D0E0F); + } + + @Test + public void testGetShortBuffered() throws Exception { + loadProgram("notepad"); + int value; + + Address minAddr = program.getMinAddress(); + Address maxAddr = program.getMaxAddress(); + setBytes(minAddr, new byte[] { 0, 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, 26, 27, 28, 29, 30, 31, 32 }); + + memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr); + memBuf = new WrappedMemBuffer(memBuf, 3, 0); + + value = memBuf.getShort(0); + assertEquals(value, 0x0001); + value = memBuf.getShort(1); + assertEquals(value, 0x0102); + value = memBuf.getShort(3); + assertEquals(value, 0x0304); + value = memBuf.getShort(8); + assertEquals(value, 0x0809); + + memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr); + memBuf = new WrappedMemBuffer(memBuf, 5, 4); + value = memBuf.getShort(0); + assertEquals(value, 0x0405); + value = memBuf.getShort(1); + assertEquals(value, 0x0506); + value = memBuf.getShort(3); + assertEquals(value, 0x0708); + value = memBuf.getShort(8); + assertEquals(value, 0x0C0D); + } + + @Test + public void testGetLongBuffered() throws Exception { + loadProgram("notepad"); + long value; + + Address minAddr = program.getMinAddress(); + Address maxAddr = program.getMaxAddress(); + setBytes(minAddr, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }); + + memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr); + memBuf = new WrappedMemBuffer(memBuf, 7, 0); + + value = memBuf.getLong(0); + assertEquals(value, 0x0001020304050607L); + value = memBuf.getLong(1); + assertEquals(value, 0x0102030405060708L); + value = memBuf.getLong(3); + assertEquals(value, 0x030405060708090AL); + value = memBuf.getLong(8); + assertEquals(value, 0x08090A0B0C0D0E0FL); + + memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr); + memBuf = new WrappedMemBuffer(memBuf, 9, 4); + value = memBuf.getLong(0); + assertEquals(value, 0x0405060708090A0BL); + value = memBuf.getLong(1); + assertEquals(value, 0x05060708090A0B0CL); + value = memBuf.getLong(3); + assertEquals(value, 0x0708090A0B0C0D0EL); + value = memBuf.getLong(0); + assertEquals(value, 0x0405060708090A0BL); + } + private void setBytes(Address addr, byte[] bytes) throws MemoryAccessException { Memory mem = program.getMemory(); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/mem/WrappedMemBuffer.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/mem/WrappedMemBuffer.java index 96f10cd967..4837a6e87e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/mem/WrappedMemBuffer.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/mem/WrappedMemBuffer.java @@ -67,7 +67,7 @@ public class WrappedMemBuffer implements MemBuffer { /** * Construct a wrapped MemBuffer with an adjustable base offset * @param buf memory buffer - * @buffersize size of cache buffer - specify 0 for no buffering + * @param bufferSize size of cache buffer - specify 0 for no buffering * @param baseOffset offset relative to the underlying buffer's start address * (addr + baseOffset) will be the 0 index into this buffer * @throws AddressOutOfBoundsException @@ -78,7 +78,7 @@ public class WrappedMemBuffer implements MemBuffer { this.converter = GhidraDataConverter.getInstance(buf.isBigEndian()); buffer = new byte[bufferSize]; - + setBaseOffset(baseOffset); } @@ -113,10 +113,12 @@ public class WrappedMemBuffer implements MemBuffer { private int computeOffset(int offset) throws MemoryAccessException { int bufOffset = baseOffset + offset; if (offset > 0 && bufOffset < baseOffset) { - throw new MemoryAccessException("Invalid WrappedMemBuffer, offset would wrap underlying memory buffer"); + throw new MemoryAccessException( + "Invalid WrappedMemBuffer, offset would wrap underlying memory buffer"); } if (offset < 0 && bufOffset > baseOffset) { - throw new MemoryAccessException("Invalid WrappedMemBuffer offset, offset would wrap underlying memory buffer"); + throw new MemoryAccessException( + "Invalid WrappedMemBuffer offset, offset would wrap underlying memory buffer"); } return bufOffset; } @@ -156,8 +158,9 @@ public class WrappedMemBuffer implements MemBuffer { // grab from wrapped buffer, too many bytes, or no buffer return memBuffer.getBytes(b, computeOffset(offset)); - - } catch (MemoryAccessException e) { + + } + catch (MemoryAccessException e) { return 0; } } @@ -165,11 +168,11 @@ public class WrappedMemBuffer implements MemBuffer { private void fillBuffer(int offset) throws MemoryAccessException { // fill the buffer int nRead = memBuffer.getBytes(buffer, computeOffset(offset)); - + if (nRead == 0) { throw new MemoryAccessException("No bytes available in memory to cache"); } - + minOffset = offset; maxOffset = offset + nRead - 1; } @@ -186,22 +189,22 @@ public class WrappedMemBuffer implements MemBuffer { @Override public short getShort(int offset) throws MemoryAccessException { - return converter.getShort(this, computeOffset(offset)); + return converter.getShort(this, offset); } @Override public int getInt(int offset) throws MemoryAccessException { - return converter.getInt(this, computeOffset(offset)); + return converter.getInt(this, offset); } @Override public long getLong(int offset) throws MemoryAccessException { - return converter.getLong(this, computeOffset(offset)); + return converter.getLong(this, offset); } @Override public BigInteger getBigInteger(int offset, int size, boolean signed) throws MemoryAccessException { - return converter.getBigInteger(this, computeOffset(offset), size, signed); + return converter.getBigInteger(this, offset, size, signed); } }