summaryrefslogtreecommitdiffstats
path: root/private/os2/client/thunk/ldrtabs/nedump.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/os2/client/thunk/ldrtabs/nedump.c228
1 files changed, 228 insertions, 0 deletions
diff --git a/private/os2/client/thunk/ldrtabs/nedump.c b/private/os2/client/thunk/ldrtabs/nedump.c
new file mode 100644
index 000000000..6175ac118
--- /dev/null
+++ b/private/os2/client/thunk/ldrtabs/nedump.c
@@ -0,0 +1,228 @@
+#include <stdio.h>
+#include <ctype.h>
+#include "newexe.h"
+
+main(argc, argv)
+int argc;
+char *argv[];
+{
+FILE *fp;
+FILE *fp2;
+unsigned char buffer[512];
+unsigned char tables[1024];
+unsigned long lfanew;
+unsigned short enttabsize;
+unsigned short restabsize;
+unsigned short nrestabsize;
+struct exe_hdr *pmz;
+struct new_exe *pne;
+char enttab[] = " ent";
+char restab[] = " res";
+char nrestab[] = " nres";
+char *arg;
+long i;
+
+ //
+ // The command usage is nedump <dll name>
+ //
+ if (argc != 2) {
+ printf("Usage: nedump file\n");
+ return 1;
+ }
+
+ if ((fp = fopen(argv[1], "rb")) == NULL) {
+ printf("nedump: can't open %s\n", argv[1]);
+ return 1;
+ }
+
+ fread(buffer, 1, 512, fp);
+
+ if (ferror(fp)) {
+ printf("nedump: read of file failed\n");
+ return 1;
+ }
+
+ pmz = (struct exe_hdr *) buffer;
+
+ //
+ // Check for MZ
+ //
+ if (pmz->e_magic != EMAGIC) {
+ printf("nedump: ERROR_INVALID_EXE_SIGNATURE\n");
+ return 1;
+ }
+
+ if ((lfanew = pmz->e_lfanew) > 512) {
+ printf("nedump: ERROR_BOUND_APP\n");
+ return 1;
+ }
+
+ if (fseek(fp, lfanew, SEEK_SET)) {
+ printf("nedump: ERROR_SEEK_FAILED\n");
+ return 1;
+ }
+
+ fread(buffer, 1, 512, fp);
+
+ if (ferror(fp)) {
+ printf("nedump: read of file failed\n");
+ return 1;
+ }
+
+ pne = (struct new_exe *) buffer;
+
+ //
+ // Check for NE
+ //
+ if (pne->ne_magic != NEMAGIC) {
+ printf("nedump: ERROR_INVALID_EXE_SIGNATURE\n");
+ }
+
+ //
+ // Compute size of entry table
+ //
+ if ((enttabsize = pne->ne_nrestab - lfanew - pne->ne_enttab) > 1024) {
+ printf("nedump: Entry table bigger than 1024 bytes\n");
+ return 1;
+ }
+
+ if (fseek(fp, lfanew + pne->ne_enttab, SEEK_SET)) {
+ printf("nedump: ERROR_SEEK_FAILED\n");
+ return 1;
+ }
+
+ //
+ // Create output file names
+ //
+ arg = argv[1];
+ enttab[0] = restab[0] = nrestab[0] = *arg++;
+ enttab[1] = restab[1] = nrestab[1] = *arg++;
+ enttab[2] = restab[2] = nrestab[2] = *arg++;
+
+ //
+ // Read entry table
+ //
+ fread(tables, 1, 1024, fp);
+
+ if (ferror(fp)) {
+ printf("nedump: read of file failed\n");
+ return 1;
+ }
+
+
+ //
+ // Create Entry table
+ //
+ if ((fp2 = fopen(enttab, "w")) == NULL) {
+ printf("nedump: can't open %s\n", enttab);
+ return 1;
+ }
+
+ fprintf(fp2, "UCHAR %stab[]= \n", enttab);
+ fprintf(fp2, "{\n");
+ for (i=0; i<enttabsize; i++) {
+ fprintf(fp2, "0x%x", tables[i]);
+ if (i != enttabsize - 1) {
+ fprintf(fp2, ",");
+ }
+ else {
+ fprintf(fp2, "\n");
+ }
+ if (i != 0 && i % 17 == 0) {
+ fprintf(fp2, "\n");
+ }
+ }
+
+ fprintf(fp2, "};\n");
+
+ fclose(fp2);
+
+ //
+ // Compute resident name table size
+ //
+ if ((restabsize = pne->ne_modtab - pne->ne_restab) > 1024) {
+ printf("nedump: Resident name table bigger than 1024 bytes\n");
+ return 1;
+ }
+
+ if (fseek(fp, lfanew + pne->ne_restab, SEEK_SET)) {
+ printf("nedump: ERROR_SEEK_FAILED\n");
+ return 1;
+ }
+
+ fread(tables, 1, 1024, fp);
+
+ if (ferror(fp)) {
+ printf("nedump: read of file failed\n");
+ return 1;
+ }
+ if ((fp2 = fopen(restab, "w")) == NULL) {
+ printf("nedump: can't open %s\n", restab);
+ return 1;
+ }
+
+ fprintf(fp2, "UCHAR %stab[]= \n", restab);
+ fprintf(fp2, "{\n");
+
+ for (i=0; i<restabsize; i++) {
+ fprintf(fp2, "0x%x", tables[i]);
+ if (i != restabsize - 1) {
+ fprintf(fp2, ",");
+ }
+ else {
+ fprintf(fp2, "\n");
+ }
+ if (i != 0 && i % 15 == 0) {
+ fprintf(fp2, "\n");
+ }
+ }
+
+ fprintf(fp2, "};\n");
+
+ fclose(fp2);
+
+ //
+ // Compute nonresident name table
+ //
+ if ((nrestabsize = pne->ne_cbnrestab) > 1024) {
+ printf("nedump: NonResident name table bigger than 1024 bytes\n");
+ return 1;
+ }
+
+ if (fseek(fp, pne->ne_nrestab, SEEK_SET)) {
+ printf("nedump: ERROR_SEEK_FAILED\n");
+ return 1;
+ }
+
+ fread(tables, 1, 1024, fp);
+
+ if (ferror(fp)) {
+ printf("nedump: read of file failed\n");
+ return 1;
+ }
+ if ((fp2 = fopen(nrestab, "w")) == NULL) {
+ printf("nedump: can't open %s\n", restab);
+ return 1;
+ }
+
+ fprintf(fp2, "UCHAR %stab[]= \n", nrestab);
+ fprintf(fp2, "{\n");
+
+ for (i=0; i<nrestabsize; i++) {
+ fprintf(fp2, "0x%x", tables[i]);
+ if (i != nrestabsize - 1) {
+ fprintf(fp2, ",");
+ }
+ else {
+ fprintf(fp2, "\n");
+ }
+ if (i != 0 && i % 15 == 0) {
+ fprintf(fp2, "\n");
+ }
+ }
+
+ fprintf(fp2, "};\n");
+
+ printf("nedump completed\n");
+ return 0;
+}