Hallo Darthshoot,
Code: Alles auswählen
mov ah, 3ch
lea dx, File
xor cx, cx
int 21h ; Hier wurde eine Datei geöffnet, bzw. neu erstellt
xchg ax, bx
mov ah, 40h
lea dx, Data
mov cx, (offset Ende - offset Data)
int 21h ; Die Datei wird auf die HDD geschrieben
mov ah, 3eh ; Die Datei wird geschlossen
int 21h
; Hier müsste eine Abfrageschleife stehen die testet ob der Name der neu geschriebenen
; Datei schon in dem Verzeichnis des Laufwerks auftaucht, der Hintergrund ist folgender:
; wenn Du per Int oder auch per API Procedure den Befehl zum speichern erteilst wird
; dieser an den HDD Controller weitergereicht, dieser Übernimmt das speichern der
; Datei während das Programm schon fortgesetzt wird, was wiederum bedeutet das u.U.
; sich die zu speichernde Datei gerade erst im Cache der HDD befindet, und noch nicht
; ‚Von Platte’ ausgeführt werden kann …
mov ah, 4bh
mov al, 00h
lea dx, File
int 21h
Noch ein Problem:
der Aufruf 4bh des Interrupt 21 benötigt nicht nur den Dateinamen in DS:DX, er braucht ausserdem in ES:BX einen Zeiger auf eine Struktur die als ‚Programm Parameter Block’ bezeichnet wird. Ich konnte über diese Struktur noch keine näheren Angaben finden, aber ich vermute das sie Informationen über die Speicherverwendung des aufzurufenden Programms bereitstellen muss, da ich mit folgendem Experiment:
Code: Alles auswählen
org 0100
mov ah, 04b
mov al, 00
mov dx, offset _dingens
int 021
jnc exit
cmp ax, 1
jne X1
mov dx, offset falschefunktion
mov ah, 9
int 021
jmp exit
X1:
cmp ax, 2
jne X2
mov dx, offset falscherpfad
mov ah, 9
int 021
jmp exit
X2:
cmp ax, 8
jne X3
mov dx, offset speicher
mov ah, 9
int 021
jmp exit
X3:
cmp ax, 0a
jne X4
mov dx, offset environment
mov ah, 9
int 021
jmp exit
X4:
cmp ax, 0a
jne X5
mov dx, offset falscheraufruf
mov ah, 9
int 021
jmp exit
X5:
mov dx, offset unbekannt
mov ah, 9
int 021
exit:
mov ax, 04c00
int 021
_dingens: db 'fake.bat',0
falschefunktion: db ' falsche Funktion!$'
falscherpfad: db ' Datei oder Pfad nicht gefunden!$'
speicher: db '>>Memory Overflow<< $'
environment: db 'falscher Umgebungsblock!$'
falscheraufruf: db 'falscher Aufruf!$'
unbekannt: db 'unbekannter Fehler :-S$'
; Auftretendes Problem: Durch den fehlenden 'Programmparameterblock'
; (Zeiger in ES:BX soll auf diese Struktur zeigen), kommt es auch bei
; einem Sehr kleinen Programm zu einem Speicherüberlauf.
; das Windows Equivalent zu int 021 funtk. 04b ist die API Funktion: 'ShellExecute'
auch bei einem recht kleinen ‚Programm’ (fake.bat):
ständig den Fehler ‚Speicherüberlauf’ erhielt. Eine Alternative zu dem Int 21 Aufruf 4bh währe der API Call ‚ShellExecute’.
Code: Alles auswählen
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib
.data
Titel db 'Prozess aufruf',0
Msg db 'Klicken Sie auf OK um den Prozess zu starten !',10,13,' 2006 by H.V.Viehof',0
szOpen db "open",0
szDatei db "fake.bat",0
.code
start:
invoke MessageBox, 0, addr Msg, addr Titel, MB_YESNOCANCEL+MB_ICONEXCLAMATION
cmp eax,2
jz start
cmp eax,7
jz xt
invoke ShellExecute, NULL, addr szOpen, addr szDatei, NULL, NULL, SW_SHOWDEFAULT
jmp start
xt: invoke ExitProcess, 0
end start