![]() |
LsaOpenPolicy + Win64 = Zugriffsverletzung
Ein Hallo in die Runde :).
Manchmal bin ich echt kurz davor, wahnsinnig zu werden :?. Ich bin gerade dabei, mit der Unit LsaApi von ![]() ![]() ![]() Bei der Suche nach einer Lösung bzw. möglichen Ursache, stieß ich auf ![]()
Delphi-Quellcode:
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.
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; MfG Dalai |
AW: LsaOpenPolicy + Win64 = Zugriffsverletzung
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
Delphi-Quellcode:
bekommen, mit einer Ausrichtung an Quad Words aber 48.
SizeOf(Attributes)
MfG Dalai |
AW: LsaOpenPolicy + Win64 = Zugriffsverletzung
packed bedeutet nicht ausgerichtet.
|
AW: LsaOpenPolicy + Win64 = Zugriffsverletzung
Zitat:
MfG Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 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