AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

AV bei LookupAccountSidW

Ein Thema von Luckie · begonnen am 4. Aug 2007 · letzter Beitrag vom 2. Sep 2007
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AV bei LookupAccountSidW

  Alt 4. Aug 2007, 02:43
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.
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.
Angehängte Dateien
Dateityp: zip mpuprocesstools_197.zip (8,7 KB, 4x aufgerufen)
Dateityp: dpr windowsstations_201.dpr (5,0 KB, 5x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: AV bei LookupAccountSidW

  Alt 4. Aug 2007, 07:15
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: AV bei LookupAccountSidW

  Alt 4. Aug 2007, 10:54
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#4

Re: AV bei LookupAccountSidW

  Alt 4. Aug 2007, 12:39
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ß).
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: AV bei LookupAccountSidW

  Alt 4. Aug 2007, 12:52
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: AV bei LookupAccountSidW

  Alt 4. Aug 2007, 13:13
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#7

Re: AV bei LookupAccountSidW

  Alt 4. Aug 2007, 13:41
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

Die Ansi Variante funktionier übrigens immer. Vermutlich ein Bug in der W-Variante? Oder Kompatibilitätsgründe?
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: AV bei LookupAccountSidW

  Alt 4. Aug 2007, 15:34
Hallo Chris,

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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: AV bei LookupAccountSidW

  Alt 4. Aug 2007, 17:00
Name wird als var Parameter übergeben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#10

Re: AV bei LookupAccountSidW

  Alt 4. Aug 2007, 17:51
Hallo?
hat jemand überhaupt mein Post gelesen??????
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 13:10 Uhr.
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