Zu GMEM_FIXED. In einer PM tauchte die irrtümliche Annahme auf, daß dieses Flag dafür sorgt, daß der Speicher nicht geswappt (ausgelagert) werden darf. Dies ist nicht korrekt. Windows bietet allein Treibern die Möglichkeit zu wählen, wobei der sog. NonPagedPool als sehr begrenzte Ressource anzusehen ist. Ansonsten kümmert sich der MM um den Rest. Was bedeutet also GMEM_FIXED?
Nun, normalerweise geben die Global*()-Funktionen ein
Handle zurück. Dieses
Handle kann dann benutzt werden um einen Speicherbereich zu sperren und so einen Pointer darauf zu erlangen. Ist ein Bereich gesperrt, so darf sich die Adresse nicht verändern. Ist ein Bereich entsperrt, so kann der entsprechende Speicherblock, der durch das
Handle repräsentiert wird, verschoben werden. GMEM_FIXED veranlaßt, daß der Speicherbereich immer gesperrt ist und somit das
Handle auch als Pointer benutzt werden kann (Typecasting).
@ToniR: Ich habe nochmal ins
DDK geguckt. Einen Treiber zu schreiben, der nur einen IOCTL hat, welcher dann eine phys. Adresse in eine virtuelle Adresse umwandelt sollte kein Problem sein. Allerdings bin ich mir noch nicht sicher, ob es so einfach geht diesen Bereich für den jeweiligen Prozess sichtbar zu machen. Am besten wäre wohl eine Section (MMF), denke ich. Es wird aber davon abgeraten und ich würde auch eher für das Kopieren eines Puffers. Kann man den DSP nicht stückchenweise füttern?