Драйверы устройств в системе Windows



Прерывания при стандартном режиме работы системы Windows - часть 4


     int 21h       ; Установить нашу программу ISR

     pop ds

     }

}

HANDLE AllocIntReflector(int iVector, FARPROC lpfnCallback)

{

     DWORD dwDosMem ;

     LPSTR lpLowRMISR ;

     DWORD lpfnRMCallback ;

     _RMCS FAR *lpSaveRegs ;

/* Распределить память DOS для программы обслуживания прерывания ISR,

*работающей в реальном режиме */

     dwDosMem = GlobalDosAlloc(16 + sizeof (int) + sizeof (_RMCS) ;

     if (dwDosMem == 0)

     return 0;

     lpLowRMISR = (LPSTR) MAKELONG(0,LOWORD(dwDosMem)) ;

     lpSaveRegs = (_RMCS FAR *) (&lpLowRMISR[16]) ;

/* Распределить   обратный  вызов (callback), работающий  в  реальном

* режиме */

     lpfnRMCallback =

DPMI_AllocateRMCallback((FARPROC)lpfnCallback,

lpSaveRegs)

;

     if (HIWORD((DWORD)lpfnRMCallback == 0)

     {

     GlobalDosFree(LOWORD(dwDosMem)) ;

     return 0;

     }

     /* Сгенерировать код в нижних адресах памяти (только 6 байтов)*/

     lpLowRMISR[0] = 0x9A ; /* Вызов указателя на FAR */

     *((DWORD FAR *)&(lpLowRMISR[1])) = lpfnRMCallback ;

     lpLowRMISR[5] = 0xCF ;   /*IRET */

     *((int FAR *)&(lpLowRMISR[6])) = iVector ;

     /* Установить связь с вектором прерываний реального режима */

     DPMI_SetRMVector(iVector,MAKELONG(0,HIWORD(dwDosMem))) ;

     return (HANDLE) LOWORD(dwDosMem) ;

     /* возврат обработчика-отражателя */

}

void FreeIntReflector(HANDLE hReflector)

{

     LPSTR lpLowRMISR ;

     DWORD lpfnRMCallback ;

     /* Получить адрес нижнего ISR в защищенном режиме */

     lpLowRMISR = (LPSTR)MAKELONG(0,(WORD)hReflector) ;

     /* Следует убедиться, что это отражатель */

     if ((lpLowRMISR[0] != 0x9A) || (lpLowRMISR[5] != 0xCF))

     return ;   /* выход, если не отражатель */

    /* Выбрать адрес обратного вызова и освободить обратный вызов */

     lpfnRMCallback = *((DWORD FAR *)&((lpLowRMISR[1])) ;

     DPMI_FreeRMCallback(lpfnRMCallback) ;




Содержание  Назад  Вперед