Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   AV bei LookupAccountSidW (https://www.delphipraxis.net/97078-av-bei-lookupaccountsidw.html)

Luckie 4. Aug 2007 02:43


AV bei LookupAccountSidW
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich bin am verzweifeln. Folgender Code:
Delphi-Quellcode:
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;
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:
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.

marabu 4. Aug 2007 07:15

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

Luckie 4. Aug 2007 10:54

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:

Dezipaitor 4. Aug 2007 12:39

Re: AV bei LookupAccountSidW
 
Ok nochmal zum mitschreiben.

Delphi-Quellcode:
BOOL WINAPI LookupAccountSid(
  LPCTSTR lpSystemName,
  PSID lpSid,
  LPTSTR lpName,
  LPDWORD cchName,
  LPTSTR lpReferencedDomainName,
  LPDWORD cchReferencedDomainName,
  PSID_NAME_USE peUse
);
Der Parameter lpReferencedDomainName darf nicht nil sein.
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ß).

Luckie 4. Aug 2007 12:52

Re: AV bei LookupAccountSidW
 
Zitat:

Zitat von Dezipaitor
Der Parameter lpReferencedDomainName darf nicht nil sein.
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.

OK, aber warum funktioniert der Code in dem einem Projekt, aber nicht in dem anderen?

Btw. bei dem ersten Aufruf sind beide Parameter nil und es geht.

Christian Seehase 4. Aug 2007 13:13

Re: AV bei LookupAccountSidW
 
Moin Zusammen,

doch, ReferencedDomainName darf sehr wohl nil sein.

Zitat:

cchReferencedDomainName
[in, out] On input, specifies the size, in TCHARs, of the lpReferencedDomainName buffer. If the function fails because the buffer is too small or if cchReferencedDomainName is zero, cchReferencedDomainName receives the required buffer size, including the terminating null character.
Die bei API-Funktionen häufig anzutreffende Vorgehensweise, um die erforderliche Bufferlänge zu ermitteln.
Der Zielbuffer wird auf nil gesetzt (und ggf. die Bufferlänge auf 0), damit einem die Funktion die benötigte Grösse zurückliefert.

Dezipaitor 4. Aug 2007 13:41

Re: AV bei LookupAccountSidW
 
Also ich habe es mal getestet.

Delphi-Quellcode:
BOOL WINAPI LookupAccountSid(
  LPCTSTR lpSystemName,
  PSID lpSid,
  LPTSTR lpName,
  LPDWORD cchName,
  LPTSTR lpReferencedDomainName,
  LPDWORD cchReferencedDomainName,
  PSID_NAME_USE peUse
);
Der Parameter darf wirklich NIL sein, jedoch nur dann, wenn folgende Vorbedingung erfüllt ist :
  • Der Parameter cchName muss kleiner sein, als die tatsächliche Länge des SID-Namens.
    ODER
  • (
    Der Parameter cchReferencedDomainName muss kleiner sein, als die tatsächliche Länge des Domainnamens.
    UND
    Der Parameter cchName muss größer oder größer gleich sein, als die tatsächliche Länge des SID-Namens.
    )

@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?

marabu 4. Aug 2007 15:34

Re: AV bei LookupAccountSidW
 
Hallo Chris,

Zitat:

Zitat von Christian Seehase
doch, ReferencedDomainName darf sehr wohl nil sein.

das ist schon klar und wurde alles hier schon einmal durchgekaut. Statt "darf nicht NIL sein" hätte ich ausführlicher schreiben können "darf beim zweiten Mal nicht mehr NIL sein, damit nicht BUFFER_TOO_SMALL gemeldet wird", aber ich hatte als Beteiligter den anderen Thread zum Kontext gerechnet und mich deshalb verkürzt ausgedrückt, sorry.

Die AV könnte eventuell hier herrühren:

Delphi-Quellcode:
// ...
      if succes then
        SetString(Name, Buffer, Namelen);
// ...
Je nachdem wie die Variable vor dem Aufruf initialisiert wird - oder nicht - könnte es zu einer AV kommen.

Freundliche Grüße

Luckie 4. Aug 2007 17:00

Re: AV bei LookupAccountSidW
 
Name wird als var Parameter übergeben.

Dezipaitor 4. Aug 2007 17:51

Re: AV bei LookupAccountSidW
 
Hallo?
hat jemand überhaupt mein Post gelesen??????


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz