[ADVAPI32]

Implement LogonUserEx[A/W].

svn path=/trunk/; revision=71385
This commit is contained in:
Eric Kohl 2016-05-23 13:53:24 +00:00
parent dca4fd46af
commit 1dc0ccde6a
3 changed files with 125 additions and 22 deletions

View file

@ -322,8 +322,8 @@
322 stdcall IsWellKnownSid(ptr long) 322 stdcall IsWellKnownSid(ptr long)
323 stdcall LockServiceDatabase(ptr) 323 stdcall LockServiceDatabase(ptr)
324 stdcall LogonUserA(str str str long long ptr) 324 stdcall LogonUserA(str str str long long ptr)
325 stub LogonUserExA 325 stdcall LogonUserExA(str str str long long ptr ptr ptr ptr ptr)
326 stub LogonUserExW 326 stdcall LogonUserExW(wstr wstr wstr long long ptr ptr ptr ptr ptr)
327 stdcall LogonUserW(wstr wstr wstr long long ptr) 327 stdcall LogonUserW(wstr wstr wstr long long ptr)
328 stdcall LookupAccountNameA(str str ptr ptr ptr ptr ptr) 328 stdcall LookupAccountNameA(str str ptr ptr ptr ptr ptr)
329 stdcall LookupAccountNameW(wstr wstr ptr ptr ptr ptr ptr) 329 stdcall LookupAccountNameW(wstr wstr ptr ptr ptr ptr ptr)

View file

@ -221,16 +221,49 @@ CreateProcessAsUserW(HANDLE hToken,
return TRUE; return TRUE;
} }
/* /*
* @implemented * @implemented
*/ */
BOOL WINAPI BOOL
LogonUserA(LPSTR lpszUsername, WINAPI
LPSTR lpszDomain, LogonUserA(
LPSTR lpszPassword, _In_ LPSTR lpszUsername,
DWORD dwLogonType, _In_opt_ LPSTR lpszDomain,
DWORD dwLogonProvider, _In_opt_ LPSTR lpszPassword,
PHANDLE phToken) _In_ DWORD dwLogonType,
_In_ DWORD dwLogonProvider,
_Out_opt_ PHANDLE phToken)
{
return LogonUserExA(lpszUsername,
lpszDomain,
lpszPassword,
dwLogonType,
dwLogonProvider,
phToken,
NULL,
NULL,
NULL,
NULL);
}
/*
* @implemented
*/
BOOL
WINAPI
LogonUserExA(
_In_ LPSTR lpszUsername,
_In_opt_ LPSTR lpszDomain,
_In_opt_ LPSTR lpszPassword,
_In_ DWORD dwLogonType,
_In_ DWORD dwLogonProvider,
_Out_opt_ PHANDLE phToken,
_Out_opt_ PSID *ppLogonSid,
_Out_opt_ PVOID *ppProfileBuffer,
_Out_opt_ LPDWORD pdwProfileLength,
_Out_opt_ PQUOTA_LIMITS pQuotaLimits)
{ {
UNICODE_STRING UserName; UNICODE_STRING UserName;
UNICODE_STRING Domain; UNICODE_STRING Domain;
@ -259,12 +292,16 @@ LogonUserA(LPSTR lpszUsername,
goto PasswordDone; goto PasswordDone;
} }
ret = LogonUserW(UserName.Buffer, ret = LogonUserExW(UserName.Buffer,
Domain.Buffer, Domain.Buffer,
Password.Buffer, Password.Buffer,
dwLogonType, dwLogonType,
dwLogonProvider, dwLogonProvider,
phToken); phToken,
ppLogonSid,
ppProfileBuffer,
pdwProfileLength,
pQuotaLimits);
if (Password.Buffer != NULL) if (Password.Buffer != NULL)
RtlFreeUnicodeString(&Password); RtlFreeUnicodeString(&Password);
@ -285,13 +322,45 @@ UsernameDone:
/* /*
* @implemented * @implemented
*/ */
BOOL WINAPI BOOL
LogonUserW(LPWSTR lpszUsername, WINAPI
LPWSTR lpszDomain, LogonUserW(
LPWSTR lpszPassword, _In_ LPWSTR lpszUsername,
DWORD dwLogonType, _In_opt_ LPWSTR lpszDomain,
DWORD dwLogonProvider, _In_opt_ LPWSTR lpszPassword,
PHANDLE phToken) _In_ DWORD dwLogonType,
_In_ DWORD dwLogonProvider,
_Out_opt_ PHANDLE phToken)
{
return LogonUserExW(lpszUsername,
lpszDomain,
lpszPassword,
dwLogonType,
dwLogonProvider,
phToken,
NULL,
NULL,
NULL,
NULL);
}
/*
* @implemented
*/
BOOL
WINAPI
LogonUserExW(
_In_ LPWSTR lpszUsername,
_In_opt_ LPWSTR lpszDomain,
_In_opt_ LPWSTR lpszPassword,
_In_ DWORD dwLogonType,
_In_ DWORD dwLogonProvider,
_Out_opt_ PHANDLE phToken,
_Out_opt_ PSID *ppLogonSid,
_Out_opt_ PVOID *ppProfileBuffer,
_Out_opt_ LPDWORD pdwProfileLength,
_Out_opt_ PQUOTA_LIMITS pQuotaLimits)
{ {
SID_IDENTIFIER_AUTHORITY LocalAuthority = {SECURITY_LOCAL_SID_AUTHORITY}; SID_IDENTIFIER_AUTHORITY LocalAuthority = {SECURITY_LOCAL_SID_AUTHORITY};
SID_IDENTIFIER_AUTHORITY SystemAuthority = {SECURITY_NT_AUTHORITY}; SID_IDENTIFIER_AUTHORITY SystemAuthority = {SECURITY_NT_AUTHORITY};
@ -503,6 +572,8 @@ LogonUserW(LPWSTR lpszUsername,
*phToken = TokenHandle; *phToken = TokenHandle;
/* FIXME: return ppLogonSid, ppProfileBuffer, pdwProfileLength and pQuotaLimits */
done: done:
if (ProfileBuffer != NULL) if (ProfileBuffer != NULL)
LsaFreeReturnBuffer(ProfileBuffer); LsaFreeReturnBuffer(ProfileBuffer);

View file

@ -2566,6 +2566,36 @@ PVOID WINAPI LockResource(HGLOBAL);
BOOL WINAPI LogonUserA(_In_ LPSTR, _In_opt_ LPSTR, _In_opt_ LPSTR, _In_ DWORD, _In_ DWORD, _Outptr_ PHANDLE); BOOL WINAPI LogonUserA(_In_ LPSTR, _In_opt_ LPSTR, _In_opt_ LPSTR, _In_ DWORD, _In_ DWORD, _Outptr_ PHANDLE);
BOOL WINAPI LogonUserW(_In_ LPWSTR, _In_opt_ LPWSTR, _In_opt_ LPWSTR, _In_ DWORD, _In_ DWORD, _Outptr_ PHANDLE); BOOL WINAPI LogonUserW(_In_ LPWSTR, _In_opt_ LPWSTR, _In_opt_ LPWSTR, _In_ DWORD, _In_ DWORD, _Outptr_ PHANDLE);
_Success_(return != FALSE)
BOOL
WINAPI
LogonUserExA(
_In_ LPSTR lpszUsername,
_In_opt_ LPSTR lpszDomain,
_In_opt_ LPSTR lpszPassword,
_In_ DWORD dwLogonType,
_In_ DWORD dwLogonProvider,
_Out_opt_ PHANDLE phToken,
_Out_opt_ PSID *ppLogonSid,
_Out_opt_ PVOID *ppProfileBuffer,
_Out_opt_ LPDWORD pdwProfileLength,
_Out_opt_ PQUOTA_LIMITS pQuotaLimits);
_Success_(return != FALSE)
BOOL
WINAPI
LogonUserExW(
_In_ LPWSTR lpszUsername,
_In_opt_ LPWSTR lpszDomain,
_In_opt_ LPWSTR lpszPassword,
_In_ DWORD dwLogonType,
_In_ DWORD dwLogonProvider,
_Out_opt_ PHANDLE phToken,
_Out_opt_ PSID *ppLogonSid,
_Out_opt_ PVOID *ppProfileBuffer,
_Out_opt_ LPDWORD pdwProfileLength,
_Out_opt_ PQUOTA_LIMITS pQuotaLimits);
_Success_(return != FALSE) _Success_(return != FALSE)
BOOL BOOL
WINAPI WINAPI
@ -3359,6 +3389,7 @@ typedef PCACTCTXW PCACTCTX;
#define LoadLibrary LoadLibraryW #define LoadLibrary LoadLibraryW
#define LoadLibraryEx LoadLibraryExW #define LoadLibraryEx LoadLibraryExW
#define LogonUser LogonUserW #define LogonUser LogonUserW
#define LogonUserEx LogonUserExW
#define LookupAccountName LookupAccountNameW #define LookupAccountName LookupAccountNameW
#define LookupAccountSid LookupAccountSidW #define LookupAccountSid LookupAccountSidW
#define LookupPrivilegeDisplayName LookupPrivilegeDisplayNameW #define LookupPrivilegeDisplayName LookupPrivilegeDisplayNameW
@ -3567,6 +3598,7 @@ typedef ENUMRESTYPEPROCA ENUMRESTYPEPROC;
#define LoadLibrary LoadLibraryA #define LoadLibrary LoadLibraryA
#define LoadLibraryEx LoadLibraryExA #define LoadLibraryEx LoadLibraryExA
#define LogonUser LogonUserA #define LogonUser LogonUserA
#define LogonUserEx LogonUserExA
#define LookupAccountName LookupAccountNameA #define LookupAccountName LookupAccountNameA
#define LookupAccountSid LookupAccountSidA #define LookupAccountSid LookupAccountSidA
#define LookupPrivilegeDisplayName LookupPrivilegeDisplayNameA #define LookupPrivilegeDisplayName LookupPrivilegeDisplayNameA