Entwickler-Ecke

Windows API - Delphi 7 und NTDDI_VERSION


trm - Do 10.02.11 14:10
Titel: Delphi 7 und NTDDI_VERSION
Hallo,

laut einem Eintrag im msdn ( http://msdn.microsoft.com/en-us/library/aa383745%28v=VS.85%29.aspx ) sollte es möglich sein, bestimmte Abhängigkeiten im luafenden Betrieb eines Programmes an die Platform zu binden.
In meinem Fall versuche ich immer noch eine Lösung für PROCESS_ALL_ACCESS unter WindowsXP zu nutzen, wenn das Programm mit Delphi7 unter Windows7 kompiliert wird.

Jedoch: wie setze ich NTDDI_VERSION ein, bzw. wie definiere ich das korrekt?


jaenicke - Do 10.02.11 14:53

Das hast du falsch verstanden. Das macht im Grunde das gleiche wie in Delphi:

Delphi-Quelltext
1:
2:
3:
4:
5:
{$IFDEF VER130} // Delphi 5
RaiseLastWin32Error;
{$ELSE}
RaiseLastOSError;
{$ENDIF}
Nur dass es dort nicht darum geht für eine bestimmte Delphiversion zu kompilieren, sondern für ein bestimmtes Betriebssystem.

Da du in Delphi die Headerdateien ohnehin nicht direkt nutzt und sich das auch ohnehin nicht zur Laufzeit auswirkt (sondern du feste Exen mit den Funktionen für ein bestimmtes OS bekommst), bringt dir das für deinen Zweck nichts.


trm - Do 10.02.11 17:57

Hallo Sebastian,

so etwas in der Art hatte ich vermutet. Danke für die Aufklärung.

Nun jedoch noch einmal zurück zu dem Problem, vielleicht kannst Du mir helfen.

Hier ein Crosspost-Hinweis: http://codekicker.de/fragen/OpenProcess-mittels-PROCESS-ALL-ACCESS-Flag-WinXP-Win7-Vista/829

Ist es denn nun möglich, dass ich ACCESS_ALL nutzen kann - oder nicht?
Diesen Aspekt verstehe ich nicht so richtig.

Verstanden habe ich, dass ab WinVista der Wert von dem Refernezwert sich geändert hat.
Laut diesem Blog: http://nsylvain.blogspot.com/2008/01/winverwin32winnt-mayhem.html ist es so, dass man den Wert ändern soll - passend zu jedem Betriebssystem.

Das hatte ich auch versucht. Ich hatte bei meinem Programm, mit welchem ich auf Speicherbereiche eines Spieles zugreifen möchte, die Definition von PROCESS_ALL_ACCESS umgangen und direkt die Werte eingetragen (http://blogs.msdn.com/b/oldnewthing/archive/2008/02/27/7912126.aspx).


Quelltext
1:
2:
3:
4:
5:
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ 0xFFFF)
#else
 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ 0xFFF)
#endif


Im Endeffekt sollte das doch sicher heißen, dass ich prüfen muss, auf welcher Platform das Programm läuft, um dann das richtige Flag zu nutzen - oder der einfacheit halber, wenn das Handle ungültig ist, das Flag austauschen.


jaenicke - Do 10.02.11 18:04

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
Im Endeffekt sollte das doch sicher heißen, dass ich prüfen muss, auf welcher Platform das Programm läuft, um dann das richtige Flag zu nutzen
Richtig.

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
- oder der einfacheit halber, wenn das Handle ungültig ist, das Flag austauschen.
Schlechte Idee, wahrscheinlich bekommst du ein Handle, aber eins mit zu wenig Rechten...