8086 Assembler (MS-DOS):
Funktion 71 des INT 21H • Lange Dateinamen (LFN)

Die Funktion 71 mit ihren vielen Unterfunktionen betrifft die Unterstützung der langen Datei- und Verzeichnisnamen (LFN=Long File Name).

Beim Aufruf wird in AH die Funktionsnummer 71h mitgegeben. In AL steht eine Unterfunktionsnummer. Diese ist identisch zur Funktionsnummer, die sie ersetzt. Beispielsweise ersetzt der Aufruf mit AX=714Eh die Funktion, die vorher mit AH=4Eh aufgerufen wurde.

Die Funktion 71h wurde ab Windows 95 benutzt. Eine Beschreibung der Funktion wurde von Microsoft offiziell vermutlich nicht veröffentlicht. Die Funktionen wurden jedoch „erforscht”.

Weitere Informationen waren um 2004 zu finden in Ralf Brown's Interrupt List Indexed HTML Version - Release 61.

Hinweis zur Fehlermeldung: Allen hier genannten Funktionsaufrufen ist gemeinsam, das sie durch das gesetzte Carryflag das Auftreten eines Fehlers zurückmelden. Der Fehlercode steht in AX. Falls der Funktionsaufruf nicht unterstützt wird, lautet der Fehlercode 7100h.

Hinweis zum Aufruf aller hier aufgeführten Funktionen: Es wird empfohlen, vor dem Aufruf das Carry-Flag zu setzen. Dadurch soll erreicht werden, dass bei den älteren MS-DOS-Versionen im Fehlerfall bei Rückkehr aus der Funktion das Carry-Flag gesetzt ist. Gemeint sind die älteren MS-DOS-Versionen, die die Aufrufe der hier aufgeführten Funktionen noch nicht unterstützen.

NameBeschreibungRegister vor dem AufrufRegister nach dem Aufruf.
Siehe Hinweis oberhalb
zur Fehlermeldung.
Create DirectoryErstellt ein VerzeichnisAX=7139h
DS:DX=Zeiger auf Verzeichnisnamen (ASCIIZ)
Fehlerrückmeldung.
03h: Pfad nicht gefunden
50h: Eintrag existiert
Remove directoryLöscht ein VerzeichnisAX=713Ah
DS:DX=Zeiger auf Verzeichnisnamen (ASCIIZ)
Fehlerrückmeldung.
03h: Pfad nicht gefunden
Change directoryWechselt in ein Verzeichnis auf dem aktuellen LaufwerkAX=713Bh
DS:DX=Zeiger auf Verzeichnisnamen (ASCIIZ). Es sind relative und absolute Pfadangaben wie „..” und „\” zulässig.
Fehlerrückmeldung.
03h: Pfad nicht gefunden
Delete file/directoryLöscht Datei(en) / VerzeichnisAX=7141h
DS:DX=Name der zu löschenden Datei
SI=Joker- und Attribut-Flag
Falls SI=1 dann sind „*” und „?” im Namen erlaubt sowie
CL=mögliche Attribute und
CH=erforderliche Attribute
Fehlerrückmeldung
Get/set file attributesDateiattribute lesen/schreibenAX=7143h
DS:DX=Zeiger Auf Dateinamen (ASCIIZ)
BL=Aktion, Inhalt unterhalb
CX: Zeit im DOS-Format
DI: Datum im DOS-Format

Fehlerrückmeldung
Inhalt von BL. Datum und Zeit werden hier im DOS-Format (CX=Zeit, DI=Datum) übergeben.
  • 0 = lesen nach CX
  • 1 = schreiben aus CX
  • 2 = lade AX:DX mit physikalischer Größe einer komprimierten Datei
  • 3 = schreibe neues Änderungsdatum
  • 4 = lese letztes Änderungsdatum
  • 5 = schreibe neues Zugriffsdatum
  • 6 = lese letztes Zugriffsdatum
  • 7 = schreibe neues Erstellungsdatum
  • 8 = Lies Erstellungsdatum
Get current directoryErmittelt das aktuelle VerzeichnisAX=7147h
DL = Laufwerksnummer (00h = aktuelles, 01h = A:, usw.)
DS:SI=Zeiger auf Feld für Verzeichnisnamen (ASCIIZ)
Fehlerrückmeldung
Der zurückgemeldete Pfadname beinhaltet nicht den Laufwerksbuchstaben mit dem nachfolgenden Doppelpunkt und Backslash. Es wird nicht notwendig die lange Version des Pfadnamens gemeldet, sondern es kann ein Mischung aus kurzen und langen Pfadnamen gemeldet werden.
Find first Startet eine Verzeichnissuche

Beispielprogramm für die Funktionen 714Eh und 714Fh sowie zur Anzeige von Attribut, Änderungsdatum und Dateilänge.

AX=714Eh
CL=mögliche Attribute (Siehe Suchsatz DWORD bei Offset 0, Bits 1 bis 4 und 6)
CH=erforderliche Attribute (Siehe Suchsatz DWORD bei Offset 0, Bits 0 bis 6)

SI=Datumsformat
(0: Neues 64-Bit-Format, 1: Altes DOS-Format)

DS:DX=Zeiger auf Suchmaske (ASCIIZ),* oder *.* sucht alles.
ES:DI=Zeiger auf Suchsatz
Suchsatz bei ES:DI gefüllt
AX=Such-Handle
CX=Unicode-Konvertierungs-Flags

Fehlerrückmeldung.
02h: Datei nicht gefunden
03h: Pfad nicht gefunden
Find next Setzt eine Verzeichnissuche fort AX=714Fh
BX=Such-Handle (stammt von "Find first")
SI=Datumsformat (0: Neues 64-Bit-Format, 1: Altes DOS-Format)
ES:DI=Zeiger auf Suchsatz
Suchsatz bei ES:DI gefüllt
CX=Unicode-Konvertierungs-Flags

Fehlerrückmeldung.
12h: Keine weiteren Dateien
Format des Suchsatzes für die Funktionen „Find first” (714Eh) und „Find next” (714Fh)
OffsetGrößeBeschreibung
00h DWORD Dateiattribute:
Bit
8 = temporäre Datei
7 = (unterschiedliche Bedeutung bei Novel NetWare, Novel DOS und Open DOS)
6 = (unbenutzt)
5 = Archiv
4 = Verzeichnis
3 = Laufwerksname
2 = System
1 = Versteckt
0 = Nur lesen
Bits 3 und 4 schließen einander aus. Es kann nur eines oder keines von beiden gesetzt sein. Nur bei einer einzigen Datei im Stammverzeichnis darf Bit 3 gesetzt sein.
04h QWORD Erstellungszeitpunkt (Anzahl der 100ns-Intervalle seit dem 1.1.1601)
0Ch QWORD Datum und Zeit letzter Zugriff
14h QWORD Datum und Zeit letzte Änderung
1ChDWORD
DWORD
Dateigröße (obere untere 32 Bit!)
24h 8 Bytes Reserviert
2Ch 260 Bytes Langer Dateiname (ASCIIZ)
130h 14 Bytes Kurzer Dateiname (ASCIIZ)
Rename file Benennt eine Datei um. Die Verzeichnisangaben (falls gemacht) können unterschiedlich sein, müssen sich aber auf der gleichen Platte befinden. AX=7156h
DS:DX=Alter Name (ASCIIZ)
ES:SI=Neuer Name (ASCIIZ)
Fehlerrückmeldung.
Truename (Expand Filename) Liefert den vollständigen Pfadnamen einer Datei (kanonischer Dateiname) AX=7160h
CL=Modus
  • 0: keine Konvertierung von kurzen Namen in lange oder umgekehrt
  • 1: Ergebnis enthält nur kurze Namen
  • 2: Ergebnis enthält nur lange Namen
CH=Expansions-Flag
  • 01h: Auch substituierte Laufwerkskennung expandieren
  • 80h: Substituierte Laufwerkskennung im Ergebnis beibehalten
DS:SI=Zeiger auf ASCIIZ-String mit dem unvollständigen (also zu expandierenden) Dateinamen
ES:DI=Zeiger auf Feld zur Ablage des kanonischen Dateinamens (ASCIIZ). Erforderliche Feldlänge für kurze Namen: 67 bzw. 128 Bytes. Für lange Namen beträgt die erforderliche Feldlänge 261 Bytes.
Fehlerrückmeldung.
Create/open file Erstellt oder öffnet eine Datei

lfnopen - ein Makroentwurf für die Funktion 716ch.
AX=716Ch
BX=Zugriffs/Sharing-Bits
CX=Dateiattribute
DL=Aktion falls Datei existiert bzw. nicht existiert. Belegung:
Bits 7 bis 4, falls Datei nicht existiert:
  0000=mit Fehlermeldung abbrechen
  0001=Datei kreeiren
Bits 3 bis 0, falls Datei bereits existiert:
  0000=mit Fehlermeldung abbrechen
  0001=Datei eröffnen
  0010=Datei ersetzen und eröffnen.
DH=00
DI=Gewünschte Nummer für kurzen Dateinamen
DS:SI=Zeiger auf Feld mit Dateinamen (ASCIIZ)
AX=Datei-Handle
CX: Durchgeführte Aktion

Fehlerrückmeldung.
Bei Aufruf muss ein 16 Bit langer Open-Modus in BX übergeben werden. Sein Aufbau ist:
Bit1514131211109876543210
Inhalt0CF00HKPISSS0AAA
  • C Commit. 0=kein Commit, 1=Commit (Commit = Update der Verzeichniseinträge sofort nach jedem Schreibzugriff).
  • F Fehlerbehandlung soll erfolgen wenn 0 durch Int 24, wenn 1 nicht durch Int24, sondern der Fehlercode wird in AX zurückgegeben.
  • H Alias Hint: Die in DI hier eingetragene Ziffer soll am Ende des kurzen Dateinamens hinter der Tilde verwendet werden. Der Parameter gilt nur für neu anzulegende Dateien.
  • P Beim Lesen und Schreiben nicht puffern, sondern die Aktionen unmittelbar ausführen. Dann müssen Schreib- und Leseoperationen jeweils exakt die Datenlänge eines Sektors umfassen (512 Bytes).
  • K Datei nicht komprimieren! Auch dann nicht komprimieren, wenn sie sich auf einem komprimierten Datenträger befindet.
  • I Inheritance (Vererbung. Sagt aus, ob ihr Handle an einen Kindprozeß weitergegeben werden darf) 0=Handle weitergeben, 1=Handle nicht weitergeben.
  • SSS Sharing Mode.
    • 0=Compability (? Bedeutung unklar, bei PC-LAN vermutlich anzugeben)
    • 1=verweigere Lesen und Schreiben
    • 2=verweigere Schreiben
    • 3=verweigere Lesen
    • 4=keine Zugriffsverweigerung.
  • AAA Access Mode
    • 0=lesen
    • 1=schreiben
    • 2=lesen und schreiben
    • 4=lesen, aber das Zugriffsdatum nicht verändern (ab DOS 7).
Get volume information Ermittelt verschiedene Laufwerksinformationen AX=71A0h
DS:DX=Zeiger auf ASCIIZ-String mit Laufwerkswurzel, z.B. „C:\”.
ES:DI=Zeiger auf Ergebnisfeld für die Laufwerksinformationen
CX=Größe des Ergebnisfeldes (normalerweise 00ffh).
BX=File System Flags

Fehlerrückmeldung.
Bitbelegung der Rückmeldung in BX (File System Flags)
  • 0: Bei der Suche Namen wird zwischen Groß- und Kleinschrift unterschieden
  • 1: Erhält Groß/Kleinschrift bei Verzeichniseinträgen
  • 2: verwendet Unicodezeichen bei Datei- und Verzeichnisnamen
  • 3-13: reserviert(0)
  • 14: Unterstützt die DOS-Funktionen für lange Datei- und Verzeichnisnamen (LFN)
  • 15: Es handelt sich um ein komprimiertes Laufwerk
Find Close Beendet eine Verzeichnissuche AX=71A1h
BX=Such-Handle (stammt von "Find first" 714Eh)
Fehlerrückmeldung.
06h: Ungültiges Handle
Get file information by handle Ermittelt verschiedene Dateiinformationen per Handleangabe AX=71A6h
BX=Datei-Handle
CF=gesetzt
DS:DX=Zeiger auf Ergebnisfeld.
Fehlerrückmeldung.
Ergebnisfeld
OffsetGrößeInhalt
00hDWORDDateiattribute
04hQWORDErstellungszeitpunkt (0, falls nicht unterstützt)
0ChQWORDLetzter Zugriffszeitpunkt (0, falls nicht unterstützt)
14h QWORD Letzter Änderungszeitpunkt
1Ch DWORD Identifikationsnummer des Laufwerks
20h DWORD DWORD Dateigröße (obere untere 32 Bit)
28h DWORD Anzahl der Verweise auf diese Datei
2Ch DWORD DWORD Identifikationsnummer der Datei (obere untere 32 Bit)
Convert File time to DOS time Konvertiert 64-Bit-Zeitformat ins DOS-Format um AX=71A7h
BL=0
DS:SI=Zeiger auf 8-Byte-Feld mit 64-Bit-Zeitinfo
BH=Anzahl der 1/100 Sekunden
CX=Zeit in DOS-Format
DX=Datum in DOS-Format

Fehlerrückmeldung.
Convert DOS time to File time Konvertiert das DOS-Zeitformat ins 64-Bit-Format AX=71A7h
BL=1
BH=Anzahl der 1/100 Sekunden
CX=Zeit in DOS-Format
DX=Datum in DOS-Format
ES:DI=Zeiger auf 8-Byte-Feld für 64-Bit-Zeitinfo
Fehlerrückmeldung.
Create subst (Erzeuge Substitution) Weist eine Laufwerkskennung einem Pfad zu AX=71AAh
BH=0
BL=Laufwerk (0=aktuell, 1=A:, 2=B:, usw.)
DS:DX=Name des mit einem Laufwerksbuchstaben zu substituierenden Pfades (ASCIIZ)
Fehlerrückmeldung.
Terminate subst (Beende Substitution) Beendet die Laufwerkszuweisung auf einen Pfad AX=71AAh
BH=1
BL=Laufwerk (1=A:, 2=B:, usw., 0 ist nicht erlaubt)
Query subst (Erfrage Substitution) Ermittelt den Bezug einer Laufwerkskennung zu einem Pfad AX=71AAh
BH=2
BL=Laufwerk (1=A:, 2=B:, usw., 0 ist nicht erlaubt)
DS:DX=Zeiger auf Feld zur Ablage des Namens des eventuell substituierten Pfades (ASCIIZ)
Auswahlliste zu Interrupt 21

lfnopen - ein Makroentwurf für die Funktion 716ch

Der Aufruf der Funktion 716ch ist etwas unübersichtlich. Für meine Belange habe ich ein Macro geschrieben, um den Aufruf übersichtlicher zu gestalten. Das Macro mag als Anregung dienen. Es wurde von mir nicht vollständig getestet.

MakronameDateinameAktionZugriffsartZugriffssperre (Sharing Mode)Attribut
(Zahl)
lfnopen dateiname
si
a (von „append”)
n (von „new”)
o (von „old”)
r (von „read”)
rw(von „read and write”)
w(von „write”)
wr(von „write and read”)
w- (von „write -”)
r- (von „read -”)
rw- (von „read and write -”)
rw+ (verweigert nichts)
none (ohne Angabe)
Zahl mit Bitbelegung
Dateiname: Der Dateiname ist eine Null-terminierte ASCII-Zeichenkette im DS-Segment. Angegeben wird deren Label. Wahlweise kann deren Offsetadresse im DS-Segment auch im SI-Register übergeben werden.

Aktion: Hieraus bildet das Makro den Aktionscode im Register DX. Die drei möglichen Parameter bedeuten:

  • a = Die vorhanden Datei soll erweitert werden. Ist sie nicht vorhanden, soll sie angelegt werden.
  • n = Die Datei soll neu angelegt werden. War vorher eine Datei gleichen Namens vorhanden, soll sie gelöscht und danach neu angelegt werden..
  • o = Die Datei ist bereits vorhanden und soll nicht erlöscht werden.
Die Aktion steht im Zusammenhang mit der Zugriffsart. Passen beide nicht zusammen, wird der Aktionscode 0000h in DX erzeugt. Er veranlasst eine Fehlermeldung während des Programmablaufs.

Zugriffsart: Hier wird unterschieden zwischen r, rw, w und wr.

  • r = Lesen. Die bereits vorhanden Datei soll ausschließlich gelesen werden.
  • rw = Lesen und Schreiben. Auf die bereits bestehende Datei soll lesend und schreibend zugegriffen werden.
  • w = Schreiben. Die Datei soll neu angelegt werden. Anschließend kann auf sie geschrieben werden. Der Inhalt einer vorher bestehenden Datei gleichen Namens wird hierbei gelöscht.
  • wr = Schreiben und Lesen. Auf die Datei soll schreibend und lesend zugegriffen werden. Falls es sie noch nicht gibt, wird sie neu angelegt.

Zugriffsperre (Sharing Mode): Die Zugriffsperre betrifft andere Prozesse, die parallel auf die Datei zugreifen möchten. Unterstützte Angaben sind

  • r- (verweigert Lesen)
  • w- (verweigert Schreiben)
  • rw- (verweigert Lesen und Schreiben)
  • rw+ (verweigert nichts)
  • none (keine Angabe, auch „Kompatibler Modus” genannt)

Attribut: Es wird ein Zahlenwert erwartet, der eine Bitbelegung für die Dateiattribute festlegt. Defaultwert ist 0 für kein Attribut. Die in Frage kommenden Attributbits sind:

  • Bit 5=archive
  • Bit 3=volume
  • Bit 2=system
  • Bit 1=hidden
  • Bit 0=read only
comment #
 Funktion 716ch
 Kreeiren / Öffnen einer Datei mit Unterstützung langer
 Dateinamen.
  dateiname: Register si oder Label im Datenbereich
  aktion: n (neu) oder a (append)
  zugriff: r (read), w (write), rw (read and write), wr (write and read)
  share: r- (verweigert lesen), w- (verweigert schreiben),
         rw- (verweigert lesen und schreiben),
         rw+ (verweigert nichts)
         c   (kompatibel)
  attrib: es wird ein zahlenwert erwartet. default ist read only
#

if1                             ;;macros nur im 1.durchlauf
lfnopen        macro        dateiname,aktion,zugriff,share,attrib

    ifdif        <si>,<dateiname>
        mov        si, offset dateiname        ;Dateiname
    endif
        mov        bx,2000h        ;voreinstellung (zugriff=read)
        mov        dx,0000h        ;voreinstellung auf fehlermeldung
    ifidn        <n>,<aktion>
        ifidn        <w>,<zugriff>
        mov        bx,2001h         ;zugriff=write
        mov        dx,0012h        ;new file
        endif
        ifidn        <wr>,<zugriff>
        mov        bx,2020h         ;zugriff=write and read
        mov        dx,0012h        ;new file
        endif
        ifidn        <r>,<zugriff>
        mov        bx,2000h         ;zugriff=read (error)
        endif
        ifidn        <rw>,<zugriff>
        mov        bx,2000h         ;zugriff=read and write (error)
        endif
    endif

    ifidn        <a>,<aktion>
        ifidn        <w>,<zugriff>
        mov        bx,2001h         ;zugriff=write
        mov        dx,0011h        ;append file
        endif
        ifidn        <wr>,<zugriff>
        mov        bx,2002h         ;zugriff=write and read
        mov        dx,0011h        ;append file
        endif
        ifidn        <r>,<zugriff>
        mov        bx,2000h         ;zugriff=read (error)
        endif
        ifidn        <rw>,<zugriff>
        mov        bx,2002h         ;zugriff=read and write
        mov        dx,0011h        ;append file
        endif
    endif

    ifidn        <o>,<aktion>        ;old file
        ifidn        <w>,<zugriff>
        mov        bx,2001h         ;zugriff=write (error)
        endif
        ifidn        <rw>,<zugriff>
        mov        bx,2002h         ;zugriff=write and read
        mov        dx,0001h        ;append
        endif
        ifidn        <r>,<zugriff>
        mov        bx,2000h         ;zugriff=read
        mov        dx,0001h        ;append
        endif
        ifidn        <wr>,<zugriff>
        mov        bx,2002h         ;zugriff=read and write
        mov        dx,0001h        ;append
        endif
    endif

    ifidn        <r->,<share>
        or        bx,0030h        ;share verweigert read
    endif

    ifidn        <w->,<share>
        or        bx,0020h        ;share verweigert write
    endif

    ifidn        <rw->,<share>
        or        bx,0010h        ;share verweigert read and write
    endif

    ifidn        <rw+>,<share>
        or        bx,0040h        ;share verweigert nichts
    endif

    ifnb        <attrib>
        mov      cx,attrib        ;attrib bit 5=archive, 3=volume, 2=system,
        else                       ;1=hidden, 0=read only
        mov        cx,0000h        ;attrib readonly (default)
    endif

        mov     ax,716ch        ;funktion  71
        int        dos                ;falls fehler wird carry gesetzt
        endm
endif                                ;;if1

Im folgenden Beispiel sind vom Makroaufruf generierten Quellprogrammzeilen durch eine 1 am Zeilenanfang gekennzeichnet:

         lfnopen    q_Datei,o,wr,none,0
1        mov        si, offset q_Datei        ;Dateiname
1        mov        bx,2000h        ;voreinstellung (zugriff=read)
1        mov        dx,0000h        ;voreinstellung auf fehlermeldung
1        mov        bx,2002h        ;zugriff=read and write
1        mov        dx,0001h        ;append
1        mov        cx,0        ;attrib bit 5=archive, 3=volume, 2=system,
 ;1=hidden, 0=read only
1        mov     ax,716ch        ;funktion  71
1        int        dos                ;falls fehler wird carry gesetzt
Auswahlliste zu Interrupt 21
Letztes Upload: 24.03.2023 um 11:35:13 • Impressum und Datenschutzerklärung