AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi LsaOpenPolicy + Win64 = Zugriffsverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

LsaOpenPolicy + Win64 = Zugriffsverletzung

Ein Thema von Dalai · begonnen am 6. Apr 2014 · letzter Beitrag vom 7. Apr 2014
 
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#1

LsaOpenPolicy + Win64 = Zugriffsverletzung

  Alt 6. Apr 2014, 16:36
Ein Hallo in die Runde .

Manchmal bin ich echt kurz davor, wahnsinnig zu werden . Ich bin gerade dabei, mit der Unit LsaApi von Colin Wilson rumzuprobieren, um Funktionen wie MSDN-Library durchsuchenLsaEnumerateAccountRights, MSDN-Library durchsuchenLsaAddAccountRights usw. benutzen zu können. Für 32 Bit funktioniert alles einwandfrei, sogar mit Unicode und so. Kompiliere ich die Geschichte mit XE2 für 64 Bit, bekomme ich immer beim Aufruf der Funktion LsaOpenPolicy eine Zugriffsverletzung in ntdll.dll (beim Lesen von Adresse 16x F).

Bei der Suche nach einer Lösung bzw. möglichen Ursache, stieß ich auf diesen Thread bei StackOverflow, in dem unter anderem die Tatsache bemängelt wird, dass die Records in der Unit LsaApi als packed deklariert sind. Also habe ich dieses Statement von allen Records entfernt, aber der Fehler bleibt. Ich komme im Code noch nicht einmal so weit wie der dortige Fragesteller, denn schon das LsaOpenPolicy ist das Problem.

Delphi-Quellcode:
uses LsaApi;

function GetDomainName: string;
var
  Buffer: Pointer;
  Status: NTStatus;
  PolicyHandle: LSA_HANDLE;
  ComputerName: TLsaUnicodeStr;
  Attributes: TLsaObjectAttributes;
  PolicyAccountDomainInfo: PPolicyAccountDomainInfo;
begin
  ComputerName := TLsaUnicodeStr.CreateFromStr('');
  try
    FillChar(Attributes, SizeOf(Attributes), 0);
    Status := LsaOpenPolicy(ComputerName.Value, Attributes,
      POLICY_VIEW_LOCAL_INFORMATION, PolicyHandle);
    if Status <> STATUS_SUCCESS then
      raise Exception.Create('LsaOpenPolicy Failed: ' +
        SysErrorMessage(LsaNtStatusToWinError(Status)));
    try
      Status := LsaQueryInformationPolicy(PolicyHandle,
        PolicyPrimaryDomainInformation, Buffer);
      if Status <> STATUS_SUCCESS then
        raise Exception.Create('LsaQueryInformationPolicy Failed: ' +
          SysErrorMessage(LsaNtStatusToWinError(Status)));
      try
        PolicyAccountDomainInfo := Buffer;
        Result := PolicyAccountDomainInfo.DomainName.Buffer;
      finally
        LsaFreeMemory(Buffer)
      end;
    finally
      LsaClose(PolicyHandle)
    end;
  finally
    ComputerName.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    ShowMessage(GetDomainName);
end;
Kann mir jemand sagen, wo das Problem liegt? Hab ich mal wieder was übersehen? Hinweis: Ich möchte, sofern möglich, auf die bei StackOverflow genannte Alternative JwaNtSecApi verzichten, weil das wieder weitere Abhängigkeiten nach sich zieht.

MfG Dalai

Geändert von Dalai ( 6. Apr 2014 um 18:18 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz