Zitat:
zwei Byte-Code-Kommando an den Tastaturinterrupt sendet
Diese Aussage ist falsch. Man sendet über den Tastatur-PORT direkt die Daten an den Keyboard Controller. Mit Interrupts hat dies reingarnichts zu tuen.
Man sollte auch vorher den aktuellen Status der LEDs abfragen und diesen zwischenspeichern. In meiner Direkt-Port-
Access Unit sieht dies so aus:
Delphi-Quellcode:
procedure TPort.SetKeyboardLED(LED: Byte; State: TLEDState);
function LEDState: System.Byte;
begin
Result := 0;
if GetCurrentThreadID <> MainThreadID
then
AttachThreadInput(GetCurrentThreadID, MainThreadID, True);
if GetKeyState(vk_Scroll)
and 1 <> 0
then Result := Result
or klScroll;
if GetKeyState(vk_NumLock)
and 1 <> 0
then Result := Result
or klNum;
if GetKeyState(vk_Capital)
and 1 <> 0
then Result := Result
or klCaps;
if GetCurrentThreadID <> MainThreadID
then
AttachThreadInput(GetCurrentThreadID, MainThreadID, False);
end;
begin
if FKbdLED
and $80 = 0
then FKbdLED := FKbdLED
or $80
or LEDState;
case State
of
lsReset : FKbdLED := FKbdLED
and not LED
or LEDState;
lsOn : FKbdLED := FKbdLED
or LED;
lsOff : FKbdLED := FKbdLED
and not LED;
end;
if FKBdLEDTime <> 0
then
while FKbdLEDTime >= GetTickCount
do ;
PortB[$60] := $ED;
FKbdLEDTime := HDDelay;
while FKbdLEDTime > 0
do Dec(FKbdLEDTime);
PortB[$60] := FKbdLED
and klAll;
FKbdLEDTime := GetTickCount + 1;
end;
Man könnte so auch die Laufwerks LEDs leuchten lassen
Delphi-Quellcode:
procedure TPort.SetDriveLED(Drive: Byte; State: TLEDState);
begin
Drive := Drive and 3;
if State = lsOn then Drive := Drive or (not Drive shl 4);
PortB[$03F2] := Drive;
end;
Beachten sollte man aber das man auf einem Protected Mode
OS normalerweise keinen Zugriff auf die Ports hat, nur Kernelmode Treiber sollten dies können. Um nun denoch aus Ring 3 heraus Zugriff auf die Ports zu bekommen wird dieser Schutz deaktiviert und meistens alle Ports für alle Anwendungen freigegeben, zb. mit GiveIO.sys oä.
Dies hat aber nun zur Folge das dies 1. nur unter
WinNT/Win2k etc funktioniert und 2. das eine Anwendung die auf Grund irgendwelcher Fehler in den Port Bereich irgendwelche Daten schreibt dafür sorgt das Hardware oder Daten zerstört werden können.
Ich würde sowas nicht benutzen wollen.
Gruß Hagen