[ Pobierz całość w formacie PDF ]

#endif
#ifdef __COMPACT__
D:\KISIU\PDFy\Chudy\Ksią\ki\Hack_Wars_Tom_1\Hack_Wars_Tom_1\06.doc 281
282 Hack Wars. Tom 1. Na tropie hakerów
#define BLOCKSIZE (64L * 1024L)
#endif
#ifdef __LARGE__
#define BLOCKSIZE (64L * 1024L)
#endif
char XMS_init()
{
/*
zwraca 0, gdy istnieje pamięć XMS,
1 - gdy nie istnieje
2 - je\eli nie mo\na zaalokować bufora wymiany danych w
pamięci konwencjonalnej
*/
unsigned char status;
_AX=0x4300;
geninterrupt(0x2F);
status = _AL;
if(status==0x80)
{
GetXMSEntry();
XMSBuf = (char far *) farmalloc(BLOCKSIZE);
if (XMSBuf == NULL)
return 2;
return 0;
}
return 1;
}
void GetXMSEntry(void)
{
/*
Ustawia XMSFunc na punkt wejścia mened\era XMS
co umo\liwi pózniejsze wywołania
*/
_AX=0x4310;
geninterrupt(0x2F);
XMSFunc= (void (far *)(void)) MK_FP(_ES,_BX);
}
Po potwierdzeniu obecności pamięci rozszerzonej w systemie kolejna funkcja mo\e
ustalić, jaka jej ilość jest dostępna:
void XMSSize(int *kbAvail, int *largestAvail)
{
/*
Zwraca wielkość dostępnej pamięci oraz największego
dostępnego bloku (w kilobajtach)
*/
_AH=8;
(*XMSFunc)();
*largestAvail=_DX;
*kbAvail=_AX;
}
Kolejna funkcja alokuje blok pamięci rozszerzonej, w podobny sposób jak przy
alokacji pamięci konwencjonalnej:
282 D:\KISIU\PDFy\Chudy\Ksią\ki\Hack_Wars_Tom_1\Hack_Wars_Tom_1\06.doc
Rozdział 6. f& 283
f& Podstawy programowania dla hakerów
f&
f&
char AllocXMS(unsigned long numberBytes)
{
/*
Alokacja bloku pamięci XMS wielkości 'numberBytes'
zwraca 1, gdy zakończona poprawnie
0 w przypadku błędu
*/
_DX = (int)(numberBytes / 1024);
_AH = 9;
(*XMSFunc)();
if (_AX==0)
{
return 0;
}
XMSHandle=_DX;
return 1;
}
System DOS nie zwalnia zaalokowanej pamięci rozszerzonej automatycznie. Przed
zakończeniem program musi więc zadbać o  uwolnienie przyznanych mu wcześniej
bloków. Wykona to kolejna funkcja, zwalniająca blok pamięci zaalokowany
wcześniej przez funkcję AllocXMS():
void XMS_free(void)
{
/*
Zwolnij pamięć XMS
*/
_DX=XMSHandle;
_AH=0x0A;
(*XMSFunc)();
}
Kolejne dwie dłu\sze funkcje słu\ą do wymiany danych: jedna zapisuje dane do
pamięci rozszerzonej, druga kopiuje dane z pamięci rozszerzonej do pamięci
konwencjonalnej.
/*
Struktura XMSParms słu\y do wymiany danych pomiędzy pamięcią
trybu rzeczywistego, a XMS
*/
struct parmstruct
{
/*
rozmiar kopiowanego bloku w bajtach
*/
unsigned long blockLength;
/*
sourceHandle to uchwyt XMS obszaru zródłowego; 0 oznacza,
\e sourcePtr będzie wskaznikiem trybu rzeczywistego
(16:16); w pozostałych przypadkach sourcePtr jest
32-bitowym przesunięciem od początku obszaru XMS
określonego przez sourceHandle
*/
unsigned int sourceHandle;
far void *sourcePtr;
D:\KISIU\PDFy\Chudy\Ksią\ki\Hack_Wars_Tom_1\Hack_Wars_Tom_1\06.doc 283
284 Hack Wars. Tom 1. Na tropie hakerów
/*
destHandle to uchwyt XMS obszaru docelowego; 0 oznacza,
\e destPtr będzie wskaznikiem trybu rzeczywistego
(16:16); w pozostałych przypadkach destPtr jest
32-bitowym przesunięciem od początku obszaru XMS
określonego przez destHandle
*/
unsigned int destHandle;
far void *destPtr;
}
XMSParms;
char XMS_write(unsigned long loc, char far *val, unsigned length)
{
/*
Zaokrąglij długość do kolejnej wartości parzystej
*/
length += length % 2;
XMSParms.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 0;
}
return 1;
}
void *XMS_read(unsigned long loc,unsigned length)
{
/*
Zwraca wskaznik do danych
lub 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;
}
284 D:\KISIU\PDFy\Chudy\Ksią\ki\Hack_Wars_Tom_1\Hack_Wars_Tom_1\06.doc
Rozdział 6. f& 285
f& Podstawy programowania dla hakerów
f&
f&
Czas teraz połączyć przedstawione dotąd funkcje w jednym programie:
/* Sekwencyjna tabela rekordów zmiennej długości
w pamięci XMS */
#include
#include
#include
#include
#include
#define TRUE 1
#define FALSE 0
/*
BLOCKSIZE będzie rozmiarem bufora w pamięci konwencjonalnej,
przeznaczonego do wymiany danych z pamięcią XMS
(wielokrotność 1-kilobajtowej jednostki alokacji XMS)
*/
#ifdef __SMALL__
#define BLOCKSIZE (16L * 1024L)
#endif
#ifdef __MEDIUM__
#define BLOCKSIZE (16L * 1024L)
#endif
#ifdef __COMPACT__
#define BLOCKSIZE (64L * 1024L)
#endif
#ifdef __LARGE__
#define BLOCKSIZE (64L * 1024L)
#endif
/*
Struktura XMSParms słu\y do wymiany danych pomiędzy pamięcią
trybu rzeczywistego, a XMS
*/
struct parmstruct
{
/*
rozmiar kopiowanego bloku w bajtach
*/
unsigned long blockLength;
/*
sourceHandle to uchwyt XMS obszaru zródłowego; 0 oznacza,
\e sourcePtr będzie wskaznikiem trybu rzeczywistego
(16:16); w pozostałych przypadkach sourcePtr jest
32-bitowym przesunięciem od początku obszaru XMS
określonego przez sourceHandle
*/
unsigned int sourceHandle;
far void *sourcePtr;
/*
D:\KISIU\PDFy\Chudy\Ksią\ki\Hack_Wars_Tom_1\Hack_Wars_Tom_1\06.doc 285
286 Hack Wars. Tom 1. Na tropie hakerów
destHandle to uchwyt XMS obszaru docelowego; 0 oznacza,
\e destPtr będzie wskaznikiem trybu rzeczywistego
(16:16); w pozostałych przypadkach destPtr jest
32-bitowym przesunięciem od początku obszaru XMS
określonego przez destHandle
*/
unsigned int destHandle;
far void *destPtr;
}
XMSParms;
void far (*XMSFunc) (void); /* Posłu\y do wywołania mened\era XMS
(himem.sys) */
char GetBuf(void);
void GetXMSEntry(void);
char *XMSBuf; /* Bufor wymiany danych, w pamięci konwencjonalnej */
unsigned int XMSHandle; /* uchwyt do zaalokowanego bloku XMS */
char XMS_init()
{
/*
zwraca 0, gdy istnieje pamięć XMS,
1 - gdy nie istnieje
2 - je\eli nie mo\na zaalokować bufora wymiany danych w
pamięci konwencjonalnej
*/
unsigned char status;
_AX=0x4300;
geninterrupt(0x2F);
status = _AL;
if(status==0x80)
{
GetXMSEntry();
XMSBuf = (char far *) farmalloc(BLOCKSIZE);
if (XMSBuf == NULL)
return 2;
return 0;
}
return 1;
}
void GetXMSEntry(void)
{
/*
Ustawia XMSFunc na punkt wejścia mened\era XMS
co umo\liwi pózniejsze wywołania
*/
_AX=0x4310;
geninterrupt(0x2F);
XMSFunc= (void (far *)(void)) MK_FP(_ES,_BX);
}
void XMSSize(int *kbAvail, int *largestAvail)
{
/*
Zwraca wielkość dostępnej pamięci oraz największego
dostępnego bloku (w kilobajtach)
*/
286 D:\KISIU\PDFy\Chudy\Ksią\ki\Hack_Wars_Tom_1\Hack_Wars_Tom_1\06.doc
Rozdział 6. f& 287
f& Podstawy programowania dla hakerów
f&
f&
_AH=8;
(*XMSFunc)();
*largestAvail=_DX;
*kbAvail=_AX;
}
char AllocXMS(unsigned long numberBytes) [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • janekx82.keep.pl