![]() |
AV bei LookupAccountSidW
Liste der Anhänge anzeigen (Anzahl: 2)
Ich bin am verzweifeln. Folgender Code:
Delphi-Quellcode:
Ich bekomme beim zweiten Aufruf von LookupAccountSidW eine AV. Das verrückte ist, in einem anderen Projekt benutze ich exakt den selben Code und da funktioniert er. :wall:
function StrSIDToName(const StrSID: Widestring; var Name: WideString; var SIDType: DWORD): Boolean;
var SID : PSID; Buffer : PWideChar; NameLen, TempLen : Cardinal; succes : Boolean; begin SID := nil; succes := ConvertStringSIDToSID(PWideChar(StrSID), SID); if succes then begin NameLen := 0; TempLen := 0; LookupAccountSidW(nil, SID, nil, NameLen, nil, TempLen, SIDType); GetMem(Buffer, NameLen * sizeOf(WideChar)); try succes := LookupAccountSidW(nil, SID, Buffer, NameLen, nil, TempLen, SIDType); if succes then SetString(Name, Buffer, Namelen); finally FreeMem(Buffer); end; end; if Assigned(SID) then LocalFree(Cardinal(SID)); result := succes; end; Nehme ich LookupAccountSIDA geht alles. Ich will aber die Unicode Version nutzen. Im Anhang mal beide Projekte. Ich weiß nicht, was ich in dem einen Projekt anders mache. |
Re: AV bei LookupAccountSidW
Moin Michael,
in deinem älteren Thread zu diesem Thema hatten wir doch schon geklärt: In der Unicode-Version darf für ReferencedDomainName kein NIL übergeben werden. Freundliche Grüße |
Re: AV bei LookupAccountSidW
Ja, aber warumn funktioniert es in dem einem Projekt trotzdem? Aber auch wenn ich in dem Projekt mit der AV einen Buffer für einen ReferenceName übergebe, bekomme ich eine AV.
Ich vermute, ich reserviere den Speicher in beiden Projekten nicht richtig und habe in dem einem nur Glück, dass es irgendwie passt. Ihc habe gestern schon mit VirtaulAlloc und HeapAlloc rumgespielt, aber es hat nicht geklappt. Verdammt jetzt gehts, wenn ich einen Buffer für die RefernceDomain angebe. Es ar gestern wohl doch etwas spät. :wall: |
Re: AV bei LookupAccountSidW
Ok nochmal zum mitschreiben.
Delphi-Quellcode:
Der Parameter lpReferencedDomainName darf nicht nil sein.
BOOL WINAPI LookupAccountSid(
LPCTSTR lpSystemName, PSID lpSid, LPTSTR lpName, LPDWORD cchName, LPTSTR lpReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse ); In der MSDN steht nichts davon, dass er NULL sein darf. Normalerweise steht sowas dran, oder? Ok, dann muss man davon ausgehen, wenn nichts davon dransteht, dass darf der Parameter auch nicht nil sein. Verwirrend. Ich verwende übrigens LocalAlloc für den SidName und die -domain. Hatte vorher schon einige Probleme bei Funktionen, die mit GetMem nicht funktioniert haben. Leider geht das LocalAlloc am Speichermanager vorbei (soweit ich weiß). |
Re: AV bei LookupAccountSidW
Zitat:
Btw. bei dem ersten Aufruf sind beide Parameter nil und es geht. |
Re: AV bei LookupAccountSidW
Moin Zusammen,
doch, ReferencedDomainName darf sehr wohl nil sein. Zitat:
Der Zielbuffer wird auf nil gesetzt (und ggf. die Bufferlänge auf 0), damit einem die Funktion die benötigte Grösse zurückliefert. |
Re: AV bei LookupAccountSidW
Also ich habe es mal getestet.
Delphi-Quellcode:
Der Parameter darf wirklich NIL sein, jedoch nur dann, wenn folgende Vorbedingung erfüllt ist :
BOOL WINAPI LookupAccountSid(
LPCTSTR lpSystemName, PSID lpSid, LPTSTR lpName, LPDWORD cchName, LPTSTR lpReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse );
@Luckie: Dein Quellcode wäre demnach semantisch inkorrekt. Warum es mal so funktioniert und mal anders nicht, kann ich dir nicht sagen. Zumindest auf meinem XP SP2 ergibt der obige Quellcode immer eine Exception in "ntdll.dll". Ich habe mal dein "WindowsStations.dpr" Programm ausprobiert und musste feststellen, dass StrSIDToName funktioniert, weil die Variable TempLen immer 0 war. Ich habe garkein SID Name bekommen. Dann isses auch kein Wunder, dass es funktioniert :D Die Ansi Variante funktionier übrigens immer. Vermutlich ein Bug in der W-Variante? Oder Kompatibilitätsgründe? |
Re: AV bei LookupAccountSidW
Hallo Chris,
Zitat:
![]() Die AV könnte eventuell hier herrühren:
Delphi-Quellcode:
Je nachdem wie die Variable vor dem Aufruf initialisiert wird - oder nicht - könnte es zu einer AV kommen.
// ...
if succes then SetString(Name, Buffer, Namelen); // ... Freundliche Grüße |
Re: AV bei LookupAccountSidW
Name wird als var Parameter übergeben.
|
Re: AV bei LookupAccountSidW
Hallo?
hat jemand überhaupt mein Post gelesen?????? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17: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