1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
| {***********************************************************************}
{ }
{ BGPH (BackGround Procedures Handler) }
{ }
{ Géstionnaire de procédures appellées à intervalles réguliers }
{ (procédures d'arrière-plan) }
{ }
{ Auteur : Eric GARIDACCI }
{ }
{ Date : 24.11.96 }
{ }
{ Màj : 03.05.97 }
{ (ajout de BGP_Enable, BGP_Disable et BGP_Enabled) }
{ }
{***********************************************************************}
{$A+,B-,D+,E-,F-,G+,I-,L+,N+,O-,P-,Q-,R-,S-,T-,V-,X-}
{$M 4096,0,0}
Unit BGPH;
Interface
{***********************************************************************}
{ Test si le géstionnaire a déjà été installé }
{***********************************************************************}
Function BGP_Installed:Boolean;
{***********************************************************************}
{ Test si les vecteurs d'intérruptions ont été détournés }
{***********************************************************************}
Function BGP_VectorsEqual:Boolean;
{***********************************************************************}
{ Autorise le géstionnaire à appeler la BGP }
{***********************************************************************}
Procedure BGP_Enable;
{***********************************************************************}
{ Intérdit le géstionnaire à appeler la BGP }
{***********************************************************************}
Procedure BGP_Disable;
{***********************************************************************}
{ Renvoie l'état d'activation de la BGP }
{***********************************************************************}
Function BGP_Enabled:Boolean;
{***********************************************************************}
{ }
{ Installation du géstionnaire de la BGP }
{ }
{ Ticks : Compteur d'activation de la BPG }
{ (1 = 1 / 18eme de secondes) }
{ }
{ ProcAddr : Addresse de la procédure Pascal devant être }
{ appellée par le géstionnaire }
{ }
{ Remarque : Si le géstionnaire a dejà été installé alors }
{ l'appel de cette procédure sera ignoré }
{ }
{***********************************************************************}
Procedure BGP_Install(Ticks:Word;ProcAddr:Pointer);
{***********************************************************************}
{ }
{ Désinstallation du géstionnaire de la BGP }
{ }
{ Sortie : Result = 0 : Désinstallation efféctuée avec succès }
{ = 1 : Le géstionnaire n'était pas installé }
{ = 2 : Les vecteurs d'intérruptions ont été }
{ détournés (désinstallation impossible) }
{ }
{***********************************************************************}
Function BGP_UnInstall:Byte;
Implementation
Var
ExitSave,
Int08Save, Int13Save, Int28Save:Pointer;
{***********************************************************************}
{ }
{ Déclarations des procédures/fonctions externes gérant la }
{ procédure d'arrière plan }
{ }
{ Pour de plus amples informations sur les déclarations de }
{ routines externes : }
{ }
{ Chapitre 23, "Edition de liens avec du code assembleur", }
{ page 283 du guide du programmeur Turbo PASCAL 7.0 }
{ }
{***********************************************************************}
Function BGP_Installed:Boolean;External;
Function BGP_VectorsEqual:Boolean;External;
Procedure BGP_Enable;External;
Procedure BGP_Disable;External;
Function BGP_Enabled:Boolean;External;
Procedure BGP_Install(Ticks:Word;ProcAddr:Pointer);External;
Function BGP_UnInstall:Byte;External;
{$L BGPH.OBJ}
{***********************************************************************}
{ }
{ Sauvegarde des adresses des vecteurs d'intérruptions qui }
{ seront détournés par BGP_Install }
{ }
{ Remarque importante : }
{ }
{ Si vous ne créez pas de procédure de sortie dans votre }
{ programme afin de désinstaller le géstionnaire, alors la }
{ procédure de sortie de cette unité est prévue pour le faire }
{ à votre place, en appelant BGP_UnInstall. }
{ }
{ Mais un simple appel à BGP_Uninstall peut ne pas suffir, car }
{ si vous comptez détournez les vecteurs 08h, 13h et/ou 28h }
{ AVANT un appel à BGP_Install, et que l'exécution de votre }
{ programme s'intérrompt brusquement suite à une erreur par }
{ exemple, alors la procédure de sortie restaurera les vecteurs }
{ que l'unité aura pris soin de sauvegarder. }
{ }
{***********************************************************************}
Procedure SaveIntVectors;Assembler;
Asm
MOV AX,3508H
INT 21H
MOV Int08Save.WORD[0],BX
MOV Int08Save.WORD[2],ES
MOV AL,13H
INT 21H
MOV Int13Save.WORD[0],BX
MOV Int13Save.WORD[2],ES
MOV AL,28H
INT 21H
MOV Int28Save.WORD[0],BX
MOV Int28Save.WORD[2],ES
End;
{***********************************************************************}
{ Restauration des adresses des vecteurs d'intérruptions }
{ d'origines }
{***********************************************************************}
Procedure RestoreIntVectors;Assembler;
Asm
PUSH DS
LDS DX,Int08Save
MOV AX,2508H
INT 21H
LDS DX,Int13Save
MOV AL,13H
INT 21H
LDS DX,Int28Save
MOV AL,28H
INT 21H
POP DS
End;
{***********************************************************************}
{ }
{ Procédure de sortie }
{ }
{ Dans cette unité, la création d'une procédure de sortie est }
{ impérative car elle permet, en l'occurence, de désinstaller }
{ le géstionnaire, et de ce fait, de restaurer les vecteurs d' }
{ intérruptions 08h, 13h et 28h préalablement détournés par ce }
{ dernier }
{ }
{ Pour de plus amples informations sur les procédures de }
{ sortie : }
{ }
{ Chapitre 20, "Contrôle de l'exécution des programmes", }
{ page 243 du guide du programmeur Turbo PASCAL 7.0 }
{ }
{***********************************************************************}
Procedure BGPH_ExitProc;Far;
Begin
ExitProc:=ExitSave;
BGP_Disable;
If BGP_Uninstall=2Then RestoreIntVectors
End;
{***********************************************************************}
{ Initialisation de l'unité }
{***********************************************************************}
Begin
ExitSave:=ExitProc;
ExitProc:=@BGPH_ExitProc;
SaveIntVectors
End. |
Partager