AGB  ·  Datenschutz  ·  Impressum  







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

LsaOpenPolicy + Win64 = Zugriffsverletzung

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

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

LsaOpenPolicy + Win64 = Zugriffsverletzung

  Alt 6. Apr 2014, 17: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 19:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.637 Beiträge
 
Delphi 5 Professional
 
#2

AW: LsaOpenPolicy + Win64 = Zugriffsverletzung

  Alt 6. Apr 2014, 20:34
Sorry, dass ich das Thema schon wieder hoch hole, aber ich hab das Problem (hoffentlich dauerhaft) lösen können . Ich hab den "Fehler" gemacht, ein Projekt aus Delphi 5 einfach im XE2 zu öffnen, und diesem Projekt dann die 64 Bit Plattform hinzuzufügen. In einem neu im XE2 erstellten Projekt funktionierte es nämlich auch einwandfrei mit 64 Bit.

Nach ein "bisschen" Vergleichsarbeit zwischen dem importierten Projekt und dem frisch erstellten, stellte sich heraus, dass die Ausrichtung der Records im importierten falsch war. Dort war Byte eingestellt, im frisch erstellten aber Quad Word. Nur für den Fall, dass sich andere Leute ebenfalls "totsuchen", die Option ist zu finden in den Projekteinstellungen unter Delphi-Compiler > Compilieren > Record-Felder ausrichten: Quad Word. Dabei darauf achten, dass als Ziel oben "Alle Konfigurationen - Alle Plattformen" gewählt ist.

Dennoch eine Frage: Wirkt die Ausrichtung von Records an Bytes genauso wie wenn diese als packed deklariert wären Das würde nämlich mit der einen Antwort bei StackOverflow übereinstimmen, denn ich hab im Debugger ebenfalls immer eine Größe von 40 für SizeOf(Attributes) bekommen, mit einer Ausrichtung an Quad Words aber 48.

MfG Dalai
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.830 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: LsaOpenPolicy + Win64 = Zugriffsverletzung

  Alt 7. Apr 2014, 07:56
packed bedeutet nicht ausgerichtet.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.637 Beiträge
 
Delphi 5 Professional
 
#4

AW: LsaOpenPolicy + Win64 = Zugriffsverletzung

  Alt 7. Apr 2014, 14:13
packed bedeutet nicht ausgerichtet.
Das ist mir bekannt, war aber nicht die Frage und auch nicht das Problem bzw. die Ursache, denn die packed Statements hatte ich ja bereits entfernt.

MfG Dalai
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf