Module: wine Branch: refs/heads/master Commit: 35596ee290504d8b48ffe9711ccd2a66da18095c URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=35596ee290504d8b48ffe971...
Author: Robert Shearman rob@codeweavers.com Date: Wed Apr 26 15:43:54 2006 +0100
advapi32: Implement the majority of ImpersonateLoggedOnUser.
---
dlls/advapi32/security.c | 48 ++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 46 insertions(+), 2 deletions(-)
diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index 0c7327d..f5472a8 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c @@ -1667,8 +1667,52 @@ ImpersonateSelf(SECURITY_IMPERSONATION_L */ BOOL WINAPI ImpersonateLoggedOnUser(HANDLE hToken) { - FIXME("(%p):stub returning FALSE\n", hToken); - return FALSE; + NTSTATUS Status; + HANDLE ImpersonationToken; + TOKEN_TYPE Type = TokenImpersonation; + + FIXME( "(%p)\n", hToken ); + + /* FIXME: get token type */ + + if (Type == TokenPrimary) + { + OBJECT_ATTRIBUTES ObjectAttributes; + + InitializeObjectAttributes( &ObjectAttributes, NULL, 0, NULL, NULL ); + + Status = NtDuplicateToken( hToken, + TOKEN_IMPERSONATE | TOKEN_QUERY, + &ObjectAttributes, + SecurityImpersonation, + TokenImpersonation, + &ImpersonationToken ); + if (Status != STATUS_SUCCESS) + { + ERR( "NtDuplicateToken failed with error 0x%08lx\n", Status ); + SetLastError( RtlNtStatusToDosError( Status ) ); + return FALSE; + } + } + else + ImpersonationToken = hToken; + + Status = NtSetInformationThread( GetCurrentThread(), + ThreadImpersonationToken, + &ImpersonationToken, + sizeof(ImpersonationToken) ); + + if (Type == TokenPrimary) + NtClose( ImpersonationToken ); + + if (Status != STATUS_SUCCESS) + { + ERR( "NtSetInformationThread failed with error 0x%08lx\n", Status ); + SetLastError( RtlNtStatusToDosError( Status ) ); + return FALSE; + } + + return TRUE; }
/******************************************************************************