FATINFO

Diskussion zum Thema Programmierung unter DOS (Intel x86)
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: FATINFO

Beitrag von freecrac »

Passend zum Thema habe ich eine kleine Batchdatei wiedergefunden (ich vermute die ist von Herbert Kleebauer, ich bin mir allerdings nicht ganz sicher).

HDspace.BAT

Code: Alles auswählen

@echo off
if not (%1)==() goto DOIT
echo.
echo Fehler !!! Bitte Laufwerks-Buchstabe angeben.
echo Zum Beispeil: C[:] !
echo.
exit

:DOIT
if (%1)==(A:) set Drive=1
if (%1)==(B:) set Drive=2
if (%1)==(C:) set Drive=3
if (%1)==(D:) set Drive=4
if (%1)==(E:) set Drive=5
if (%1)==(F:) set Drive=6
if (%1)==(G:) set Drive=7
if (%1)==(H:) set Drive=8
if (%1)==(I:) set Drive=9
if (%1)==(J:) set Drive=a
if (%1)==(K:) set Drive=b
if (%1)==(L:) set Drive=c
if (%1)==(M:) set Drive=d
if (%1)==(N:) set Drive=e
if (%1)==(O:) set Drive=f
if (%1)==(P:) set Drive=10
if (%1)==(Q:) set Drive=11
if (%1)==(R:) set Drive=12
if (%1)==(S:) set Drive=13
if (%1)==(T:) set Drive=14
if (%1)==(U:) set Drive=15
if (%1)==(V:) set Drive=16
if (%1)==(W:) set Drive=17
if (%1)==(X:) set Drive=18
if (%1)==(Y:) set Drive=19
if (%1)==(Z:) set Drive=1a
if (%1)==(a:) set Drive=1
if (%1)==(b:) set Drive=2
if (%1)==(c:) set Drive=3
if (%1)==(d:) set Drive=4
if (%1)==(e:) set Drive=5
if (%1)==(f:) set Drive=6
if (%1)==(g:) set Drive=7
if (%1)==(h:) set Drive=8
if (%1)==(i:) set Drive=9
if (%1)==(j:) set Drive=a
if (%1)==(k:) set Drive=b
if (%1)==(l:) set Drive=c
if (%1)==(m:) set Drive=d
if (%1)==(n:) set Drive=e
if (%1)==(o:) set Drive=f
if (%1)==(p:) set Drive=10
if (%1)==(q:) set Drive=11
if (%1)==(r:) set Drive=12
if (%1)==(s:) set Drive=13
if (%1)==(t:) set Drive=14
if (%1)==(u:) set Drive=15
if (%1)==(v:) set Drive=16
if (%1)==(w:) set Drive=17
if (%1)==(x:) set Drive=18
if (%1)==(y:) set Drive=19
if (%1)==(z:) set Drive=1a
if (%1)==(A) set Drive=1
if (%1)==(B) set Drive=2
if (%1)==(C) set Drive=3
if (%1)==(D) set Drive=4
if (%1)==(E) set Drive=5
if (%1)==(F) set Drive=6
if (%1)==(G) set Drive=7
if (%1)==(H) set Drive=8
if (%1)==(I) set Drive=9
if (%1)==(J) set Drive=a
if (%1)==(K) set Drive=b
if (%1)==(L) set Drive=c
if (%1)==(M) set Drive=d
if (%1)==(N) set Drive=e
if (%1)==(O) set Drive=f
if (%1)==(P) set Drive=10
if (%1)==(Q) set Drive=11
if (%1)==(R) set Drive=12
if (%1)==(S) set Drive=13
if (%1)==(T) set Drive=14
if (%1)==(U) set Drive=15
if (%1)==(V) set Drive=16
if (%1)==(W) set Drive=17
if (%1)==(X) set Drive=18
if (%1)==(Y) set Drive=19
if (%1)==(Z) set Drive=1a
if (%1)==(a) set Drive=1
if (%1)==(b) set Drive=2
if (%1)==(c) set Drive=3
if (%1)==(d) set Drive=4
if (%1)==(e) set Drive=5
if (%1)==(f) set Drive=6
if (%1)==(g) set Drive=7
if (%1)==(h) set Drive=8
if (%1)==(i) set Drive=9
if (%1)==(j) set Drive=a
if (%1)==(k) set Drive=b
if (%1)==(l) set Drive=c
if (%1)==(m) set Drive=d
if (%1)==(n) set Drive=e
if (%1)==(o) set Drive=f
if (%1)==(p) set Drive=10
if (%1)==(q) set Drive=11
if (%1)==(r) set Drive=12
if (%1)==(s) set Drive=13
if (%1)==(t) set Drive=14
if (%1)==(u) set Drive=15
if (%1)==(v) set Drive=16
if (%1)==(w) set Drive=17
if (%1)==(x) set Drive=18
if (%1)==(y) set Drive=19
if (%1)==(z) set Drive=1a
echo ecs:100>tmp.deb
echo 8C C8 8E D8 8E C0 B2 %Drive% B4 36 CD 21 3D FF FF 74>>tmp.deb
echo ecs:110>>tmp.deb
echo 59 66 F7 E3 66 F7 E1 BF 00 02 B1 0A 66 BB 00 CA>>tmp.deb
echo ecs:120>>tmp.deb
echo 9A 3B 66 31 D2 66 F7 F3 04 30 66 89 D6 88 05 47>>tmp.deb
echo ecs:130>>tmp.deb
echo 66 89 D8 66 BB 0A 00 00 00 66 31 D2 66 F7 F3 66>>tmp.deb
echo ecs:140>>tmp.deb
echo 89 C3 66 89 F0 FE C9 75 D9 B9 0B 00 BE FF 01 BF>>tmp.deb
echo ecs:150>>tmp.deb
echo 00 02 49 46 83 F9 01 74 05 80 3C 30 74 F4 83 F9>>tmp.deb
echo ecs:160>>tmp.deb
echo 0A 74 07 89 CA FC F3 A4 89 D1 31 DB 3D FF FF 75>>tmp.deb
echo ecs:170>>tmp.deb
echo 02 31 C9>>tmp.deb
echo g=cs:100 173>>tmp.deb
echo n space.tmp>>tmp.deb
echo w cs:200>>tmp.deb
echo q>>tmp.deb
debug <tmp.deb >nul
del tmp.deb
echo -Bytes auf Laufwerk %1>>space.tmp
type space.tmp
del space.tmp
Dirk
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: FATINFO

Beitrag von oDOSseus »

@freecrac
Also FI_BETA.ZIP is die neueste version. Wenn du die runtergeladen hast, bist du auf dem neuesten Stand
Das ist wirklich eine interessante Batch-Datei. An ein Problem so heranzugehen, habe ich echt noch nie gesehen.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: FATINFO

Beitrag von freecrac »

oDOSseus hat geschrieben:@freecrac
Also FI_BETA.ZIP is die neueste version. Wenn du die runtergeladen hast, bist du auf dem neuesten Stand
Ok.
Das ist wirklich eine interessante Batch-Datei. An ein Problem so heranzugehen, habe ich echt noch nie gesehen.
Ich vermute du hast es erkannt was dort gemacht wird. Für den Fall das es jedoch einer nicht auf Anhieb erkennen kann erkläre ich es mal ganz grob:

HDspace.BAT
In der Batchdatei befinden sich neben den bekannten Batch-Befehlen ausserdem verschiedene x86-Opcodes in hexadezimaler Form.
Zusätzlich befinden sich dort Debug-Befehle. Beides zusammen wird mit dem Batch-Befehl "echo" ausgegeben und diese Ausgabe wird
dabei in eine Text-Datei(tmp.deb) umgeleitet. Nachdem in dieser "tmp.deb" alles eingetragen wurde, wird Debug gestartet und beim
Starten wird die "tmp.deb" mit übergeben, so das Debug die in der "tmp.deb" eingetragenen Debug-Befehle ausführt und damit die
Opcodes in den freien Ram-Speicher für uns einträgt. Danach werden die Opcodes im Speicher innerhalb von Debug ausgeführt.
Dabei wird der freie Platz des angegebenen Laufwerks ermittelt und diesen Wert wird an eine bestimmte Speicherstelle im RAM
abgelegt. Danach wird dieser Wert in eine neue Datei(space.tmp) geschrieben. Debug wird nun beendet und der Inhalt der Datei
"space.tmp" wird am Bildschirm ausgegeben.

Umleitung:
Das erste "echo"-Zeile die umgleitet wird beinhaltet: "ecs:100>tmp.deb" und damit wird eine neue Datei mit dem Namen: "tmp.deb"
angelegt die zunächst diesen Inhalt bekommt: "ecs:100". Mit den nun folgenden "echo"-Zeilen bspw. mit "Byte Byte>>tmp.deb" werden
weitere Einträge in der "tmp.deb" zeilenweise angehängt. Debug nimmt nun die Einträge zeilenweise entgegen und führt die darin
enthaltenen Befehle so aus, als wenn sie innerhalb von Debug eingetippt werden.

Quellen:
Eine Erklärung für Umleitungen und Pipes findet man hier: http://www.o-bizz.de/qbtuts/omastut/kap23.htm
Die verwendeten Debug-Befehle findet man hier erklärt: http://www.armory.com/~rstevew/Public/T ... anual.html
Eine Tabelle der verwendeten Opcodes findet man hier: http://ref.x86asm.net/coder32.html

Dirk
Antworten