implemented GetUserNameA()

svn path=/trunk/; revision=12121
This commit is contained in:
Thomas Bluemel 2004-12-14 22:11:16 +00:00
parent ddd8ede921
commit 7af8972536

View file

@ -1,4 +1,4 @@
/* $Id: misc.c,v 1.33 2004/12/14 21:26:53 weiden Exp $ /* $Id: misc.c,v 1.34 2004/12/14 22:11:16 weiden Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -485,36 +485,38 @@ RevertToSelf(VOID)
BOOL WINAPI BOOL WINAPI
GetUserNameA( LPSTR lpszName, LPDWORD lpSize ) GetUserNameA( LPSTR lpszName, LPDWORD lpSize )
{ {
WCHAR* lpszNameW = NULL; UNICODE_STRING NameW;
DWORD len = 0; ANSI_STRING NameA;
BOOL Ret;
if ( !lpSize ) /* apparently Win doesn't check whether lpSize is valid at all! */
NameW.Length = 0;
NameW.MaximumLength = (*lpSize) * sizeof(WCHAR);
NameW.Buffer = LocalAlloc(LMEM_FIXED, NameW.MaximumLength);
if(NameW.Buffer == NULL)
{ {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE; return FALSE;
} }
len = *lpSize; NameA.Length = 0;
lpszNameW = LocalAlloc ( LMEM_FIXED, len * sizeof(WCHAR) ); NameA.MaximumLength = ((*lpSize) < 0xFFFF ? (USHORT)(*lpSize) : 0xFFFF);
NameA.Buffer = lpszName;
if ( !GetUserNameW ( lpszNameW, &len ) ) Ret = GetUserNameW(NameW.Buffer,
lpSize);
if(Ret)
{ {
LocalFree ( lpszNameW ); RtlUnicodeStringToAnsiString(&NameA, &NameW, FALSE);
return FALSE; NameA.Buffer[NameA.Length] = '\0';
*lpSize = NameA.Length + 1;
} }
len = wcstombs ( lpszName, lpszNameW, len ); LocalFree(NameW.Buffer);
LocalFree ( lpszNameW ); return Ret;
if ( len > *lpSize )
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
*lpSize = len;
return TRUE;
} }
/****************************************************************************** /******************************************************************************
@ -642,12 +644,11 @@ LookupAccountSidA (LPCSTR lpSystemName,
PSID_NAME_USE peUse) PSID_NAME_USE peUse)
{ {
UNICODE_STRING NameW, ReferencedDomainNameW, SystemNameW; UNICODE_STRING NameW, ReferencedDomainNameW, SystemNameW;
LPWSTR lpSystemNameW, lpNameW, lpReferencedDomainNameW;
DWORD szName, szReferencedDomainName; DWORD szName, szReferencedDomainName;
BOOL Ret; BOOL Ret;
/* /*
* save the buffer size the caller passed to us, as they may get modified and * save the buffer sizes the caller passed to us, as they may get modified and
* we require the original values when converting back to ansi * we require the original values when converting back to ansi
*/ */
szName = *cchName; szName = *cchName;
@ -667,11 +668,9 @@ LookupAccountSidA (LPCSTR lpSystemName,
SetLastError(ERROR_OUTOFMEMORY); SetLastError(ERROR_OUTOFMEMORY);
return FALSE; return FALSE;
} }
lpNameW = NameW.Buffer;
} }
else else
lpNameW = NULL; NameW.Buffer = NULL;
if(szReferencedDomainName > 0) if(szReferencedDomainName > 0)
{ {
@ -680,18 +679,16 @@ LookupAccountSidA (LPCSTR lpSystemName,
ReferencedDomainNameW.Buffer = (PWSTR)LocalAlloc(LMEM_FIXED, ReferencedDomainNameW.MaximumLength); ReferencedDomainNameW.Buffer = (PWSTR)LocalAlloc(LMEM_FIXED, ReferencedDomainNameW.MaximumLength);
if(ReferencedDomainNameW.Buffer == NULL) if(ReferencedDomainNameW.Buffer == NULL)
{ {
if((*cchName) > 0) if(szName > 0)
{ {
LocalFree(NameW.Buffer); LocalFree(NameW.Buffer);
} }
SetLastError(ERROR_OUTOFMEMORY); SetLastError(ERROR_OUTOFMEMORY);
return FALSE; return FALSE;
} }
lpReferencedDomainNameW = ReferencedDomainNameW.Buffer;
} }
else else
lpReferencedDomainNameW = NULL; ReferencedDomainNameW.Buffer = NULL;
/* /*
* convert the system name to unicode - if present * convert the system name to unicode - if present
@ -703,21 +700,19 @@ LookupAccountSidA (LPCSTR lpSystemName,
RtlInitAnsiString(&SystemNameA, lpSystemName); RtlInitAnsiString(&SystemNameA, lpSystemName);
RtlAnsiStringToUnicodeString(&SystemNameW, &SystemNameA, TRUE); RtlAnsiStringToUnicodeString(&SystemNameW, &SystemNameA, TRUE);
lpSystemNameW = SystemNameW.Buffer;
} }
else else
lpSystemNameW = NULL; SystemNameW.Buffer = NULL;
/* /*
* it's time to call the unicode version * it's time to call the unicode version
*/ */
Ret = LookupAccountSidW(lpSystemNameW, Ret = LookupAccountSidW(SystemNameW.Buffer,
lpSid, lpSid,
lpNameW, NameW.Buffer,
cchName, cchName,
lpReferencedDomainNameW, ReferencedDomainNameW.Buffer,
cchReferencedDomainName, cchReferencedDomainName,
peUse); peUse);
if(Ret) if(Ret)
@ -757,15 +752,15 @@ LookupAccountSidA (LPCSTR lpSystemName,
* free previously allocated buffers * free previously allocated buffers
*/ */
if(lpSystemName != NULL) if(SystemNameW.Buffer != NULL)
{ {
RtlFreeUnicodeString(&SystemNameW); RtlFreeUnicodeString(&SystemNameW);
} }
if(lpNameW != NULL) if(NameW.Buffer != NULL)
{ {
LocalFree(NameW.Buffer); LocalFree(NameW.Buffer);
} }
if(lpReferencedDomainNameW != NULL) if(ReferencedDomainNameW.Buffer != NULL)
{ {
LocalFree(ReferencedDomainNameW.Buffer); LocalFree(ReferencedDomainNameW.Buffer);
} }