/* pads the a given exe file to the next 512 byte boundary and */ /* includes a copyright notice in the header */ /* run this program on PMODSTUB.EXE after linking */ #include #include #include static char copyright[] = "%s generated on %.24s\r\n" "The %s stub loader is Copyright (C) 1993-1995 DJ Delorie.\r\n" "Permission granted to use for any purpose provided this copyright\r\n" "remains present and unmodified.\r\n" "This only applies to the stub, and not necessarily the whole program.\r\n"; /*unsigned long filesize( FILE *fp ) { unsigned long int save_pos, size_of_file; save_pos = ftell( fp ); fseek( fp, 0L, SEEK_END ); size_of_file = ftell( fp ); fseek( fp, save_pos, SEEK_SET ); return( size_of_file ); }*/ int main(int argc, char **argv) { struct Head { unsigned short ID, Len_mod512, Len_blk512, NumReloc, HeaderSize, MinMem, MaxMem, ProgMem, Start_SP, CheckSum, Start_IP, Start_CodeSeg, RelocPos, OverlayNum; } head; char msg[1024]; char *buff,*exe; unsigned bufflen,exelen,newlen,off,msglen; time_t now; FILE *f; if (argc != 2) { printf("padsec "); return 1; } if ( (f = fopen(argv[1], "rb")) == NULL ) { printf( "%s not found\n", argv[1] ); return 1; } /* Make headermessage */ memset(msg, 0, sizeof(msg)); time(&now); sprintf(msg,copyright,argv[1],ctime(&now),argv[1]); msglen = (strlen(msg) + 2) & ~1; /* Read in Header */ fread(&head, sizeof(head), 1, f); bufflen = (sizeof(head) + head.NumReloc*4 + msglen + 511) & ~ 511; buff = (char *)malloc(bufflen); memset(buff, 0, bufflen); off = 0; memcpy(buff+off, &head, sizeof(head)); off += sizeof(head); memcpy(buff+off, msg, msglen); off += msglen; fseek(f, head.RelocPos, SEEK_SET); fread(buff+off, head.NumReloc, 4, f); ((struct Head *)buff)->HeaderSize = bufflen / 16; ((struct Head *)buff)->RelocPos = off; /* Read in rest of exefile, ignoring anything after */ exelen = head.Len_blk512*512; if (head.Len_mod512) exelen = exelen - 512 + head.Len_mod512; exelen -= head.HeaderSize*16; newlen = (exelen + 511) & ~511; exe = (char *)malloc(newlen); memset(exe, 0, newlen); fseek(f, head.HeaderSize*16, SEEK_SET); fread(exe, exelen, 1, f); ((struct Head *)buff)->Len_blk512 = (newlen + bufflen) / 512; ((struct Head *)buff)->Len_mod512 = 0; fclose(f); /* Write new exefile */ if ( (f = fopen(argv[1], "wb")) == NULL) { printf("cannot open %s for writing\n", argv[1]); return 1; } fwrite(buff, bufflen, 1, f); fwrite(exe, newlen, 1, f); fclose(f); free(buff); free(exe); return 0; }