Vor einiger Zeit habe ich schon mal ein Posting gestartet, das sich aber im Wesentlichen auf DOS bezogen hat.
(siehe 'Laufwerkcheck C/C++ (für DOS)')
Jetzt bräuchte ich einen Tipp für XP...
Wie kann ich einen Interrupt unter XP bewerkstelligen?
Geht das über Umwege?
Z.B. eigene Funtktion ruft OS-Funktion auf und die löst letztlich einen BIOS-Interrupt aus?
Auf irgendeiner Ebene muss das Betriebssystem ja auf die Hardware zugreifen.
Hier meine fehlgeschlagene Vorgehensweise:
Ich benutze den C++Builder und habe festgestellt, dass es dort (zumindest ab Version 6) diese _int86()-Funktionen in DOS.h nicht mehr gibt. Habe mit GREP gesucht, aber auch in den anderen Header-Dateien nichts gefunden.
Aber es gibt den Befehl asm, __asm, mit dem Assemblercode direkt eingebunden werden kann.
Unter Zuhilfenahme der Wiki-Dokumentation-Info
Interrupts 80x86/ INT 13
Funktion 1: Status lesen
AH=1 Status lesen
DL=Laufwerknummer
Ausgabe: CY-Flag zeigt Fehler an, AH = Fehler-Code
habe ich folgendes codiert:
bool disk_available; {
BYTE dev=(BYTE)disk; // z.B. 0 für Laufwerk 0 (= A:)
char reg_ah;
__asm {
mov ah, 0x01
mov dl, dev
int 0x13 // !! Zugriffsverletzung
mov reg_ah, ah
}
disk_available=(reg_ah==0);
}
(Der Code sollte die boolsche Variable disk_available mit true initialisieren, wenn das Laufwerk A: vorhanden ist, sonst eben mit false.)
!! Wird der Interrupt aufgerufen erhalte ich sofort eine Zugriffsverletzung!!!
Ich denke mal, dass XP's Schutzmechanismus dies nicht zulässt...
Was also tun?
Viele Grüße,
Mdl
Programmieren - alles kontrollieren 4.938 Themen, 20.667 Beiträge
Hardwarezugriffe sind unter NT-Systemen nur über Treiber möglich.
Wobei es aber doch sicher auch eine andere offizielle Möglichlkeit geben sollte um zu ermitteln ob das System ein Disketten-LW hat. Scheint mir übrigens auch unglücklich nur auf LW A zu prüfen...
Gruß
Borlander