home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / MARK.ZIP / MARK.C next >
C/C++ Source or Header  |  1990-05-05  |  4KB  |  92 lines

  1. /*
  2.    FILE:    mark.c
  3.    PROGRAMMER:    Jeff Trawick
  4.    DATE:    April 1990
  5.    
  6.    This program can be used to enable an OS/2 program to be run in a 
  7.    window.  Such a program must only use stdin, stdout, stderr.  Otherwise
  8.    a protection exception will occur.  mark.c does not check to ensure 
  9.    that no VioXXX calls are made.
  10.    
  11.    This program is placed in the public domain.  It may be used by
  12.    anyone for any reason provided that it is not sold.
  13. */
  14.  
  15. #include <os2.h>
  16. #include <stdio.h>                
  17.  
  18. #define FILE_OPEN            0x0001
  19. #define OPEN_ACCESS_READWRITE        0x0002
  20. #define OPEN_SHARE_DENYREADWRITE    0x0010         
  21. #define FILE_BEGIN            0                
  22. #define FILE_CURRENT            1
  23.  
  24. extern void exit(int);
  25.  
  26. void Fatal(char *s)
  27. {
  28.   fprintf(stderr,"%s\n",s);
  29.   exit(1);
  30. }
  31.  
  32. int main(int argc,char *argv[])
  33. {                         
  34.   char buffer[80];
  35.   ULONG ulNewHeaderOffset, ulNewPtr;
  36.   USHORT usAction, usBytesRead, usBytesWritten, usRcode;
  37.   HFILE file;
  38.   
  39.   if (argc != 2)
  40.     Fatal("Usage: MARK <progfilename>");
  41.   usRcode = DosOpen(argv[1],&file,&usAction,0L,0,FILE_OPEN,
  42.             OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE,0L);
  43.   if (usRcode != 0)
  44.     Fatal("Can't open file");
  45.   /* first two bytes of the old EXE header are always 'M' and 'Z' */
  46.   usRcode = DosRead(file,buffer,2,&usBytesRead);
  47.   if (usRcode != 0 || usBytesRead != 2)
  48.     Fatal("Error reading from file");
  49.   if (buffer[0] != 'M' || buffer[1] != 'Z')
  50.     Fatal("File is not a valid EXE file");                
  51.   /* get the offset of the new EXE header */
  52.   usRcode = DosChgFilePtr(file,(LONG)0x003C,FILE_BEGIN,&ulNewPtr);
  53.   if (usRcode != 0 || ulNewPtr != 0x003C)
  54.     Fatal("Error processing old EXE header");
  55.   usRcode = DosRead(file,&ulNewHeaderOffset,
  56.             sizeof(ulNewHeaderOffset),&usBytesRead);
  57.   if (usRcode != 0 || usBytesRead != sizeof(ulNewHeaderOffset))
  58.     Fatal("Error reading from file");
  59.   usRcode = DosChgFilePtr(file,ulNewHeaderOffset,FILE_BEGIN,&ulNewPtr);
  60.   if (usRcode != 0 || ulNewPtr != ulNewHeaderOffset)
  61.     Fatal(sprintf(buffer,"Error moving to new EXE header (offset 0x%08X)",
  62.           ulNewHeaderOffset));        
  63.   /* first two bytes of new EXE header are always 'N' and 'E' */
  64.   usRcode = DosRead(file,buffer,2,&usBytesRead);
  65.   if (usRcode != 0 || usBytesRead != 2)
  66.     Fatal("Error reading from file");
  67.   if (buffer[0] != 'N' || buffer[1] != 'E')
  68.     Fatal("File is not a valid EXE file");
  69.   /* the mode bits in question are in byte at NewHeader + 0x0D;
  70.      move 0x0B bytes down the file to get to NewHeader + 0x0D */
  71.   usRcode = DosChgFilePtr(file,(LONG)0x000B,FILE_CURRENT,&ulNewPtr);
  72.   if (usRcode != 0 || ulNewPtr != (ulNewHeaderOffset + 0x000D))
  73.     Fatal(sprintf(buffer,"Error moving to offset 0x%08X",
  74.           ulNewHeaderOffset + 0x0D));
  75.   usRcode = DosRead(file,buffer,1,&usBytesRead);
  76.   if (usRcode != 0 || usBytesRead != 1)
  77.     Fatal("Error reading from file");
  78.   /* set the 3 low order bits to 010 to turn on ability to run in a window */
  79.   buffer[0] = (buffer[0] & 0xF8) | 0x02;  
  80.   /* move back to re-write byte we just read */
  81.   usRcode = DosChgFilePtr(file,ulNewHeaderOffset + 0x0D,FILE_BEGIN,&ulNewPtr);
  82.   if (usRcode != 0 || ulNewPtr != ulNewHeaderOffset + 0x0D)
  83.     Fatal(sprintf(buffer,"Error moving to offset 0x%08X",ulNewHeaderOffset));
  84.   usRcode = DosWrite(file,buffer,1,&usBytesWritten);
  85.   if (usRcode != 0 || usBytesWritten != 1)
  86.     Fatal("Error writing to file");
  87.   usRcode = DosClose(file);
  88.   if (usRcode != 0)
  89.     Fatal("Error closing file");
  90.   return 0;
  91. }
  92.