Programmieren - alles kontrollieren 4.935 Themen, 20.621 Beiträge

Assembler Bios-Aufrufe unter XP (unter C/Assembler)

Mdl / 1 Antworten / Flachansicht Nickles

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

bei Antwort benachrichtigen