Einzelnen Beitrag anzeigen

Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#11

AW: Data Execution Prevention (DEP) aktivieren

  Alt 9. Aug 2010, 14:44
So, ich habe meine Funktion mit Hilfe der JclSysInfo ein wenig überarbeitet:
Delphi-Quellcode:
function ActiveDEP: Cardinal;
const
  OptIn: Byte = 2;
  OptOut: Byte = 3;
  PROCESS_DEP_ENABLE = 1;
var
  Info: TOSVersionInfoEx;
  SetProcessDEPPolicy: function(dwFlags: dword): Boolean; stdcall;
  GetSystemDEPPolicy: function: Word; stdcall;
  nStatus: Word;
  h: HINST;
  bVerOK: Boolean;
begin
  Result := S_FALSE;
  ZeroMemory(@Info, SizeOf(TOSVersionInfo));
  Info.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);

  // Wir benötigen mind. Windows XP SP >= 3, Windows Vista SP >= 2 oder Windows 7
  if GetVersionEx(Info) then
    bVerOK := ((Info.dwMajorVersion = 5) and (Info.dwMinorVersion = 1) and (Info.wServicePackMajor >= 3))
      or ((Info.dwMajorVersion = 6) and (Info.dwMinorVersion = 0) and (info.wServicePackMajor >= 2))
      or ((Info.dwMajorVersion >= 6) and (Info.dwMinorVersion > 0))
  else
    bVerOK := FalsE;

  if bVerOK then
  begin
    // Beim Windows Server ist die System-Policy standardmäßig "Opt Out", beim Windows Client "Opt In"
    if (Info.wProductType in [VER_NT_SERVER, VER_NT_DOMAIN_CONTROLLER]) then
      nStatus := OptOut
    else
      nStatus := OptIn;

    // Den aktuellen systemweiten Status der Datenausführungsverhinderung (DEP) abfragen
    h := SafeLoadLibrary('Kernel32.dll', SEM_NOOPENFILEERRORBOX);

    if Succeeded(h) then
    begin
      @GetSystemDEPPolicy := GetProcAddress(h, 'GetSystemDEPPolicy');
      FreeLibrary(h);
      nStatus := GetSystemDEPPolicy();
    end;

    // Wenn die System-Policy auf OptIn steht, dann kann DEP für den aktuelle Prozess aktviert werden
    if (nStatus = OptIn) then
    begin
      h := SafeLoadLibrary('Kernel32.dll', SEM_NOOPENFILEERRORBOX);

      if Succeeded(h) then
      begin
        @SetProcessDEPPolicy := GetProcAddress(h, 'SetProcessDEPPolicy');
        FreeLibrary(h);

        // DEP für den aktuelle Prozess aktivieren
        if not SetProcessDEPPolicy(PROCESS_DEP_ENABLE) then
          Result := GetLastError
        else
          Result := S_OK;
      end;
    end;
  end
  else
    Result := ERROR_OLD_WIN_VERSION;
end;
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat