|
1楼 |
|
|
|
| 222.40.81.* |
2楼 |
|
|
|
3楼 至于 Dos 下的 TSR,等我翻个旧东西出来吧。 要用 Turbo/Borland C++ 编译,不好意思,什么版本我忘了,以前可以用的。 现在 Windows 下的 Dos,不知道可不可以用了。 我以前把这个写成通用的类库,你看看怎么驻留程序和替换 Dos 的时钟中断,再改就好了。 分三部分: tsrdrive.h - 头文件 tsrdrive.cpp - 编译成 .lib boss.cpp - 一个示范程序,驻留后按热键可清屏,然后显示一个 C:\,上班玩游戏,骗老板用的。 Dos 早就过时,现在的多任务操作系统不需要这些,不要太钻牛角尖了。 |
|
|
|
|
4楼 /*************************************************************************** * Copyright (C) 1996 by akuma@tds * * * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
|
|
|
|
5楼 * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ // ************************************************************************** // * Program Name : common TSR program driver // * Filename : TSRdrive.H // * Category : driver // * Programmer : akuma@tds // * Version : 1.00 // * File Index : none // * Date : July 25th 96' // * Comments : for Borland C/C++ compiler // * // * Copyright (C) akuma@tds. // * All rights reserved. // ************************************************************************** #if ! defined (hrTSRdriver) # define hrTSRdriver #include <Dos.h> #include <Mem.h> # define Multiplex_ID 0xC0 # define InstallCheck 0x00 # define Installed 0xFF # define Deinstall 0x01 # define EnablePopup 0x02 # define DisablePopup 0x03 |
|
|
|
|
6楼 # define ChangeHotkey 0x05 # define PSP_terminate 0x0A # define PSP_parent 0x16 # define PSP_ENV_addr 0x2C # define maxSDAList 20 # define TSRStacksize 8192 # define PARAGRAPHS(x) ((FP_OFF(x) + 15) >> 4) #if ! defined (tyInterruptPtr) # define tyInterruptPtr 0x0100 typedef void interrupt (* InterruptPtr)() ; #endif // define InterruptPtr #if ! defined (stHotkey) # define stHotkey 0x0100 struct Hotkey { // *************** // * constructor * // *************** public: Hotkey(unsigned int sc, unsigned int km = 0x00) ; // **************** // * Data members * // **************** public: unsigned int keymask; unsigned int scancode; } ; // Hotkey constructor implementation inline Hotkey::Hotkey(unsigned int sc, unsigned int km) { keymask = km; scancode = sc; } #endif // define Hotkey #if ! defined (stSDAList) # define stSDAList 0x0100 struct SDAList { void far * SDAPtr ; unsigned int size ; } ; #endif // define SDAList #if ! defined (clTSRdriver) # define clTSRdriver 0x0100 class TSRdriver { // *************** // * constructor * // *************** public: TSRdriver(Hotkey * TheKey, void (* Work)(void), unsigned char MultiplexID ) ; // ******************** // * Member Functions * // ******************** public: int init() ; int exist() ; void Disable() ; void Enable() ; int uninstall() ; void getHotkey(Hotkey& Thekey) ; void changeHotkey(Hotkey& Thekey) ; void resident(int Exitcode = 0x00) ; protected: // TSR driver's ISR static void interrupt far NewInt08 (...) ; static void interrupt far NewInt09 (...) ; static void interrupt far NewInt13 (...) ; static void interrupt far NewInt1B (...) ; |
|
|
|
|
7楼 static void interrupt far NewInt24 (...) ; static void interrupt far NewInt28 (...) ; static void interrupt far NewInt2A (...) ; static void interrupt far NewInt2F (...) ; private: static void popupTSR(void) ; static int initSDA(void) ; static int saveSDA(void) ; static void restoreSDA(void) ; static void setStack(void) ; static void restoreStack(void) ; static void setpsp(unsigned aPSP) ; static unsigned int eraseTSR(void) ; // **************** // * Data members * // **************** public: // popup sign static unsigned char popupenable ; static unsigned char residentsize ; protected: // original ISR address static void interrupt far ( * OldInt08 )(...) ; static void interrupt far ( * OldInt09 )(...) ; static void interrupt far ( * OldInt13 )(...) ; static void interrupt far ( * OldInt1B )(...) ; static void interrupt far ( * OldInt23 )(...) ; static void interrupt far ( * OldInt24 )(...) ; static void interrupt far ( * OldInt28 )(...) ; static void interrupt far ( * OldInt2A )(...) ; static void interrupt far ( * OldInt2F )(...) ; static void ( * TSRwork )(void) ; // signs static unsigned char multiplex_id; static unsigned char TSR_Error; static unsigned int far * Dosworking; static unsigned char Int13working; static unsigned char Int2Aworking; static unsigned char Hotkeypressed; static unsigned char TSRworking; static Hotkey * TSRHotkey; static int workvar; private: static unsigned int DosLevel ; static unsigned int savedSS ; static unsigned int savedSP ; static unsigned int savedDS ; |
|
|
|
|
8楼 static unsigned char far * StackPtr ; // vars. for Dos 3.x static char far * SDAPtr ; static char far * savedSDAPtr ; static int v3SDAsizeInDos ; static int v3SDAsizeAlways ; static int v3size ; // vars. for Dos 4.x + static int SDAnumber ; static SDAList SDAs [maxSDAList] ; static char far * savedSDAPtrs [maxSDAList] ; static int SDAflags [maxSDAList] ; } ; inline int TSRdriver::exist() { _AH = multiplex_id ; _AL = InstallCheck ; geninterrupt(0x2F) ; return ( _AL == Installed ) ; } inline void TSRdriver::Disable() { _AH = multiplex_id ; _AL = DisablePopup ; geninterrupt(0x2F) ; } inline void TSRdriver::Enable() { _AH = multiplex_id ; _AL = EnablePopup ; geninterrupt(0x2F) ; } inline void TSRdriver::changeHotkey(Hotkey& Thekey) { _AH = multiplex_id ; _AL = ChangeHotkey ; _BX = Thekey.keymask ; _DX = Thekey.scancode ; geninterrupt(0x2F) ; } inline void TSRdriver::getHotkey(Hotkey& Thekey) { _AH = multiplex_id ; _AL = GetHotkey ; geninterrupt(0x2F) ; Thekey.keymask = _BX ; Thekey.scancode = _DX ; } # define getDosSDAv3 0x5D06 # define getDosSDAv4 0x5D0B #endif // define TSRdriver #endif // header end. |
|
|
|
|
9楼 /*************************************************************************** * Copyright (C) 1996 by akuma@tds * * * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
|
|
|
|
10楼 * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ void interrupt far ( * TSRdriver::OldInt08 )(...) = NULL; void interrupt far ( * TSRdriver::OldInt09 )(...) = NULL ; void interrupt far ( * TSRdriver::OldInt13 )(...) = NULL ; void interrupt far ( * TSRdriver::OldInt1B )(...) = NULL ; void interrupt far ( * TSRdriver::OldInt23 )(...) = NULL ; void interrupt far ( * TSRdriver::OldInt24 )(...) = NULL ; void interrupt far ( * TSRdriver::OldInt28 )(...) = NULL ; void interrupt far ( * TSRdriver::OldInt2A )(...) = NULL ; void interrupt far ( * TSRdriver::OldInt2F )(...) = NULL ; void ( * TSRdriver::TSRwork )(void) = NULL ; unsigned char TSRdriver::multiplex_id = Multiplex_ID; unsigned char TSRdriver::TSR_Error = NULL; unsigned char TSRdriver::popupenable = NULL; unsigned char TSRdriver::residentsize = NULL; unsigned int far * TSRdriver::Dosworking = NULL; |
|
|
|
|
11楼 unsigned char TSRdriver::Int2Aworking = NULL; unsigned char TSRdriver::Hotkeypressed = NULL; unsigned char TSRdriver::TSRworking = NULL; Hotkey * TSRdriver::TSRHotkey = NULL; int TSRdriver::workvar = NULL; unsigned int TSRdriver::DosLevel = NULL; unsigned int TSRdriver::savedSS = NULL; unsigned int TSRdriver::savedSP = NULL; unsigned int TSRdriver::savedDS = NULL; unsigned long TSRdriver::TerminateAddr = NULL; unsigned char far * TSRdriver::StackPtr = NULL; char far * TSRdriver::SDAPtr = NULL; char far * TSRdriver::savedSDAPtr = NULL; int TSRdriver::v3SDAsizeInDos = NULL; int TSRdriver::v3SDAsizeAlways = NULL; int TSRdriver::v3size = NULL; int TSRdriver::SDAnumber = NULL; SDAList TSRdriver::SDAs [maxSDAList] ; char far * TSRdriver::savedSDAPtrs [maxSDAList] ; int TSRdriver::SDAflags [maxSDAList] ; void interrupt TSRdriver::NewInt08 (...) { ( * OldInt08 )() ; if ( Hotkeypressed && ! Int2Aworking ) if ( ! Int13working ) popupTSR() ; } void interrupt TSRdriver::NewInt09 (...) { if ( inportb(0x60) == TSRHotkey->scancode ) { workvar = peekb(0x00, 0x417) ; if ( popupenable && (( workvar & TSRHotkey->keymask ) ^ TSRHotkey->keymask) == 0 ) { // reset keyboard workvar = inportb(0x61) ; outportb(0x61, workvar | 0x80) ; outportb(0x61, workvar) ; disable() ; outportb(0x20, 0x20) ; enable() ; if ( ! TSRworking ) Hotkeypressed = 1 ; return ; } } ( * OldInt09 )() ; } void interrupt TSRdriver::NewInt13 (...) { Int13working ++ ; ( * OldInt13 )() ; -- Int13working ; } void interrupt TSRdriver::NewInt1B (...) { // do nothing. |
|
|
|
|
12楼 void interrupt TSRdriver::NewInt23 (...) { // do nothing. } void interrupt TSRdriver::NewInt24 (...) { if ( _osmajor >= 3 ) _AX = 3 ; else _AX = 0 ; } void interrupt TSRdriver::NewInt28 (...) { ( * OldInt28 ) () ; if ( Hotkeypressed && ! Int2Aworking ) popupTSR() ; } void interrupt TSRdriver::NewInt2A (...) { switch ( _AX & 0xFF00 ) { case 0x8000 : Int2Aworking ++ ; break ; case 0x8100 : case 0x8200 : if (Int2Aworking) Int2Aworking -- ; break ; default : break ; } ( * OldInt2A ) () ; } void interrupt TSRdriver::NewInt2F (...) { if ( _AH == multiplex_id ) switch ( _AL ) { case InstallCheck : _AX |= Installed ; break ; case Deinstall : TerminateAddr = ((long)_BX << 16) + _DX ; _AX = eraseTSR() ; break ; case EnablePopup : popupenable = 1 ; break ; case DisablePopup : popupenable = 0 ; break ; default : break ; } else ( * OldInt2F ) () ; } void TSRdriver::setpsp (unsigned aPSP) { _AH = 0x50 ; _BX = aPSP ; geninterrupt(0x21) ; } int TSRdriver::uninstall() { _AH = multiplex_id ; _AL = Deinstall ; savedSS = _SS ; savedSP = _SP ; |
|
|
|
|
13楼 _BX = _CS ; _DX = FP_OFF(TerminateAddr) ; geninterrupt(0x2F) ; return _AX ; } void TSRdriver::popupTSR () { TSRworking = 1 ; setStack() ; OldInt1B = getvect(0x1B) ; OldInt23 = getvect(0x23) ; OldInt24 = getvect(0x24) ; setvect(0x1B, NewInt1B) ; setvect(0x23, NewInt23) ; setvect(0x24, NewInt24) ; if ( saveSDA() ) { Hotkeypressed = 0 ; ( * TSRwork ) () ; restoreSDA() ; } setvect(0x1B, OldInt1B) ; setvect(0x23, OldInt23) ; setvect(0x24, OldInt24) ; restoreStack() ; TSRworking = 0 ; } void TSRdriver::setStack(void) { asm pop ax ;// get return offset asm pop bx ;// get return segment savedSS = _SS ;// save the register SS savedSP = _SP ;// save the register SP _SS = FP_SEG(StackPtr) ;// point to TSR's stack _SP = FP_OFF(StackPtr) ;// asm push bx ;// save return segment asm push ax ;// save return offset } void TSRdriver::restoreStack(void) { asm pop bx ;// get return offset |
|
|
|
|
14楼 FP_SEG(StackPtr) = _SS ;// save the register SS FP_OFF(StackPtr) = _SP ;// save the register SP _SS = savedSS ;// restore the register SS _SP = savedSP ;// restore the register SP asm push cx ;// set to return asm push bx ;// set to return } int TSRdriver::initSDA(void) { if ( ( _osmajor == 3 ) && ( _osminor >= 10 ) ) DosLevel = 3 ; else if ( _osmajor >= 4 ) DosLevel = 4 ; else DosLevel = 0 ; switch ( DosLevel ) { case 0 : return 1 ; case 3 : _AX = getDosSDAv3 ; geninterrupt(0x21) ; FP_SEG(SDAPtr) = _DS ; FP_OFF(SDAPtr) = _SI ; v3SDAsizeInDos = _CX ; v3SDAsizeAlways = _DX ; v3size = 0 ; if ( ( savedSDAPtr = new char(v3SDAsizeInDos) ) == 0 ) return 3 ; else return 0 ; default : SDAList far * SDALPtr ; int far * ifPtr ; |
|
|
|
|
15楼 _AX = getDosSDAv4 ; geninterrupt(0x21) ; FP_SEG(ifPtr) = _DS ; FP_OFF(ifPtr) = _SI ; SDAnumber = * ifPtr ; ifPtr ++ ; SDALPtr = (SDAList far *)ifPtr ; if ( SDAnumber > maxSDAList ) return 2 ; for (int i = 0; i < SDAnumber; i++) { SDAs[i].SDAPtr = SDALPtr -> SDAPtr ; SDAs[i].size = SDALPtr -> size ; if ( !(savedSDAPtrs[i] = new char(SDAs[i].size & 0x7FFF ) ) ) return 3 ; // not enough memory. SDAflags[i] = 0 ; SDALPtr ++ ; } return 0; } } int TSRdriver::saveSDA(void) { switch (DosLevel) { case 3 : if ( SDAPtr && ! Int2Aworking ) { v3size = ( * Dosworking ) ? v3SDAsizeInDos : v3SDAsizeAlways ; movedata(FP_SEG(SDAPtr), FP_SEG(SDAPtr), FP_SEG(savedSDAPtr), FP_SEG(savedSDAPtr), v3size ) ; return 1 ; } else return 0 ; case 4 : for (int i = 0; i < SDAnumber; i++) { if ( SDAs[i].size & 0x8000 ) { movedata(FP_SEG(SDAs[i].SDAPtr), FP_OFF(SDAs[i].SDAPtr), FP_SEG(savedSDAPtrs[i]), FP_OFF(savedSDAPtrs[i]), |
|
|
|
|
16楼 } else if ( * Dosworking ) { movedata(FP_SEG(SDAs[i].SDAPtr), FP_OFF(SDAs[i].SDAPtr), FP_SEG(savedSDAPtrs[i]), FP_OFF(savedSDAPtrs[i]), SDAs[i].size ) ; } } return 1 ; } return 0 ; } void TSRdriver::restoreSDA(void) { switch ( DosLevel ) { case 3 : if ( v3size && SDAPtr ) { movedata(FP_SEG(savedSDAPtr), FP_SEG(savedSDAPtr), FP_SEG(SDAPtr), FP_SEG(SDAPtr), v3size ) ; v3size = 0 ; } break ; case 4 : for (int i = 0; i < SDAnumber; i++) { movedata(FP_SEG(savedSDAPtrs[i]), FP_OFF(savedSDAPtrs[i]), FP_SEG(SDAs[i].SDAPtr), FP_OFF(SDAs[i].SDAPtr), SDAs[i].size ) ; SDAflags[i] = 0 ; } } } unsigned int TSRdriver::eraseTSR(void) { setStack() ; if ( ( NewInt08 == getvect(0x08) ) && ( NewInt09 == getvect(0x09) ) && |
|
|
|
|
17楼 ( NewInt28 == getvect(0x28) ) && ( NewInt2A == getvect(0x2A) ) && ( NewInt2F == getvect(0x2F) ) ) { setvect(0x08, OldInt08) ; setvect(0x09, OldInt09) ; setvect(0x13, OldInt13) ; setvect(0x28, OldInt28) ; setvect(0x2A, OldInt2A) ; setvect(0x2F, OldInt2F) ; * (int far *)(((long)_psp << 16) + PSP_parent) = getpsp() ; * (long far *)(((long)_psp << 16) + PSP_terminate) = TerminateAddr ; setpsp(_psp) ; _AL = 0 ; _DX = 0 ; geninterrupt(0x21) ; return 0 ; } return restoreStack(), 1 ; } TSRdriver::TSRdriver ( Hotkey * TheKey, void (* Work)(void), unsigned char MultiplexID) { TSRHotkey = TheKey ; TSRwork = Work ; multiplex_id = MultiplexID ; } int TSRdriver::init() { if ( exist() ) return TSR_Error = 0 ; _AH = 0x34 ; geninterrupt(0x21) ; FP_SEG(Dosworking) = _ES ; FP_OFF(Dosworking) = _BX ; StackPtr = new char (TSRStacksize) ; if ( StackPtr == 0 ) return TSR_Error = 3 ; StackPtr += TSRStacksize ; TSR_Error = initSDA() ; return TSR_Error ; } void TSRdriver::resident(int Exitcode) { unsigned int far * fp ; unsigned int dummy ; if ( TSR_Error ) return ; OldInt08 = getvect(0x08) ; OldInt09 = getvect(0x09) ; OldInt13 = getvect(0x13) ; OldInt28 = getvect(0x28) ; OldInt2A = getvect(0x2A) ; OldInt2F = getvect(0x2F) ; setvect(0x08, NewInt08) ; setvect(0x09, NewInt09) ; setvect(0x13, NewInt13) ; setvect(0x28, NewInt28) ; setvect(0x2A, NewInt2A) ; setvect(0x2F, NewInt2F) ; FP_SEG(fp) = _psp ; FP_OFF(fp) = PSP_ENV_addr ; _dos_freemem( * fp ) ; residentsize = _DS + PARAGRAPHS( StackPtr ) - _psp ; _dos_setblock(residentsize, _psp, &dummy) ; _dos_keep(Exitcode, residentsize) ; } |
|
|
|
|
18楼 /*************************************************************************** * Copyright (C) 1996 by akuma@tds * * * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
|
|
|
|
20楼 <<"Hot key: Alt + P"<<endl; if (AppTSR.exist()) { cerr<<"Boss already exist."<<endl; if (argc >= 2) for (int i = 2; i < argc; i++) switch (argv[i-1][0]) { case '/': case '-': switch (argv[i-1][1]) { case 'U': case 'u': AppTSR.uninstall() ; break ; case 'D': case 'd': AppTSR.Disable() ; break ; case 'E': case 'e': AppTSR.Enable() ; break ; case 'H': case 'h': case '?': helpmessage(argv[0]) ; break ; default: cerr<<"Switch error: "<<argv[i-1][1]<<endl; } break ; default: cerr<<"Parameter error: "<<argv[i]<<endl; } } switch (AppTSR.init()) { case 0: cerr<<"Boss V2.0 Installed."<<endl; break; case 1: cerr<<"Initialize fail."<<endl; break; case 2: cerr<<"Too meny Dos SDA area."<<endl; break; case 3: cerr<<"Not enough memory."<<endl; break; } AppTSR.resident() ; } |
|
|
|
| 222.51.116.* |
22楼 |
|
|
| 220.164.32.* |
23楼 |
|
|
| 222.243.31.* |
24楼 我什么时候才能有这样的水平啊 !!!!!! |
|
|
| 220.172.188.* |
26楼 |
|
|
| 59.41.40.* |
27楼 |
|
|
| 220.161.122.* |
28楼 |
|
|
| 222.205.82.* |
29楼 |
|
|
| 218.26.60.* |
30楼 |
|
|
