Programmieren mit C++

Borland C++

32-Bit-Programmierung

Speicherbasierte Dateien unter Windows 95 und Windows NT

Gibt es Unterschiede in der Implemetation der speicherbasierten Dateien zwischen den verschiedenen Win32 Implementationen?

Frage

Speicherbasierte Dateien sind ein echtes 32-Bit-Feature, das sicherheitsrelevante Teile des Betriebssystems tangiert. Windows NT als reinrassiges 32-Bit Betriebssystem ist hier zweifelsohne restriktiver ausgelegt als Windows 95, das nach wie vor mit 16-Bit-/DOS-Kompatibilität klarkommen muß. Die Unterschiede in der Implementierung beider Betriebssysteme können somit Auswirkungen auf die Robustheit aber auch die Implementation selbst haben.

Lösung

Windows 95 stellt nur einen begrenzten Adreßraum für speicherbasierte Dateien zur Verfügung. Dieser Raum liegt im Bereich von 0x80000000 und 0xBFFFFFFF. Jeder Aufruf der Funktion MapViewOfFile() liefert somit zwangsläufig eine Adresse aus diesem Bereich zurück. Dies ist insofern kritisch, als dieser Bereich genau derjenige ist, der von allen Win32-Applikationen gemeinsam verwendet wird. Die Daten eines Dateiabbildungsobjekts sind somit für alle Prozesse physikalisch erreichbar. Es wird unter Windows 95 tatsächlich immer die gleiche Basisadresse einer speicherbasierten Datei für alle Prozesse returniert. Mehrere Prozesse greifen so immer auf genau die gleichen Daten zu. Die beiden Ansichten verhalten sich kohärent zueinander. Unter Windows NT ist dies jedoch undenkbar. Das Betriebssystem reserviert den Adreßbereich für die geforderte Dateiansicht immer im Adreßraum des aufrufenden Prozesses, so daß die erzeugte Dateiansicht für keinen anderen Prozeß sichtbar ist. Für die Programmierung bedeutet dies, daß unter Windows NT immer ein Aufruf von MapViewOfFile() verwendet werden muß, während unter Windows 95 schon mal etwas unsauberer programmiert werden kann. Ein Weiterreichen der Basisadresse, was unter Windows 95 noch machbar wäre, ist unter Windows NT nicht erlaubt und auch nicht durchführbar.

Adreßraum

Windows NT erzeugt bei Dateiabbildungsobjekten stets eine so große Ansicht, wie von MapViewOfFile() gewünscht. Die Anwendung kann sich daher auf einen kleinen Ausschnitt beschränken. Windows 95 hingegen versucht immer, die komplette Datei in den Speicher abzubilden. Dies kann dazu führen, daß die Dateiabbildung einer 1 GByte großen Datei nicht erzeugt werden kann, weil so viel Speicher nicht verfügbar ist, obwohl letztlich nur eine Ansicht von 64 KByte erforderlich wäre.

Große Dateien

Werden zwei unterschiedliche Ansichten einer speicherbasierten Datei via MapViewOfFile() angefordert, wobei lediglich der Offset in die Datei unterschiedlich ist, so liefert Windows 95 zwei verschiedene Zeiger auf einen ansonsten gleichen Speicherbereich, d.h. die Speicherabbildung ist nur einmal vorhanden, es werden jedoch zwei verschiedene Zeiger aus diesem Bereich geliefert. Windows NT hingegen erzeugt zwei verschiedene Dateiansichten und returniert jeweils einen Zeiger auf die Basisadresse der Ansicht.

Unterschiedliche Ansichten

Fordern zwei Prozesse unter Windows NT eine Ansicht des gleichen Dateiabbildungsobjekts an, so erhalten sie in der Regel zwei verschiedene Adressen. Unter Windows 95 sind die gelieferten Adressen identisch.

Unterschiedliche Adressen

Man kann Anwendungen sowohl für Windows 95 als auch für Windows NT erzeugen, die auf beiden Betriebssystemen laufen. Man sollte jedoch sehr sauber programmieren und sich an die Spielregeln von Windows NT halten - ansonsten laufen die Anwendungen nicht unter Windows NT.

Fazit





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 03:16:17 von textarchiv.alojado.de