Category : Miscellaneous Language Source Code
Archive   : EXEC33A.ZIP
Filename : LIESMICH.DOC
Eine EXEC Funktion mit Speicherauslagerung
Version 3.3a, Freigegeben 93-06-22
Public Domain Software von
Thomas Wagner
Ferrari electronic GmbH
(Achtung Adressnderung, siehe unten!)
Dieses Archiv enthlt die Quellen fr eine 'EXEC'-Funktion die den
Aufruf externer Programme erlaubt, wobei der Programmspeicher
optional auf EMS, XMS, oder Datei ausgelagert wird. Bei Auslagerung
des Speichers werden nur noch wenige K des Hauptspeichers belegt
whrend das externe Programm ausgefhrt wird. Der Code/Daten-Bereich
betrgt etwa 1k, der bentigte Speicherplatz ist abhngig von der
Speicherfragmentierung, sowie besonders von der Gráe des
Umgebungsvariablenblocks. blicherweise werden zwischen 2K und 7K
belegt.
Die Routinen sind kompatibel mit
Turbo C (Versionen 1.x, 2.x, sowie C++ 1.0)
Borland C++ (Version 2.0 und hher),
Microsoft C (Versionen 5.1 und hher),
Watcom C (Version 8.0),
Turbo Pascal (Versionen 4.x bis 6.x).
EMS (LIM 3.0 und sptere Versionen) oder XMS werden benutzt sofern
ausreichend Platz zur Verfgung steht. Wenn nicht, wird eine
temporre Plattendatei angelegt. Diese Datei wird in dem durch die
Umgebungsvariablen TEMP= oder TMP= gegebenen Pfad angelegt. Ist kein
solcher Pfad angegeben, wird der aktuelle Pfad benutzt.
Aufruf und Parameterversorgung sind in der Datei "exec.h" (C) bzw.
"exec.pas" (Pascal) detailliert dokumentiert.
Das allgemeine Format ist
retcode = do_exec (Name des auszufhrenden Programms,
Programm-Parameter und Redirection String,
Spawn-Optionen,
Bentigter Speicher (0xffff lagert stets aus, 0 nie),
Umgebungsvariablen-Zeiger/Flag)
zum Beispiel:
rc = do_exec ("cl", "-c -Od exec.c >&errout", USE_ALL, 0xffff, NULL);
oder, fr Pascal:
rc := do_exec ('tpc', '/$D+ exec >&errout', USE_ALL, $ffff, false);
Redirection fr Standard Input, Standard Output, und Standard Error
wird optional behandelt indem der Parameter-String nach den folgenden
Kombinationen durchsucht wird:
stdin:
stderr: >&file oder >&>file zum Anfgen
Redirection wird standardmáig untersttzt. Um sie auszuschalten,
mssen Sie die Definitionen sowohl in spawn.asm als auch in
exec.c/exec.pas ndern.
Wenn das auszufhrende Kommando eine Batch-Datei ist, wird
automatisch der Kommando-Prozessor aufgerufen. Der Kommandoprozessor
wird auch aufgerufen wenn das Kommando leer ist. Dabei wird die
COMSPEC-Umgebungsvariable benutzt um den Kommandoprozessor zu finden,
zustzliche Parameter in der COMSPEC-Zeile werden in die
Kommandoparameter eingefgt.
Zum Beispiel:
Es sei COMSPEC=C:\DOS\COMMAND.COM /E:960
PATH=C:\DOS;C:\CMD
Datei B.BAT existiert in C:\CMD
do_exec wird aufgerufen mit ('b', 'eins zwei >out', ...)
Dann ist das aufgerufene Kommando
C:\DOS\COMMAND.COM
mit dem Parameter-String
/E:720 /C C:\CMD\B.BAT eins zwei
und Standard Output wird umgeleitet auf die Datei 'out'.
INHALT
======
Dieses Archiv enthlt die folgenden Dateien:
LIESMICH.DOC Diese Datei
README.DOC Englische Version dieser Datei
GETLANG.EXE Ein Hilfsprogramm zur Extraktion einer ein-
sprachigen Version aus der zweisprachigen
Quelle.
Alle C- und Assembler-Quellen (die Pascal-Quellen
leider nur teilweise) sind sowohl in Deutsch als
auch in Englisch dokumentiert, was die Quellen
schwer lesbar macht. Fr bessere Lesbarkeit
knnen Sie mit GETLANG eine der Sprachen
eliminieren.
Benutzung: GETLANG Sprache Compiler
wobei Sprache 'E' fr Englisch oder 'D' fr Deutsch
Compiler 'C' fr C Dateien, 'A' fr Assembler,
'P' fr Pascal.
Beispiele: GETLANG d a
GETLANG d c
DEUTSCH.BAT Batch-File zur Ausfhrung von GETLANG fr alle
Quelldateien, deutsche Version
ENGLISH.BAT Batch-File zur Ausfhrung von GETLANG fr alle
Quelldateien, englische Version
SPAWN.ASM Die Hauptfunktion fr exec.
Diese Datei ist fr die C und Pascal Versionen gleich.
Fr Benutzung mit Turbo Pascal muá mit dem Turbo-Assembler
assembliert werden. Die C Version kann mit TASM (geben Sie
/JMASM51 an) oder MASM 5.1 bersetzt werden.
Assemblieren mit:
tasm /DPASCAL spawn,spawnp; Fr Turbo Pascal, near calls
tasm /DPASCAL /DFARCALL spawn,spawnp;
Fr Turbo Pascal, far calls
?asm spawn; Fr C (Default small model)
?asm /DMODL=xxx spawn; For C (model 'xxx')
Beispiel:
masm /DMODL=large spawn; Large model C
tasm /DMODL=medium /JMASM51 spawn; Medium model C
SPAWNP.OBJ SPAWN assembliert fr Pascal, near calls
SPAWNCS.OBJ SPAWN assembliert fr C (small model)
SPAWNCL.OBJ SPAWN assembliert fr C (large model)
Die C Dateien wurden mit dem /MX-Schalter bersetzt um
Groá-/Kleinschreibung beim Linken zu bercksichtigen.
Hinweis fr Turbo Pascal: Sie knnen die "near call" Version
von SPAWN auch dann nutzen wenn Sie mit "force far calls"
kompilieren, indem Sie die "external"-Definitionen von
do_spawn und prep_swap in Datei exec.pas in {$F-} und {$F+}
einschlieáen.
Um Konfusion bei der Verwendung mehrerer Compiler zu
vermeiden, wurde das Pascal-Object "spawnp.obj" benannt.
CHECKPAT.ASM Hilfsfunktion zur Prfung und Auflsung eines Pfades
Diese Datei ist fr die C und Pascal Versionen gleich.
Fr Benutzung mit Turbo Pascal muá mit dem Turbo-Assembler
assembliert werden. Die C Version kann mit TASM (geben Sie
/JMASM51 an) oder MASM 5.1 bersetzt werden.
Assemblieren mit:
tasm /DPASCAL checkpat,checkpap; Fr Turbo Pascal, near calls
tasm /DPASCAL /DFARCALL checkpat,checkpap;
Fr Turbo Pascal, far calls
?asm checkpat; Fr C (Default small model)
?asm /DMODL=xxx checkpat; Fr C (model 'xxx')
Beispiel:
masm /DMODL=large checkpat; Large model C
tasm /DMODL=medium /JMASM51 checkpat; Medium model C
CHECKPAP.OBJ CHECKPAT assembliert fr Pascal, far calls
CHECKPCS.OBJ CHECKPAT assembliert fr C (small model)
CHECKPCL.OBJ CHECKPAT assembliert fr C (large model)
CHECKPAT.PAS Einbindungs-Unit fr checkpat (Nur Pascal)
Die C Dateien wurden mit dem /MX-Schalter bersetzt um
Groá-/Kleinschreibung beim Linken zu bercksichtigen.
Die Pascal-Version muá mit dem FARCALL-Schalter assembliert
werden wenn Sie sie mit der Einbindungs-Unit CHECKPAT.PAS
zusammen benutzen. Zumindest Turbo Pascal Version 5.5
verwendet offenbar stets einen Far Call wenn eine externe
Routine im Interface-Teil einer Unit definiert wird.
EXEC.PAS Interface Routinen und Dokumentation fr Turbo Pascal
EXEC.C Interface Routinen fr C
EXEC.H Interface Definitionen und Dokumentation fr C
COMPAT.H MS-C/TC Kompatibilitts-Definitionen fr C
Diese Dateien bereiten die Parameter fr die Hauptfunktion
vor und bearbeiten die Datei-Suche und Umgebungsvariablen.
EXTEST.C C Test-Programm fr EXEC
EXTEST.PAS Turbo Pascal Test-Programm fr EXEC
Das EXTEST Programm testet die Funktionalitt der do_exec
Funktion. Es erwartet die Eingabe eines DOS-Kommandos und,
durch Komma getrennt, seiner Parameter. Die Eingabe einer
Leerzeile startet COMMAND.COM ohne Parameter.
MAKEPAS Make-Datei fr Turbo Pascal (Borland Make)
MAKETC Make-Datei fr Borland C++ (Borland Make)
MAKEMS Make-Datei fr Microsoft C (MS NMAKE)
Die Turbo Pascal Version von EXEC.PAS enthlt Ersatzfunktionen fr
die Umgebungsvariablen-Zugriffsfunktionen 'envcount', 'envstr', und
'getenv', sowie eine zustzliche Funktion 'putenv'. Diese Funktion
erlaubt Ihnen, zur Umgebung des gerufenen Programms Strings
hinzuzufgen. Die Definition ist
procedure putenv (envvar: string);
wobei 'envstr' einen String der Form 'ENVVAR=wert' enthlt. Das '='
ist notwendig. Um einen Umgebungsvariablenstring zu lschen geben Sie
'ENVVAR=' an. Bitte nutzen Sie nur die Funktionen aus der EXEC Unit,
mischen Sie sie nicht mit Aufrufen der Funktionen der DOS Unit.
SUPPORT
=======
Diese Software ist "Public Domain", das heiát es gibt keinerlei
Einschrnkungen bezglich ihrer Nutzung, ob privat oder in
kommerziellen Produkten. Es ist weder eine Registrierungsgebhr zu
zahlen, noch sind zur Nutzung irgendwelche Lizenzen erforderlich.
Dies heiát allerdings auch, daá der Autor zu keiner Leistung
gegenber dem Nutzer verpflichtet ist. Jegliche Ansprche auf
Schadenersatz bei Fehlfunktionen sind ausgeschlossen. Sie haben die
Quellen, bitte prfen Sie sie vor Nutzung.
Ich mchte auch um Verstndnis bitten, daá ich nicht in der Lage bin,
kostenlose Programmierberatung zu erteilen, Spezialversionen fr
exotische Compiler zu erstellen, oder neue Versionen dieses Programms
kostenlos zu versenden.
Fehlermeldungen, Verbesserungsvorschlge und hnliches senden Sie
bitte an meine Firmen-Adresse:
Ferrari electronic GmbH
Ruhlsdorfer Strasse 138
D-14513 Teltow
Tel.: (+49 3328) 474 626
Fax: (+49 3328) 438 04-0
BBS: (+49 3328) 438 04-8 (ab 15.8.93)
Bitte versuchen Sie nicht, vor dem 15.8. anzurufen!
Internet: [email protected]
BIX: twagner
Compuserve: 100023,2042
Ein eingeschrnkter Support ist ber BIX, das Teleconferencing System
von McGraw-Hill, mglich. Falls Sie Fragen oder Fehlermeldungen
haben, senden sie BIXmail an 'twagner'. Details ber BIX finden Sie
in der Englischsprachigen Version dieser Dokumentation.
EINSCHRNKUNGEN
===============
Der "keine Rckkehr"-Modus von do_exec ist nur der Vollstndigkeit
halber verfgbar. Er hat einige Nachteile gegenber den
Standard-Funktionen der Compiler-Bibliotheken. Insbesondere werden
offene Dateien nicht abgeschlossen, und durch die Laufzeitbibliothek
belegte Interrupt-Vektoren werden nicht auf den DOS-Standardwert
zurckgesetzt. Wenn mglich, benutzen Sie fr diesen Modus die
Standardfunktionen.
Das Assembler-Modul "spawn" darf nicht das erste Modul beim Linken
sein. Fgen Sie es in eine Bibliothek ein, oder geben Sie spawn.obj
als eine der letzten zu linkenden Dateien an. Das spawn-Modul
berschreibt etwa 1k am Anfang des Programmspeichers. Dieser Speicher
wird zwar gesichert, er darf aber nicht Teile des Moduls selbst
enthalten, da der Programmcode dabei zerstrt wrde. Die
do_exec-Funktion berprft diese Bedingung, und kehrt mit einem
entsprechenden Fehlercode zurck falls der Code in Gefahr wre.
Bei Aufruf von do_exec drfen keine Interrupt-Handler installiert
sein. Dies schlieát Handler fr Control-C und Critical Errors ein.
Sofern Sie Interrupts bearbeiten wollen whrend Ihr Programm
ausgelagert ist, mssen Sie das spawn-Modul modifizieren, sodaá die
Handler in den residenten Teil bernommen werden.
Offene Dateien bleiben whrend der do_exec-Funktion geffnet. Dies
reduziert die Zahl der mglichen offenen Dateien fr das
Kind-Programm. Die Umgebungsvariable "C_FILE_INFO", die von einigen
C-Compilern bei Aufruf der Standard-Funktionen fr spawn erzeugt
wird, wird nicht untersttzt. Wenn NO_INHERIT in spawn.asm gesetzt
ist (Standard), werden alle offenen Dateien auáer den ersten fnf
Standard-Dateien vor dem Kindprozess "versteckt" und damit nicht
vererbt. Dies erlaubt dem Kindprozess, mehr Dateien zu ffnen, wobei
allerdings das Systemweite Limit (FILES= in config.sys) hoch genug
sein muá um alle offenen Dateien zu untersttzen.
Interne Kommandos (CD, DIR usw.) werden nicht automatisch bearbeitet.
Sie knnen diese ausfhren indem Sie den Kommandointerpreter laden
(durch bergabe eines leeren Strings fr das auszufhrende Programm).
Zum Beispiel:
(C) retcode = do_exec ("dir", "*.*", USE_ALL, 0xffff, environ);
if (retcode == RC_NOFILE)
retcode = do_exec ("", "/c dir *.*", USE_ALL, 0xffff, environ);
(P) retcode := do_exec ('dir', '*.*', USE_ALL, $ffff, true);
if (retcode = RC_NOFILE)
retcode := do_exec ('', '/c dir *.*', USE_ALL, $ffff, true);
HINWEISE
========
Die Funktion sollte mit DOS bis herunter zu Version 2.11 kompatibel
sein. Getestet wurde jedoch nur unter DOS 3.3, DOS 4.0, DOS 5.0,
DOS 6.0 und DR-DOS 5.0.
Kompatibilitt zu Compiler-Versionen wurde nur getestet mit Borland
C++ 3.1, Microsoft Visual C 1.0, und Turbo Pascal 5.5. Auf andere Compiler
habe ich leider keinen Zugriff. Turbo Pascal 6.0 scheint nach
Benutzerberichten keine Probleme mit EXEC zu haben. Eine Benutzung
mit dem DOS-Extender von Turbo Pascal 7.0 (oder anderen
DOS-Extendern) ist nicht mglich.
Wird ein Kommando aufgerufen das resident bleibt (TSR), zum Beispiel
PRINT oder Sidekick, ist eine Rckkehr in das rufende Programm nicht
mglich. Das Programm wird beendet, belegter Speicher in EMS/XMS wird
freigegeben, eine Auslagerungsdatei wird gelscht.
Wenn der Programmspeicher aus mehreren DOS-Speicherblcken besteht,
benutzt die Auslagerungsfunktion undokumentierte DOS-Interna.
Insbesondere werden Speicherkontrollblcke direkt modifiziert. Dies
kann theoretisch zu Inkompatibilitten mit spteren DOS-Versionen,
oder mit DOS-Clones oder Emulatoren fhren. Im praktischen Betrieb
wurden bisher noch keine Probleme mit irgendwelchen DOS-Versionen,
einschlieálich DOS 6.0 und der DR-DOS Versionen, festgestellt.
Wenn NO_INHERIT in spawn.asm auf TRUE gesetzt ist, werden einige
undokumentierte Felder im PSP benutzt und modifiziert. Auch dies
sollte mit allen DOS-Versionen und Clones funktionieren. Sollten Sie
jedoch Probleme befrchten, knnen Sie NO_INHERIT auf FALSE setzen
(nicht jedoch, wenn Sie die Handle-Tabelle erweitern).
nderungsgeschichte
===================
nderungen von Version 3.3 auf 3.3a:
Auáer der Adressnderung ist die einzige signifikante nderung eine
verbesserte Behandlung der Redirection. Wie unter DOS kann die
Redirection jetzt auch gemischt mit sonstigen Parametern angegeben
werden.
In der Pascal-Version wurde die Redirection nicht korrekt behandelt,
sofern mehr als eine Redirection angegeben war. Ebenso wurden
Parameter in der COMSPEC-Zeile nicht erkannt. Dies wurde korrigiert.
nderungen von Version 3.2a auf 3.3:
Neu ist die Bercksichtigung des unbenutzten Heap-Bereichs fr Turbo
Pascal. Dieser Bereich wird optional nicht ausgelagert, was in vielen
Fllen sowohl die Auslagerungsgeschwindigkeit erhht, als auch den
Speicherbedarf auf dem Auslagerungsmedium reduziert. Da dies
Versionsabhngig ist (Turbo Pascal Version 6 hat eine andere
Heap-Verwaltung als frhere Versionen), ist dieses Feature in der
vorbersetzten Version nicht eingeschaltet. Bitte setzen Sie PAS_FREE
in SPAWN.ASM auf TRUE, und setzen sie TPAS_6 je nach Ihrer
Turbo-Pascal-Version auf TRUE oder FALSE, um es zu nutzen.
Die Pascal "putenv" Funktion war fehlerhaft. Wenn eine Variable
gesetzt wurde, die bereits im Environment vorhanden war, wurde ein
doppelter Eintrag erzeugt statt den alten Eintrag zu lschen.
Fehlermeldung und Korrektur von A. Bailey.
Bei der Bestimmung von Programmname und Pfad wurden Programme, deren
Basis-Name (ohne Extension) gleich dem Namen einer Subdirectory war,
unter Umstnden nicht gefunden. Die checkpath Funktion wurde
modifiziert um diesen Fall korrekt zu behandeln. Fehlermeldung von H.
Lembke.
Bei Auslagerung auf Datei mit NO_INHERIT true und einer erweiterten
Handle-Tabelle war eine Rckkehr nicht mglich. Dies lag daran, daá
der Tabellen-Zeiger im PSP wiederhergestellt wurde bevor der
dazugehrige MCB-Block alloziert und wiederhergestellt war. Der
PSP-Eintrag wird jetzt erst nach dem Zurckladen gesetzt.
Fehlermeldung von H. Lembke.
EXEC konnte nicht auslagern wenn eine erweiterte Handle-Tabelle mit
NO_INHERIT false verwendet wurde. Der MCB der die Handle-Tabelle
enthlt wird jetzt nicht mehr ausgelagert. Dies fhrt allerdings
dazu, daá der Speicher fragmentiert wird, sodaá NO_INHERIT stets TRUE
sein sollte wenn die Handle-Tabelle erweitert werden soll.
Die C do_exec-Funktion verarbeitet jetzt auch NULL-Zeiger auf
Kommandozeile und Parameterstring korrekt.
nderungen von Version 3.2 auf 3.2a:
Ein Fehler in checkpat.asm, der zu nicht vollstndigen Pfadangaben
fhrte, wurde behoben.
Ein Fehler in spawn.asm, der dazu fhrte, daá die Dateiumleitungs-
Dateien selbst nach Programmende nicht geschlossen wurden, wurde
behoben.
nderungen von Version 3.1 auf 3.2:
Neu ist der Aufruf einer benutzerdefinierbaren Funktion (ber einen
Funktions-Pointer bzw. eine Prozedurvariable) aus do_exec vor
Ausfhrung des Programmaufrufs. Diese Funktion kann z.B. Meldungen
ausgeben und zustzliche Prfungen durchfhren. Die bisher interne
Struktur mit den Auslagerungs-Parametern wurde zugnglich gemacht
um der Benutzerfunktion den Zugriff zu erlauben. Fr Details siehe
exec.h bzw. exec.pas, sowie das Beispiel in extest.c/extest.pas.
Ein Fehler in checkpat.asm, der bei Verwendung mit Turbo Pascal
zu Problemen mit der "exists"-Funktion fhrte, wurde behoben.
Die Pascal-Version von extest wurde (endlich) auf den gleichen
Stand wie die C-Version gebracht, ein Beispiel fr die Nutzung
der Benutzerfunktion wurde in beide Versionen eingefgt.
In exec.c wurde die Definition der internen Routinen auf "static"
gendert, die Initialisierung einiger Variablen in do_exec wurde
korrigiert.
nderungen von Version 3.0a auf 3.1:
Neu sind vor allem die automatische Behandlung von .BAT-Dateien und
die Untersttzung der I/O-Dateiumleitung. Die Suchreihenfolge fr
Kommandos entspricht jetzt exakt der DOS-Reihenfolge, bis auf die
Bearbeitung interner Kommandos (es gibt keinen sicheren Weg fr die
Erkennung, ob ein Kommando intern oder extern ist). Dateiumleitung
ist optional. Das Interface zu do_exec hat sich nicht gendert,
do_spawn bentigt drei neue Parameter wenn Redirection eingeschaltet
ist.
Eine Routine (checkpat.asm) die einen Pfad prft und auflst sowie in
seine Bestandteile aufteilt wurde hinzugefgt. Diese Routine fhrt
einige Prfungen des Pfades und des Dateinamens durch und behandelt
Critical Errors (ungltiges Laufwerk, Laufwerk nicht bereit) ohne
Benutzereingriff. Die Routine wird zur Bearbeitung des
Programm-Dateinamens, des Kommandoprozessor-Dateinamens und des
temporren Dateipfades verwendet. Die Routine ist unabhngig von den
anderen EXEC/SPAWN-Funktionen, sie kann daher auch in anderen
Applikationen ntzlich sein.
Einige neue Fehlercodes erlauben eine bessere Analyse von
Fehlerursachen.
Der Pfad der temporren Datei ist jetzt stets ein vollstndiger Pfad.
Ein Wechsel von Laufwerk oder Pfad whrend der Auslagerung kann daher
jetzt nicht mehr zum Verlust der Auslagerungsdatei fhren.
Die Prfung auf Existenz einer Datei wurde in checkpat.asm verlagert,
und von der 'find first'-Funktion auf 'get file attributes'
umgestellt. Dies scheint geringfgig schneller und vermeidet
Compiler-Abhngigkeiten.
Das Programm GETLANG wurde korrigiert, die Hilfs-Meldungen werden
jetzt auf stderr ausgegeben.
nderungen von Version 3.0 auf 3.0a:
Ein kleiner Fehler in EXEC.C wurde korrigiert: ein '<' fehlte in
einem deutschen Kommentar, sodaá bei GETLANG E ein groáer Teil der
Datei verschluckt wurde.
Ein Problem (Fehler? Feature?) bei der Turbo C/Borland C "stat"
Funktion, die fr Directories stets "read-only" liefern, verhinderte
die Benutzung der TEMP Directory beim Auslagern. Die Schreib-
Erlaubnis wird jetzt nicht mehr geprft.
Die Prallozierung der Auslagerungsdatei, die mit Version 3.0
eingefhrt wurde um sicherzustellen daá das Laufwerk den kompletten
Speicher fassen kann, fhrte zu starken Verzgerungen wenn die
Auslagerungsdatei auf einem Novell-Netzwerk Laufwerk lag. Um dieses
Problem zu umgehen wurden zwei neue Flags fr den "method" Parameter
eingefhrt:
NO_PREALLOC - Nie Prallozieren
CHECK_NET - Nicht Prallozieren wenn Datei auf Netzwerk
Wenn die Datei nicht pralloziert wird, wird das Laufwerk nicht auf
ausreichenden Platz geprft. Die Alternative, der "get disk free
space" Aufruf, dauert im allgemeinen noch wesentlich lnger als ein
Prallozieren. Dies ist allerdings kein groáes Problem, die
Auslagerung liefert lediglich den Fehlercode 0x502 wenn der
Speicherplatz nicht ausreicht.
nderungen fr Version 3.0:
Dies ist die erste Version mit Deutscher Dokumentation. Falls Sie mit
frheren Versionen gearbeitet haben, knnen Sie die nderungen in der
Englischen Beschreibung nachlesen - denn dann knnen Sie doch
Englisch, oder? 🙂
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/