[ Pobierz całość w formacie PDF ]
.sourceHandle=0;XMSParms.sourcePtr=val;XMSParms.destHandle=XMSHandle;XMSParms.destPtr=(void far *) (loc);XMSParms.blockLength=length; /* Musi byæ liczb¹ parzyst¹! */_SI = FP_OFF(&XMSParms);_AH=0x0B;(*XMSFunc)();if (_AX==0){return FALSE;}return TRUE;}void *XMS_read(unsigned long loc,unsigned length){/*Zwraca wskaŸnik do danychlub NULL w przypadku b³êdu*//*Zaokr¹glij d³ugoœæ do kolejnej wartoœci parzystej*/length += length % 2;XMSParms.sourceHandle=XMSHandle;XMSParms.sourcePtr=(void far *) (loc);XMSParms.destHandle=0;XMSParms.destPtr=XMSBuf;XMSParms.blockLength=length; /* Musi byæ liczb¹ parzyst¹ */_SI=FP_OFF(&XMSParms);_AH=0x0B;(*XMSFunc)();if (_AX==0){return NULL;}return XMSBuf;}/*Przyk³adowy programZapisuje ci¹gi ró¿nej d³ugoœcido pojedycznego bloku XMS(EMB)i odczytuje je*/int main(){int kbAvail,largestAvail;char buffer[80];char *p;long pos;long end;if (XMS_init() == 0)printf("Pamiêæ XMS dostêpna.\n");else{printf("Pamiêæ XMS nie jest dostêpna\n");return(1);}XMSSize(&kbAvail,&largestAvail);printf("Wielkoœæ dostêpnej pamiêci XMS: %d; Largest block:å %dK\n",kbAvail,largestAvail);if (!AllocXMS(2000 * 1024L))return(1);pos = 0;do{p = fgets(buffer,1000,stdin);if (p != NULL){XMS_write(pos,buffer,strlen(buffer) + 1);pos += strlen(buffer) + 1;}}while(p != NULL);end = pos;pos = 0;do{memcpy(buffer,XMS_read(pos,100),70);printf("%s",buffer);pos += strlen(buffer) + 1;}while(pos < end);/*Zwolnienie pamiêci XMS jest BARDZO wa¿ne!*/XMS_free();return 0;}Tworzenie programów TSROstatnim tematem w naszym omówieniu podstaw jêzyka C, maj¹cym zarazemszczególne znaczenie dla zagadnieñ zabezpieczeñ, s¹ wszechstronne programyrezydentne, okreœlane równie¿ skrótem TSR (terminate and stay resident, zakoñczi pozostañ w pamiêci).Programy takie pozostaj¹ aktywne w pamiêci, w trakciegdy „na pierwszym planie” pracuj¹ inne programy.Tworzenie programówrezydentnych to ulubione zajêcie wielu programistów i hakerów.Trudnoœæ w tworzeniu programów TSR wynika z ograniczeñ DOS-u, który nie jestwielozadaniowym systemem operacyjnym i nie wspó³pracuje dobrze z kodemwielow¹tkowym, przede wszystkim gdy pojawiaj¹ siê wzajemne wywo³ania funkcjisystemowych (przerwañ).Teoria programów rezydentnych jest doœæ prosta.Programtaki koñczy pracê funkcj¹ DOS-u keep (przerwanie 27h), a nie przy u¿yciustandardowej funkcji terminate.Zapewnia to zarezerwowanie w pamiêci obszaruwykorzystywanego przez program.Nie jest to skomplikowane, koniecznie trzebajednak podaæ, jaka iloœæ pamiêci ma zostaæ zarezerwowana.G³Ã³wnym Ÿród³em problemów jest brak mo¿liwoœci korzystania z wywo³añ funkcjiDOS-u od momentu przyjêcia przez programu statusu programu rezydentnego.Poni¿ej przedstawiamy kilka podstawowych zasad, których przestrzeganie pomo¿eunikn¹æ problemów z programami TSR.Unikanie wywo³añ funkcji DOS-u.Monitorowanie znacznika zajêtoœci DOS-u (busy flag).Gdy ma on wartoœæniezerow¹, oznacza to, ¿e DOS wykonuje w³aœnie funkcjê 21h i nie mo¿namu przeszkadzaæ!Monitorowanie przerwania 28h.Sygnalizuje ono, ¿e DOS jest zajêty oczekiwaniemna dane wejœciowe z konsoli.W tym czasie mo¿na wykonywaæ ró¿ne operacje bezwzglêdu na stan znacznika zajêtoœci.Sprawdzanie, czy program jest ju¿ uruchomiony, aby unikn¹æ jego wielokrotnego³adowania do pamiêci.Nie wolno zapominaæ, ¿e równie¿ inne programy TSR mog¹ przechwytywaæprzerwania.Konieczne jest wiêc tworzenie „³añcucha” — po wywo³aniu w³asnejfunkcji wywo³ujemy funkcjê okreœlon¹ wektorem zastanym przy uruchamianiuprogramu.Program TSR musi korzystaæ z w³asnego stosu, a nie stosu uruchomionego procesu.Programy TSR nale¿y kompilowaæ, wybieraj¹c model pamiêci small i wy³¹czaj¹csprawdzanie stosu.Po przejêciu kontroli program TSR musi poinformowaæ DOS o zmianie procesuaktywnego.Przedstawione poni¿ej trzy modu³y kodu stanowi¹ kompletny program rezydentny
[ Pobierz całość w formacie PDF ]