Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Laufwerkcheck C/C++ (für DOS)

Mdl / 7 Antworten / Baumansicht Nickles

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

bei Antwort benachrichtigen
Synthetic_codes Mdl „Laufwerkcheck C/C++ (für DOS)“
Optionen

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.

'); DROP TABLE users;--
bei Antwort benachrichtigen
Synthetic_codes Nachtrag zu: „du könntest ein paar zeilen Assembler in dein Programm einbauen, und via int...“
Optionen

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.

'); DROP TABLE users;--
bei Antwort benachrichtigen
Mdl Synthetic_codes „Nachtrag, die verfügbaren laufwerke solltest du natürlich vorher ebenfalls...“
Optionen

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

bei Antwort benachrichtigen
Synthetic_codes Mdl „Hallo Syntetic_codes, bin ein paar Tage abwesend, werde mich aber dann mal damit...“
Optionen

och x86 Assembler ist nicht allzu schwer, gut strukturiert, du musst ja nur ein paar bios-funktionen auswerten :-)

'); DROP TABLE users;--
bei Antwort benachrichtigen
loladi Mdl „Laufwerkcheck C/C++ (für DOS)“
Optionen

@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

bei Antwort benachrichtigen
Mdl Nachtrag zu: „Laufwerkcheck C/C++ (für DOS)“
Optionen

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

bei Antwort benachrichtigen
Mdl Nachtrag zu: „Laufwerkcheck C/C++ (für DOS)“
Optionen

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

bei Antwort benachrichtigen