home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 11 Util
/
11-Util.zip
/
LXDUMP.ZIP
/
LXDUMP.C
next >
Wrap
C/C++ Source or Header
|
1993-03-27
|
4KB
|
153 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct LXHdr
{
char LXID[2];
char ByteOrder;
char WordOrder;
long FormatLevel;
short CPUType;
short OSType;
long ModVersion;
long ModFlags;
long ModNumPages;
long EIPObjNum;
long EIP;
long ESPObjNum;
long ESP;
long PageSize;
long PageOffShift;
long FixupSectionSize;
long FixupSectionChksum;
long LoaderSectionSize;
long LoaderSectionChksum;
long ObjTblOff;
long NumOjbsInModule;
long ObjPageTblOff;
long ObjIterPagesOff;
long ResTblOff;
long NumResTblEntries;
long ResNameTblOff;
long EntryTblOff;
long ModDirectivesOff;
long NumModDirectives;
long FixupPageTblOff;
long FixupRecordTblOff;
long ImpModTblOff;
long NumImpModEntries;
long ImpProcTblOff;
long PerPageChksumOff;
long DataPagesOff;
long NumPreloadPages;
long NonResNameTblOff;
long NonresNameTblLen;
long NonResNameTblChksum;
long AutoDSObjNum;
long DebugInfoOff;
long DebugInfoLen;
long NumInstancePreload;
long NumInstanceDemand;
long HeapSize;
} LXHeader;
int main(int argc, char *argv[])
{
char *filename, NameLen, nameBuf[130];
FILE *exefile;
long LXHdrOff, otherSeek;
int z = 1, i=0, impTblLen;
short ordinal;
/*
For some reason gcc (emx) doesn't like if (argc < 2). Reported to EM.
if ( argc < 2)
*/
if (!(argc > 1))
{
printf("Usage: lxdump <exefilename>\n");
exit(1);
}
filename = strdup(argv[1]);
exefile = fopen(filename,"rb");
if (exefile==NULL)
{
printf("Unable to open file %s\n",filename);
exit(2);
}
fseek(exefile,0x3C,0);
fread((void *)&LXHdrOff,4,1,exefile);
fseek(exefile,LXHdrOff,0);
fread((void *) &LXHeader, sizeof(struct LXHdr),1,exefile);
printf("EXE Type: %c%c\n",LXHeader.LXID[0],LXHeader.LXID[1]);
if (LXHeader.LXID[0] != 'L' || LXHeader.LXID[1] != 'X')
{
printf("\nNot an LX file.");
fclose(exefile);
exit(1);
}
printf("CPU Type: %s\n",LXHeader.CPUType == 1 ? "80286" :
LXHeader.CPUType == 2 ? "80386" : "80486" );
printf("OS Type: %s\n",
LXHeader.OSType == 0 ? "Unknown" : LXHeader.OSType == 1 ? "OS/2" :
LXHeader.OSType == 2 ? "Windows" : LXHeader.OSType == 3 ? "DOS4" :
"Windows/386");
otherSeek = LXHdrOff + LXHeader.ResNameTblOff;
fseek(exefile,otherSeek,0);
fread((void *)&NameLen,sizeof(char),1,exefile);
printf("Resident Name Table: (%lx)\n",otherSeek);
while(NameLen)
{
fread((void *)nameBuf,sizeof(char),NameLen,exefile);
nameBuf[NameLen] = '\0';
fread((void *)&ordinal,sizeof(short),1,exefile);
printf("%-s (@%d)\n",nameBuf,ordinal);
fread((void *)&NameLen,sizeof(char),1,exefile);
}
otherSeek = LXHdrOff + LXHeader.ImpModTblOff;
impTblLen = (LXHdrOff + LXHeader.ImpProcTblOff) - otherSeek;
fseek(exefile,otherSeek,0);
printf("Import Module Table: (%lx)\n",otherSeek);
for (i=0; i<LXHeader.NumImpModEntries; i++)
{
fread((void *)&NameLen,sizeof(char),1,exefile);
fread((void *)nameBuf,sizeof(char),NameLen,exefile);
nameBuf[NameLen]='\0';
printf("%-s\n",nameBuf);
}
otherSeek = LXHdrOff + LXHeader.ImpProcTblOff;
fseek(exefile,otherSeek,0);
fread((void *)&NameLen,sizeof(char),1,exefile);
printf("Import Procedure Name Table: (%lx)\n",otherSeek);
while(NameLen)
{
fread((void *)nameBuf,sizeof(char),NameLen,exefile);
nameBuf[NameLen]='\0';
printf("%-s\n",nameBuf);
fread((void *)&NameLen,sizeof(char),1,exefile);
}
otherSeek = LXHeader.NonResNameTblOff;
if (otherSeek > 0)
{
fseek(exefile,otherSeek,0);
printf("Non-Resident Name Table: (%lx)\n",otherSeek);
fread((void *)&NameLen,sizeof(char),1,exefile);
while(NameLen)
{
fread((void *)nameBuf,sizeof(char),NameLen,exefile);
nameBuf[NameLen] = '\0';
fread((void *)&ordinal,sizeof(short),1,exefile);
printf("%-s (@%d)\n",nameBuf,ordinal);
fread((void *)&NameLen,sizeof(char),1,exefile);
}
}
printf("\n");
fclose(exefile);
exit(0);
}