source: trunk/tools/omfdumper/omfdumper.c@ 10367

Last change on this file since 10367 was 4042, checked in by bird, 25 years ago

More info on unknown records.

File size: 8.1 KB
Line 
1/* $Id: omfdumper.c,v 1.2 2000-08-19 01:03:45 bird Exp $ */
2/*
3 * Very simple OMF/LIB dumper.
4 *
5 * Copyright (c) 1999 knut st. osmundsen
6 *
7 */
8
9
10/*@Header***********************************************************************
11* Header Files *
12*******************************************************************************/
13#include <stdio.h>
14#include <string.h>
15#include <malloc.h>
16
17
18#include "omf.h"
19
20
21/*@IntFunc**********************************************************************
22* Internal Functions *
23*******************************************************************************/
24int processFile(const char *pszFilename);
25void *processRecord(void *pvRecord, void *pvBase, FILE *phDef);
26
27
28
29int main(int argc, char **argv)
30{
31 int rc = 0;
32 int argi = 1;
33
34 while (argi < argc)
35 {
36 processFile(argv[argi]);
37
38 /* next */
39 argi++;
40 }
41
42
43 return rc;
44}
45
46
47
48
49int processFile(const char *pszFilename)
50{
51 FILE *phFile;
52 FILE *phDef;
53 char szDefName[260];
54 char *psz;
55 int rc = 0;
56
57 strcpy(szDefName, pszFilename);
58 psz = strrchr(szDefName, '.');
59 if (psz != NULL)
60 *psz = '\0';
61 strcat(szDefName, ".def");
62
63 phFile = fopen(pszFilename, "rb");
64 phDef = fopen(szDefName, "w");
65 if (phFile != NULL && phDef != NULL)
66 {
67 int cbFile;
68
69 /* get size of file */
70 if (!fseek(phFile, 0, SEEK_END)
71 && (cbFile = ftell(phFile) ) != -1
72 && !fseek(phFile, 0, SEEK_SET)
73 )
74 {
75 void *pvFile;
76
77 /* allocater memory */
78 pvFile = malloc(cbFile);
79 if (pvFile != NULL)
80 {
81 /* read the whole file */
82 if (fread(pvFile, cbFile, 1, phFile) == 1)
83 {
84 void *pvNew = pvFile;
85
86 /* main loop */
87 while (pvNew < (void*)(cbFile + (int)pvFile))
88 pvNew = processRecord(pvNew, pvFile, phDef);
89 }
90 else
91 rc = 4;
92 }
93 else
94 rc = 3;
95 }
96 else
97 rc = 2;
98 fclose(phFile);
99 fclose(phDef);
100 }
101 else
102 rc = 1;
103
104 return rc;
105}
106
107
108
109void *processRecord(void *pvRecord, void *pvBase, FILE *phDef)
110{
111 void *pvRet = pvRecord;
112 int cbRecord;
113 int i;
114
115 switch (*(unsigned char*)pvRecord)
116 {
117 case LIBHDR:
118 printf("LIBHDR: len=%d;", *((unsigned short*)((int)pvRecord+1)));
119 printf(" offDict=0x%04x;", *((unsigned long*)((int)pvRecord+3)));
120 printf(" cbDict=%d;", *((unsigned short*)((int)pvRecord+7)));
121 printf(" flag=0x%0x(%s)", *((unsigned char*)((int)pvRecord+9)), *((unsigned char*)((int)pvRecord+9)) == 1 ? "insens" : "sens");
122 printf("\n");
123 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3;
124 break;
125
126 case THEADR:
127 printf("THEADR: len=%d;", *((unsigned short*)((int)pvRecord+1)));
128 printf(" name=%*s\n", *((unsigned char*)((int)pvRecord+3)), (char*)((int)pvRecord+4));
129 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3;
130 break;
131
132 case MODEND:
133 case MODEND2:
134 {
135 unsigned long ul = (unsigned long)pvRecord - (unsigned long)pvBase;
136
137 printf("MODEND: \n");
138 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3;
139 /* it seems to be somthing funny here! - lets try aligning it to on a 16 bytes boundrary... */
140 /* PS. I know this I have a wrong approch to the lib files, not using the directory... */
141 ul += cbRecord;
142 if ((ul % 16) > 0 && *((unsigned char*)((int)pvRecord+cbRecord)) == 0x00)
143 cbRecord += 16 - (ul % 16);
144 else
145 ul = 0;
146 } break;
147
148 case COMENT:
149 printf("COMENT: len=%d;", *((unsigned short*)((int)pvRecord+1)));
150 printf(" type: 0x%02x; ", *((unsigned char*)((int)pvRecord+3)));
151 printf(" class: 0x%02x; ", *((unsigned char*)((int)pvRecord+4)));
152 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3;
153
154 /* class switch */
155 switch (*((unsigned char*)((int)pvRecord+4)))
156 {
157 case 0xA0:
158 printf(" subtype: 0x%02x;", *((unsigned char*)((int)pvRecord+5)));
159 /* sub type switch */
160 switch (*((unsigned char*)((int)pvRecord+5)))
161 {
162 case IMPDEF:
163 {
164 #if 1
165 int fOrd = *((unsigned char*)((int)pvRecord + 6));
166 unsigned char cchIntName = *((unsigned char*)((int)pvRecord + 7));
167 char *pachIntName = (char*)((int)pvRecord + 8);
168 unsigned char cchDllName = *((unsigned char*)((int)pvRecord + 8 + cchIntName));
169 char *pachDllName = (char*)((int)pvRecord + 9 + cchIntName);
170 unsigned char cchExtName = *((unsigned char*)((int)pvRecord + 9 + cchIntName + cchDllName));
171 char *pachExtName = (char*)((int)pvRecord +10 + cchIntName + cchDllName);
172 unsigned short usOrdinal = *((unsigned short*)((int)pvRecord + 9 + cchIntName + cchDllName));
173
174 printf("\n\tIMPDEF: fOrd=%d; intName=%.*s; dllName=%.*s; ",
175 fOrd, cchIntName, pachIntName, cchDllName, pachDllName);
176 if (fOrd)
177 printf("%d\n", usOrdinal);
178 else
179 printf("%.*s\n", cchExtName, pachExtName);
180
181 /* write to the definition file */
182 if (fOrd)
183 fprintf(phDef, " %.*s @ %d\n", cchIntName, pachIntName, usOrdinal);
184 else
185 if (cchExtName == 0)
186 fprintf(phDef, " %.*s\n", cchIntName, pachIntName);
187 else
188 fprintf(phDef, " %.*s = %.*s\n", cchExtName, pachExtName, cchIntName, pachIntName);
189
190 #else
191 printf(" fOrd=%d; ", *((unsigned char*)((int)pvRecord+6)));
192 i = *((unsigned char*)((int)pvRecord+7));
193 printf(" intName=%.*s; ", i, (char*)((int)pvRecord+8));
194 i += 8;
195 printf(" dllName=%.*s; ", *((unsigned char*)((int)pvRecord+i)), (char*)((int)pvRecord+i+1));
196 i += 1 + *((unsigned char*)((int)pvRecord+i));
197 if (*((unsigned char*)((int)pvRecord+6)))
198 printf(" ordinal=0x%d ", *((unsigned short*)((int)pvRecord+i)));
199 else
200 printf(" extName=%.*s; ", *((unsigned char*)((int)pvRecord+i)), (char*)((int)pvRecord+i+1));
201 #endif
202 } break;
203
204 default:
205 printf(" this subtype is not implemented yet");
206 }
207 break;
208
209 default:
210 printf(" class is not implemented yet");
211
212 }
213 printf("\n");
214 break;
215
216 case LIBEND:
217 printf("LIBEND: len=%d\n", *((unsigned short*)((int)pvRecord+1)));
218 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3;
219 return (void*)0xffffffff; /* FINE */
220 break;
221
222 default:
223 cbRecord = *((unsigned short*)((int)pvRecord+1)) + 3;
224 printf("oops: Record type not implemented yet. 0x%02x %d\n",
225 *(unsigned char*)pvRecord,
226 cbRecord);
227 break;
228 }
229
230 return (void*)((int)pvRet + cbRecord);
231}
232
233
Note: See TracBrowser for help on using the repository browser.