Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.680 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