home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / patchldr.zip / PatchLDR.c < prev    next >
C/C++ Source or Header  |  1999-11-12  |  3KB  |  103 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define FALSE 0
  5. #define TRUE !FALSE
  6.  
  7. static char buf[65536];
  8. static char MatchB[] = {0x1E, 0x06, 0x0E, 0x0E, 0x1F, 0x07, 0xCD, 0x12, 0xA3};
  9. static char MatchE[] = {0x07, 0x1F, 0xC3};
  10. static int Offsets[] = {0x09, 0x18, 0x5A};
  11.  
  12. extern char PatchCode[];
  13. extern unsigned short PatchSize, Patches[];
  14.  
  15. int main() {
  16.   FILE *f;
  17.   int i, j;
  18.   unsigned long filelen;
  19.   int MatchBPos, MatchEPos;
  20.   unsigned short VarBase;
  21.  
  22.   char doit = FALSE;
  23.  
  24.   f = fopen ("OS2LDR", "rb");
  25.   if (f == NULL) {
  26.     printf ("File OS2LDR not found\n");
  27.     exit (1);
  28.   }
  29.   filelen = fread (buf, 1, sizeof (buf), f);
  30.   fclose (f);
  31.   if (filelen == sizeof (buf)) {
  32.     printf ("OS2LDR is too big\n");
  33.     exit (2);
  34.   }
  35.  
  36.   for (i = 0; i < (filelen - sizeof (MatchB)); i++)
  37.     if (!memcmp (buf + i, MatchB, sizeof (MatchB))) {
  38.       doit = TRUE;
  39.       MatchBPos = i + sizeof (MatchB) + 2;
  40.       break;
  41.     }
  42.   if (!doit) {
  43.     printf ("OS2LDR cannot be patched\n");
  44.     exit (3);
  45.   }
  46.   doit = FALSE;
  47.   for (i = MatchBPos; i < (filelen - sizeof (MatchE)); i++)
  48.     if (!memcmp (buf + i, MatchE, sizeof (MatchE))) {
  49.       doit = TRUE;
  50.       MatchEPos = i - 3;
  51.       break;
  52.     }
  53.   if (!doit) {
  54.     printf ("OS2LDR cannot be patched\n");
  55.     exit (3);
  56.   }
  57.   if ((MatchEPos - MatchBPos) < PatchSize) {
  58.     printf ("OS2LDR cannot be patched\n");
  59.     exit (3);
  60.   }
  61.   VarBase = *(unsigned short *)(buf + MatchBPos + Offsets[0] - (sizeof (MatchB) + 2));
  62.   doit = (*(unsigned short *)(buf + MatchBPos + Offsets[1] - (sizeof (MatchB) + 2)) - VarBase) == 2;
  63.   if (!doit) {
  64.     printf ("OS2LDR cannot be patched\n");
  65.     exit (3);
  66.   }
  67.   doit = (*(unsigned short *)(buf + MatchBPos + Offsets[2] - (sizeof (MatchB) + 2)) - VarBase) == 8;
  68.   if (!doit) {
  69.     printf ("OS2LDR cannot be patched\n");
  70.     exit (3);
  71.   }
  72.   f = fopen ("OS2LDR.bak", "wb");
  73.   if (f == NULL) {
  74.     printf ("New file OS2LDR.bak cannot be created\n");
  75.     exit (4);
  76.   }
  77.   i = fwrite (buf, 1, filelen, f);
  78.   fclose (f);
  79.   if (i != filelen) {
  80.     printf ("New file OS2LDR.bak cannot be created\n");
  81.     exit (4);
  82.   }
  83.  
  84.   memcpy (buf + MatchBPos, PatchCode, PatchSize);
  85.   memset (buf + MatchBPos + PatchSize, 0x90, MatchEPos - MatchBPos - PatchSize);
  86.   *(unsigned short*)(buf + MatchBPos + Patches[0]) += VarBase;
  87.   *(unsigned short*)(buf + MatchBPos + Patches[1]) += VarBase;
  88.  
  89.   f = fopen ("OS2LDR", "wb");
  90.   if (f == NULL) {
  91.     printf ("New file OS2LDR cannot be created\n");
  92.     exit (4);
  93.   }
  94.   i = fwrite (buf, 1, filelen, f);
  95.   fclose (f);
  96.   if (i != filelen) {
  97.     printf ("New file OS2LDR cannot be created\n");
  98.     exit (4);
  99.   }
  100.  
  101.   return (0);
  102. }
  103.