aboutsummaryrefslogtreecommitdiff
path: root/devtools/create_neverhood/create_neverhood.cpp
diff options
context:
space:
mode:
authorjohndoe1232013-06-10 12:01:37 +0200
committerjohndoe1232013-06-10 12:01:37 +0200
commit36a88d2f7229bc6c92b5d7df0eed56dabc911f7e (patch)
tree297a13b1fdb1e899e5d4b77cdf258aabd14a30aa /devtools/create_neverhood/create_neverhood.cpp
parent0d3902b345f25c71f6be81914bdb045bc8eec7f7 (diff)
downloadscummvm-rg350-36a88d2f7229bc6c92b5d7df0eed56dabc911f7e.tar.gz
scummvm-rg350-36a88d2f7229bc6c92b5d7df0eed56dabc911f7e.tar.bz2
scummvm-rg350-36a88d2f7229bc6c92b5d7df0eed56dabc911f7e.zip
NEVERHOOD: Check that the supplied nhc.exe is the correct one
Diffstat (limited to 'devtools/create_neverhood/create_neverhood.cpp')
-rw-r--r--devtools/create_neverhood/create_neverhood.cpp37
1 files changed, 33 insertions, 4 deletions
diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp
index 323066d8b1..f34f20882c 100644
--- a/devtools/create_neverhood/create_neverhood.cpp
+++ b/devtools/create_neverhood/create_neverhood.cpp
@@ -32,10 +32,16 @@
#include <vector>
#include "create_neverhood.h"
+#include "md5.h"
#include "tables.h"
const int DAT_VERSION = 0;
+// The MD5 hash of the nhc.exe used to extract the tables from
+const uint8 kNhcExeMd5[16] = {
+ 0x37, 0xD6, 0x54, 0xA2, 0xA7, 0xBB, 0xB0, 0x1F,
+ 0x8C, 0x41, 0x9A, 0xB8, 0x49, 0xFF, 0x29, 0xD4};
+
uint32 dataSize;
byte *data;
uint32 dataStart = 0x004AE000;
@@ -48,12 +54,33 @@ class NavigationList;
void addMessageList(uint32 messageListCount, uint32 messageListOffset);
-void loadExe(const char *filename) {
+bool loadExe(const char *filename) {
FILE *exe = fopen(filename, "rb");
+ if (!exe) {
+ printf("Could not open nhc.exe for reading! Quitting...\n");
+ return false;
+ }
dataSize = fileSize(exe);
data = new byte[dataSize];
fread(data, dataSize, 1, exe);
fclose(exe);
+ return true;
+}
+
+bool validateMd5() {
+ uint8 digest[16];
+
+ md5_buffer(data, dataSize, digest);
+
+ printf("MD5 of nhc.exe is %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
+ digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7],
+ digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15]);
+
+ if (memcmp(kNhcExeMd5, digest, 16)) {
+ printf("MD5 hash of nhc.exe doesn't match the expected value! Quitting...\n");
+ return false;
+ }
+ return true;
}
byte *getData(uint32 offset) {
@@ -506,9 +533,11 @@ void addMessageList(uint32 messageListCount, uint32 messageListOffset) {
int main(int argc, char *argv[]) {
- FILE *datFile;
+ if (!loadExe("nhc.exe") ||
+ !validateMd5())
+ return 1;
- loadExe("nhc.exe");
+ FILE *datFile;
hitRectLists.loadListVector(hitRectListOffsets);
rectLists.loadListVector(rectListOffsets);
@@ -516,7 +545,7 @@ int main(int argc, char *argv[]) {
navigationLists.loadListVector(navigationListOffsets);
sceneInfo140Items.loadVector(sceneInfo140Offsets);
sceneInfo2700Items.loadVector(sceneInfo2700Offsets);
-
+
datFile = fopen("neverhood.dat", "wb");
writeUint32LE(datFile, 0x11223344); // Some magic