Robert Shearman : advapi32: Implement the majority of ImpersonateLoggedOnUser.
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(a)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; } /******************************************************************************
participants (1)
-
Alexandre Julliard