Возникла проблема при перехвате и обработке int 0x20. Ниже код (исполняется в драйвере). На Celeron, Celeron 2 никаких проблем не возникало, а вот на машинках поновее перехват выполняется, но при обращении к HDD, например, чтение ранее не открытого файла, система виснет. Всё это планируется для вывода звука через PCSpeaker (если проблема не решится, я и разоряться не стану).
proc hook mov bx,-1 .waiting: mov al,0 ;фиксация значения счетчика в канале 0 out 43h,al ;порт 43h: управляющий регистр таймера in al,40h ;младший байт счетчика mov ah,al ;в АН in al,40h ;старший байт счетчика в AL xchg ah,al ;поменять их местами cmp ax,bx mov bx,ax jb .waiting
cli sidt [idtreg] mov eax,[idt] lea ecx,[eax+32*8] ;0x8000B200+32*8 mov ax,[ecx+6] ;старший word смещения (биты 31-16 старшего dword-а шлюза) shl eax, 16 mov ax,[ecx] ;младший word смещения(биты 15-0 младшего dword-а шлюза) xor ebx,ebx mov bx,[ecx+2] ;bx - селектор сегмента кода, где находится код обработчика mov [oldselector],bx mov [oldhandler],eax
mov eax,new_handler mov [ecx],ax shr eax,16 mov [ecx+6],ax mov ax,cs mov [ecx+2],ax
mov al,00110100b ;1193181/12000 out 43h,al mov al,100 ;новая частота out 40h,al xor al,al out 40h,al sti ret endp
align 16 new_handler: pushfd cmp [ticker],120 je .jmp_old push ax mov al,0x20 ;EOI to PIC out 0x20,al pop ax inc [ticker] popfd iretd .jmp_old: mov [ticker],0 popfd jmp dword [oldhandler]
oldhandler rd 1 oldselector rw 1 idtreg: rw 1 idt rd 1
|