home *** CD-ROM | disk | FTP | other *** search
- // Immortal Player's Runtime Library Copyright (c) 1991 IP Makers
-
- #include <dos.h>
- #include <process.h>
- #define MAX_N_BYTES 256
-
- typedef struct { // Information about each byte
- unsigned long offset; // that will be corrected will
- unsigned char value; // be saved in this structure:
- } OffsetAndValue; // OFFSET from PSP,
- // VALUE to put there
- typedef struct {
- unsigned long delay; // DataIP contains data
- OffsetAndValue change[ MAX_N_BYTES ]; // for whole crack;
- } DataIP; // Timer will send a byte
- // every DELAY/18.2 seconds for
- #pragma warn -inl // every array's CHANGE element
-
- class IP {
- private:
- static DataIP *data;
- static void interrupt ( *OldTimer )(...);
- static void interrupt Timer(...)
- {
- static ticks = data->delay;
- OldTimer();
- enable();
- if( !ticks-- ){
- unsigned psp = getpsp();
- int i = 0;
- while(( data->change[i].offset != 0 ) && i < MAX_N_BYTES ){
- unsigned long& offset = data->change[i].offset;
- unsigned seg_offset = *(( unsigned* )&offset + 1 );
- *( char far* )MK_FP( psp + ( seg_offset << 12 ),
- ( unsigned )offset ) = data->change[i++].value;
- }
- ticks = data->delay;
- }
- }
- public:
- IP( char* CommandLine, DataIP* p )
- {
- data = p; // Constructor prepares
- OldTimer = getvect( 8 ); // interrupt environment
- setvect( 8, IP::Timer ); // and makes system call
- system( CommandLine );
- }
- ~IP(){ setvect( 8, OldTimer ); } // Destructor restores
- }; // old interrupt vector
-
- void interrupt ( *IP::OldTimer )(...);
- DataIP* IP::data;