Habe ein Tool geschrieben, das sogar noch direkt unter MSDOS läuft, also nicht nur in einer DOS-Box (Borland C++ 5) und hänge da mit einer Prozedur etwas fest:
Die soll im Wesentlichen prüfen, ob ein Bestimmtes Laufwek, z.B. E: existiert und ob ein Medium eingelegt ist. Ersteres klappt mittels getdisk/setdisk prima, nur sobald ich diese Befehle auf ein Laufwerk anwende, das kein Medium eingelegt hat (z.B. Diskettenlaufwerk, CD-Laufwerk) erscheint (unter Windows) eine Aufforderung dies doch bitte zu tun.
Wie kann ich also checken, ob ein Medium eingelegt ist, ohne dass der Anwender interagieren muss?
Vielen Dank,
Mdl
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
du könntest ein paar zeilen Assembler in dein Programm einbauen, und via int 13h, Addresse 0x4C-0x4F, Funktion 0x01h den Status fürdas diskettenlaufwerk abfragen. Der Gleiche interrupt, an gleicher Addresse, nur mit Funktion 0x08h liefert dir selbige informationen für alle anderen Laufwerke.
Beachte bitte, dass diese informationen dann vom BIOS kommen, windows Xp sollte also den zugriff nicht anmonieren.
Nachtrag, die verfügbaren laufwerke solltest du natürlich vorher ebenfalls auslesen, die funktion dazu sollte sich afaik auch im int 13h befinden, mir sind nur addresse und funktion entfallen.
Hallo Syntetic_codes,
bin ein paar Tage abwesend, werde mich aber dann mal damit auseinandersetzen.
Ist schon Jahr(zent)e her, dass ich mit Assembler was gemacht habe und da noch am Commodore64...
Grüße,
Mdl
och x86 Assembler ist nicht allzu schwer, gut strukturiert, du musst ja nur ein paar bios-funktionen auswerten :-)
@Mdl
BIOS und DOS Interrupts können auch direkt in C aufgerufen werden.
siehe:
http://pcnews.at/_pdf/n670068.pdf
Hier ein netter Überblick über die 80x86 Interrupt Programmierung:
http://de.wikibooks.org/wiki/Interrupts_80x86
Wie Synthetic_codes bereits schrieb, kommt für Dich Interrupt 13 Funktion in Frage.
http://de.wikibooks.org/wiki/Interrupts_80x86/_INT_13#Funktion_1:_Status_lesen
Wieweit sich das mit Windows verträgt, kann ich Dir leider nicht sagen...
Gruss, Lothar
Hallo loladi,
danke für die Tipps und den PDF-Verweis.
Obwohl ich (neben Basic) mit Assembler als Programmiersprache angefangen habe bin ich da mehr als aus der Übung, sodass mir die Möglichkeit die Routinen über C anzusprechen sehr entgegegen kommt.
Und 'www.pcnews.at' scheint generell auch recht interessant zu sein...
Ich hoffe, ich komm am Wochenende dazu, das alles mal auszuprobieren...
Viele Grüße,
Mdl
Ok, mich jetzt doch endlich durchgerungen altes Neuland (Assembler) zu betreten...
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!!!
Was habe ich falsch gemacht?
Können vielleicht unter XP Interrupts nicht ausgelöst werden?
(Das Prg. ist eine Konsolenanwendung und sollte unter eine DOS-BOX von XP laufen können)
Viele Grüße,
Mdl