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;