home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / DJGPP / V2MISC / PMODE12S.ZIP / SRC / PMODE / PADSEC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-02-22  |  3.3 KB  |  122 lines

  1. /* pads the a given exe file to the next 512 byte boundary and */
  2. /* includes a copyright notice in the header */
  3. /* run this program on PMODSTUB.EXE after linking */
  4.  
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <time.h>
  8. #include <string.h>
  9.  
  10. static char copyright[] =
  11.  "%s generated on %.24s\r\n"
  12.  "The %s stub loader is Copyright (C) 1993-1995 DJ Delorie.\r\n"
  13.  "Permission granted to use for any purpose provided this copyright\r\n"
  14.  "remains present and unmodified.\r\n"
  15.  "This only applies to the stub, and not necessarily the whole program.\r\n";
  16.  
  17.  
  18. /*unsigned long filesize( FILE *fp )
  19. {
  20.   unsigned long int save_pos, size_of_file;
  21.  
  22.   save_pos = ftell( fp );
  23.   fseek( fp, 0L, SEEK_END );
  24.   size_of_file = ftell( fp );
  25.   fseek( fp, save_pos, SEEK_SET );
  26.   return( size_of_file );
  27. }*/
  28.  
  29. int main(int argc, char **argv)
  30. {
  31.   struct Head
  32.   { unsigned short
  33.       ID,
  34.       Len_mod512,
  35.       Len_blk512,
  36.       NumReloc,
  37.       HeaderSize,
  38.       MinMem,
  39.       MaxMem,
  40.       ProgMem,
  41.       Start_SP,
  42.       CheckSum,
  43.       Start_IP,
  44.       Start_CodeSeg,
  45.       RelocPos,
  46.       OverlayNum;
  47.   } head;
  48.  
  49.   char msg[1024];
  50.   char *buff,*exe,*pack;
  51.   size_t bufflen,exelen,newlen,off,msglen,packlen;
  52.   time_t now;
  53.   FILE *f;
  54.  
  55.   if (argc != 2)
  56.   { printf("padsec <exefile>");
  57.     return 1;
  58.   }
  59.   if ( (f = fopen(argv[1], "rb")) == NULL )
  60.   { printf( "%s not found\n", argv[1] );
  61.     return 1;
  62.   }
  63.  
  64.   /* Make headermessage */
  65.   memset(msg, 0, sizeof(msg));
  66.   time(&now);
  67.   sprintf(msg,copyright,argv[1],ctime(&now),argv[1]);
  68.   msglen = (strlen(msg) + 2) & ~1;
  69.  
  70.   /* Read in Header */
  71.   fread(&head, sizeof(head), 1, f);
  72.   bufflen = (sizeof(head) + head.NumReloc*4 + msglen + 511) & ~ 511;
  73.   if (bufflen > 512)
  74.   { printf("Sorry, the exe header can't be larger than 512 bytes!\n");
  75.     return 1;
  76.   }
  77.   buff = (char *)malloc(bufflen);
  78.   memset(buff, 0, bufflen);
  79.   off = 0;
  80.   memcpy(buff+off, &head, sizeof(head)); off += sizeof(head);
  81.   memcpy(buff+off, msg, msglen); off += msglen;
  82.   fseek(f, head.RelocPos, SEEK_SET);
  83.   fread(buff+off, head.NumReloc, 4, f);
  84.   ((struct Head *)buff)->HeaderSize = bufflen / 16;
  85.   ((struct Head *)buff)->RelocPos   = off;
  86.  
  87.   /* Read in rest of exefile, ignoring anything after */
  88.   exelen = head.Len_blk512*512;
  89.   if (head.Len_mod512) exelen = exelen - 512 + head.Len_mod512;
  90.   exelen -= head.HeaderSize*16;
  91.   newlen = (exelen + 511) & ~511;
  92.   exe = (char *)malloc(newlen);
  93.   memset(exe, 0, newlen);
  94.   fseek(f, head.HeaderSize*16, SEEK_SET);
  95.   fread(exe, exelen, 1, f);
  96.  
  97.   /* Try to remove trailing zeros in the .exe file */
  98.   for (pack = exe + exelen; *--pack==0; ) ;
  99.   packlen = (pack + 1 - exe + 511) & ~511;
  100.  
  101.   /* Set the new exe length */
  102.   ((struct Head *)buff)->Len_blk512 = (packlen + bufflen) / 512;
  103.   ((struct Head *)buff)->Len_mod512 = 0;
  104.   ((struct Head *)buff)->MinMem     =
  105.     (((exelen+15)&~15) + ((struct Head *)buff)->MinMem*16 - packlen) / 16;
  106.   ((struct Head *)buff)->MaxMem     = ((struct Head *)buff)->MinMem;
  107.   fclose(f);
  108.  
  109.   /* Write new exefile */
  110.   if ( (f = fopen(argv[1], "wb")) == NULL)
  111.   { printf("cannot open %s for writing\n", argv[1]);
  112.     return 1;
  113.   }
  114.   fwrite(buff, bufflen, 1, f);
  115.   fwrite(exe, packlen, 1, f);
  116.   fclose(f);
  117.   free(buff);
  118.   free(exe);
  119.  
  120.   return 0;
  121. }
  122.