home *** CD-ROM | disk | FTP | other *** search
- /*
- FILE: mark.c
- PROGRAMMER: Jeff Trawick
- DATE: April 1990
-
- This program can be used to enable an OS/2 program to be run in a
- window. Such a program must only use stdin, stdout, stderr. Otherwise
- a protection exception will occur. mark.c does not check to ensure
- that no VioXXX calls are made.
-
- This program is placed in the public domain. It may be used by
- anyone for any reason provided that it is not sold.
- */
-
- #include <os2.h>
- #include <stdio.h>
-
- #define FILE_OPEN 0x0001
- #define OPEN_ACCESS_READWRITE 0x0002
- #define OPEN_SHARE_DENYREADWRITE 0x0010
- #define FILE_BEGIN 0
- #define FILE_CURRENT 1
-
- extern void exit(int);
-
- void Fatal(char *s)
- {
- fprintf(stderr,"%s\n",s);
- exit(1);
- }
-
- int main(int argc,char *argv[])
- {
- char buffer[80];
- ULONG ulNewHeaderOffset, ulNewPtr;
- USHORT usAction, usBytesRead, usBytesWritten, usRcode;
- HFILE file;
-
- if (argc != 2)
- Fatal("Usage: MARK <progfilename>");
- usRcode = DosOpen(argv[1],&file,&usAction,0L,0,FILE_OPEN,
- OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE,0L);
- if (usRcode != 0)
- Fatal("Can't open file");
- /* first two bytes of the old EXE header are always 'M' and 'Z' */
- usRcode = DosRead(file,buffer,2,&usBytesRead);
- if (usRcode != 0 || usBytesRead != 2)
- Fatal("Error reading from file");
- if (buffer[0] != 'M' || buffer[1] != 'Z')
- Fatal("File is not a valid EXE file");
- /* get the offset of the new EXE header */
- usRcode = DosChgFilePtr(file,(LONG)0x003C,FILE_BEGIN,&ulNewPtr);
- if (usRcode != 0 || ulNewPtr != 0x003C)
- Fatal("Error processing old EXE header");
- usRcode = DosRead(file,&ulNewHeaderOffset,
- sizeof(ulNewHeaderOffset),&usBytesRead);
- if (usRcode != 0 || usBytesRead != sizeof(ulNewHeaderOffset))
- Fatal("Error reading from file");
- usRcode = DosChgFilePtr(file,ulNewHeaderOffset,FILE_BEGIN,&ulNewPtr);
- if (usRcode != 0 || ulNewPtr != ulNewHeaderOffset)
- Fatal(sprintf(buffer,"Error moving to new EXE header (offset 0x%08X)",
- ulNewHeaderOffset));
- /* first two bytes of new EXE header are always 'N' and 'E' */
- usRcode = DosRead(file,buffer,2,&usBytesRead);
- if (usRcode != 0 || usBytesRead != 2)
- Fatal("Error reading from file");
- if (buffer[0] != 'N' || buffer[1] != 'E')
- Fatal("File is not a valid EXE file");
- /* the mode bits in question are in byte at NewHeader + 0x0D;
- move 0x0B bytes down the file to get to NewHeader + 0x0D */
- usRcode = DosChgFilePtr(file,(LONG)0x000B,FILE_CURRENT,&ulNewPtr);
- if (usRcode != 0 || ulNewPtr != (ulNewHeaderOffset + 0x000D))
- Fatal(sprintf(buffer,"Error moving to offset 0x%08X",
- ulNewHeaderOffset + 0x0D));
- usRcode = DosRead(file,buffer,1,&usBytesRead);
- if (usRcode != 0 || usBytesRead != 1)
- Fatal("Error reading from file");
- /* set the 3 low order bits to 010 to turn on ability to run in a window */
- buffer[0] = (buffer[0] & 0xF8) | 0x02;
- /* move back to re-write byte we just read */
- usRcode = DosChgFilePtr(file,ulNewHeaderOffset + 0x0D,FILE_BEGIN,&ulNewPtr);
- if (usRcode != 0 || ulNewPtr != ulNewHeaderOffset + 0x0D)
- Fatal(sprintf(buffer,"Error moving to offset 0x%08X",ulNewHeaderOffset));
- usRcode = DosWrite(file,buffer,1,&usBytesWritten);
- if (usRcode != 0 || usBytesWritten != 1)
- Fatal("Error writing to file");
- usRcode = DosClose(file);
- if (usRcode != 0)
- Fatal("Error closing file");
- return 0;
- }
-