ZITAT(Hans-J. @ 2010-11-22, 17:07) Das Resultat könnt ihr hier bei Francisco Montilla als dcrawMS.exe herunterladen:[/quote]
Danke für Dein Engagement.
ZITATDie Version von mir umgeht diverse Probleme, der anderen Windowsversionen, da sie mit dem
original Microsoft Compiler erstellt wurde.[/quote]
Zum Hintergrund, mir sind folgende zwei Probleme bekannt:
Bei der Entwicklung von Windows Vista hat Microsoft irgendwas an der Implementierung der VDM (Virtual DOS Machine) "verbockt", so daß standardmäßig jetzt wohl nur noch maximal 32 MiB Speicher über DPMI (DOS Protected Mode Interface) alloziert werden können - mit der Folge, daß dcraw in der normalen Distribution für Windows mit einer Fehlermeldung aussteigt.
Wie weiter oben in diesem Thread schon beschrieben wird dcraw in der Standard-Distribution für Windows mit DJ Delories DJGPP 2.x compiliert. DJGPP ist ein DOS-Compiler, der 32-Bit-Extended-DOS-Anwendungen erzeugt, die auf DPMI basieren. Beim Start der Anwendung überprüft der Stubloader im Executable, ob die Laufzeitumgebung DPMI-Services bereitstellt. Falls ja, so werden diese verwendet. Falls das nicht der Fall ist, so versucht der Loader, den standardmäßig dem Paket beliegenden DOS-DPMI-Host CWSDPMI von Charles W. Sandmann zu laden, so daß die Anwendung laufen kann. Damit ist es unter DOS möglich, bis zu 4 GiB physikalischen oder virtuellen Speicher zu adressieren, d.h. den vollen Adreßraum von 32-bittigen CPUs auszunutzen. Neben CWSDPMI gibt es aber auch noch etliche andere DPMI-Hosts, die genausogut verwendet werden können, wenn sie vor dem Start der Anwendung, die DPMI-Services benötigt, geladen wurden. Einige wenige DOS-Systeme (wie z.B. DR-DOS und inzwischen wohl auch FreeDOS) kommen auch schon von Haus aus mit einem DPMI-fähigen Speichermanager. Die VDM von Windows stellt(e) DPMI ebenso bereit - jedenfalls von Windows 3.0 (im Erweiterten 386-Modus) bis Windows ME und von Windows NT bis Windows XP (und neuer). Und genau da liegt das Problem: Selbst wenn Windows in einer DOS-Box kein DPMI anbieten würde, könnte man in der DOS-Box keinen DPMI-Host eines Drittanbieters nachladen, da DPMI auf einer Privilegstufe der CPU läuft (typischerweise auf Ring 0, im Einzelfall auch mal auf Ring 1), die im V86-Modus gerade nicht verfügbar ist (Ring 3). Der DPMI-Host hat die nahezu vollständige Kontrolle über das System. In einer DOS-Box ist dcraw deshalb auf den bereits verfügbaren DPMI-Host von Windows angewiesen - und wenn der nicht mehr richtig funktioniert, gibt es Probleme... Die 32 MiB DPMI-Speicher, die Windows unter Vista in einer DOS-Box bereitstellt, sind offenbar zu wenig für dcraw.
Unter einigen Windows-Versionen (inklusive Windows Vista SP 1) soll es möglich sein, die Menge an DPMI-Speicher, die Windows einer DOS-Box bereitstellt, über einen Registry-Key zu konfigurieren, hier mal beispielhaft für 128 MiB (nicht selbst überprüft):
1
2
3
4
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WOW]
"DpmiLimit"=dword:08000000
Siehe auch:
http://www.trnicely.net/misc/vista.html#Solutions
http://www.ee.iitb.ac.in/student/~sachinp/...d=win32_-_vista
http://tech.groups.yahoo.com/group/BCX/message/40157
http://support.microsoft.com/kb/102986
http://forums.dpreview.com/forums/readflat...mp;changemode=1
Das zweite Problem besteht darin, daß 64-Bit-Ausgaben von Windows Vista und Windows 7 leider keine VDMs mehr unterstützen, weder für DOS noch für WoW (Windows on Windows). Der Grund dafür liegt darin, daß der V86-Modus, der die Grundlage für die Implementierung von VDMs bildet, von 64-Bit-Prozessoren der x86-64-Familie nur im Legacy Mode unterstützt wird, die 64-Bit-Betriebssysteme jedoch im Long Mode laufen. Da wollte man bei den CPU-Herstellern wohl offensichtlich ein "paar" Transistoren einsparen und bei der Umstellung von 32 Bit auf 64 Bit einen zusätzlichen Layer an Komplexität rausnehmen, was ich persönlich allerdings sehr bedauere, da sich damit viele interessante Systementwicklungen nicht rückwärtskompatibel realisieren lassen.
ZITATSie läuft natürlich nicht nur unter Windiws 7 und Vista und den Serverversionen 2003 und 2008, sondern auch unter XP und Windows 2000. Windows NT ;-) kann ich jetzt nicht mehr testen, aber es sollte eigentlich auch da ohne Probleme laufen.[/quote]
Der Grund, warum Deine Version funktioniert, liegt darin, daß Du dcraw nicht als Extended DOS-Anwendung compilierst, sondern als Win32-Anwendung. Die Anwendung läuft dann nicht in einer VDM und ist auch nicht auf DPMI angewiesen, sondern benutzt stattdessen das Win32-API. Aber dafür ist sie eben abhängig von Windows. (Ob man Deine Win32-Version von dcraw mit dem DOS-Extender HXDOS, der unter DOS Unterstützung für Teile des Win32-APIs bereitstellt, auch unter DOS zum Laufen bekommt, habe ich noch nicht überprüft.)
Ich schreibe das, damit nicht der falsche Eindruck entsteht, es gäbe einen Fehler in der normalen Windows-Distribution von dcraw, etwa verursacht durch den benutzten Compiler (DJGPP). Das Problem liegt eindeutig auf der Seite von Windows.
Viele Grüße,
Matthias