Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#35

Re: KeyboardLED

  Alt 18. Okt 2005, 03:02
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
  Mit Zitat antworten Zitat