x86 64 - Sådan får du tastaturet afbrudt fra Windows IDT med HalGetInterruptVector

Indlæg af Hanne Mølgaard Plasc

Problem



jeg forsøger at kæbe Windows-tastaturafbrydelse med HalGetInterruptVector dog BSOD, når du ringer til HalGetInterruptVector og jeg kantkroge tastaturafbrydelse i Windows IDT. Se en del af min kildekode:


Start:
PUSH 0
MOV RAX,RSP
PUSH RAX
PUSH RAX
PUSH 1
PUSH 1
PUSH 0
PUSH 1
CALL HalGetInterruptVector ; Here BSOD happens
AND RAX,0FFH
MOV [IRQ1],RAX


Hvorfor sker min Windows 8 x64 Blue Screen Of Death med min kode? Hvor er der galt?

Bedste reference


HalGetInterruptVector er en forældet funktion, og det er tilsyneladende ikke understøttet i 64-bit builder af Windows: [4] [5]



  Denne grænseflade understøttes ikke på 64-bit Windows.
  Forsøger du at havne nogle gamle NT4-stil driver til 64-bit platform?
  Det er umuligt - du skal omskrive det.






Jeg er ikke bekendt med HalGetInterruptVector, men hvis din hensigt er at køre på en bestemt IRQ, er det måske ikke en god idé.

Selv hvis man antager, at funktionen tager i betragtning IOAPIC vs 8059A mode, er mange tastaturer ikke PS/2 (denne grænseflade er emuleret via SMM though) men er USB.

Det betyder, at IRQ de genererer er variabel og kan endda være en MSI. [7] [8]


Et bedre alternativ er at koble på det rigtige abstraktionsniveau: HID-klassen. [9]