Einzelnen Beitrag anzeigen

Dezipaitor

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

Re: AV bei LookupAccountSidW

  Alt 5. Aug 2007, 13:36
Hu, gewonnen!

Man daran hab ich garnet gedacht. Also das Zeugs in C++ zu machen - oder ich war einfach zu faul dafür.

---

Ich mach mal ne Konklusion/Schlussfolgerung:

Verwende niemals nil in der Unicodevariante von LookupAccountSid (=LookupAccountSidW) für den Parameter lpReferencedDomainName alleine. Entweder du setzt den Parameter lpName UND lpReferencedDomainName auf nil und übergibst über eine Variable 0 an
cchReferencedDomainName und cchName, oder du erstellst einen Puffer (mit GetMem) mit der korrekten Größe für beide Parameter.

Ein funktionierendes Beispiel findest du entweder von marabu oder von meiner Wenigkeit.

Alles andere ist schlecht


Ich würde ja einen Kommentar in die MSDN für LookupAccountSid schreiben, wenn ich eine LiveID hätte oder mich einschreiben könnte. Da jedoch derzeit jedesmal "We're unable to complete your request Windows Live ID is experiencing technical difficulties. Please try again later." geht es nicht. Also freiwillige vor?

P.S.
Hat das jemand mal unter Vista probiert?

Anbei ein Testprogramm nebst Quelltext zum Testen.

---
Delphi-Quellcode:
zweiter Aufruf von RtlCopyUnicodeString
--------------------------------
movzx eax, word ptr [eax]
cmp ax, cx
push edi
mov edi, [edx+$04]
mov [ebp+$08], edi
jnbe +$0000FC37
mov ecx, eax
mov ebx, ecx
shr ecx, $02
mov [edx], ax
rep movsd ; hier EXCEPTION

mov ecx, ebx
and ecx, +$03
rep
movsb
mov cx, word ptr [edx]
cmp cx, word ptr [edx+$02]
pop edi
pop esi
pop ebx
Vor der Exception wird versucht an Speicherposition [EDI] zu schreiben. Da dies jedoch 0 ist, schlägt der Zugriff fehl. Ich hab das Register mal umgebogen auf ne andere Adresse und schon hatte ich die Exception mit genau der Adresse von EDI - also liegt es daran.


Hier das Problem mit RtlCopyUnicodeString

Delphi-Quellcode:
var us,u2 : TUnicodeString;
begin
  us.Length := 4; //Pufferlänge! nicht Stringlänge
  us.MaximumLength := 4;
  us.Buffer := WideString('a1'#0#0);

  u2.Length := 0;
  u2.MaximumLength := 2;
  GetMem(u2.Buffer,4*sizeof(WideChar));
  

  RtlCopyUnicodeString(@u2,@us); //ok

  p := nil;

  try
    RtlCopyUnicodeString(p,@us); // Exception
  except
    on E : EAccessViolation do
     Writeln(E.Message);
  end;
Angehängte Dateien
Dateityp: zip lookupaccountsidtest_109.zip (73,0 KB, 6x aufgerufen)
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat