diff --git a/src/common/filesystem/include/fs_files.h b/src/common/filesystem/include/fs_files.h
index 8ad55953ff..7f9eff9e9c 100644
--- a/src/common/filesystem/include/fs_files.h
+++ b/src/common/filesystem/include/fs_files.h
@@ -40,6 +40,7 @@
 #include <stdio.h>
 #include <stdint.h>
 #include <stdarg.h>
+#include <string.h>
 #include <functional>
 #include <vector>
 #include "fs_swap.h"
@@ -82,11 +83,20 @@ class FileData
 public:
 	using value_type = uint8_t;
 	FileData() { memory = nullptr; length = 0; owned = true; }
-	FileData(const void* memory_, size_t len)
+	FileData(const void* memory_, size_t len, bool own = true)
 	{
 		length = len;
-		memory = allocate(len);
-		if (memory_) memcpy(memory, memory_, len);
+		if (own)
+		{
+			length = len;
+			memory = allocate(len);
+			if (memory_) memcpy(memory, memory_, len);
+		}
+		else
+		{
+			memory = (void*)memory_;
+			owned = false;
+		}
 	}
 	uint8_t* writable() const { return owned? (uint8_t*)memory : nullptr; }
 	const void* data() const { return memory; }
diff --git a/src/common/filesystem/include/resourcefile.h b/src/common/filesystem/include/resourcefile.h
index ea7940b251..20b48e0b50 100644
--- a/src/common/filesystem/include/resourcefile.h
+++ b/src/common/filesystem/include/resourcefile.h
@@ -190,11 +190,7 @@ public:
 		return (entry < NumLumps) ? Entries[entry].FileName : nullptr;
 	}
 
-	virtual FileData Read(int entry)
-	{
-		auto fr = GetEntryReader(entry, READER_SHARED, 0);
-		return fr.Read(entry < NumLumps ? Entries[entry].Length : 0);
-	}
+	virtual FileData Read(int entry);
 
 	virtual FCompressedBuffer GetRawData(uint32_t entry);
 
diff --git a/src/common/filesystem/source/resourcefile.cpp b/src/common/filesystem/source/resourcefile.cpp
index ab4d83ba9c..6b284cc284 100644
--- a/src/common/filesystem/source/resourcefile.cpp
+++ b/src/common/filesystem/source/resourcefile.cpp
@@ -709,6 +709,21 @@ FileReader FResourceFile::GetEntryReader(uint32_t entry, int readertype, int rea
 	return fr;
 }
 
+FileData FResourceFile::Read(int entry)
+{
+	if (!(Entries[entry].Flags & RESFF_COMPRESSED))
+	{
+		auto buf = Reader.GetBuffer();
+		// if this is backed by a memory buffer, we can just return a reference to the backing store.
+		if (buf != nullptr)
+		{
+			return FileData(buf + Entries[entry].Position, Entries[entry].Length, false);
+		}
+	}
+
+	auto fr = GetEntryReader(entry, READER_SHARED, 0);
+	return fr.Read(entry < NumLumps ? Entries[entry].Length : 0);
+}