Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

105 lines
2.5 KiB

/*
Copyright (c) 1992,1993 Microsoft Corporation
Module Name:
psutl.c
Abstract:
This module has a utility function which uses an NT call to set the access
token of a thread.
Author:
James Bratsanos <[email protected] or mcrafts!jamesb>
Revision History:
05 May 1993 Added duplicate code and open token without imporsonation
06 Dec 1992 Initial
Notes: Tab stop: 4
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include "debug.h"
/*** PsUtlSetThreadToken
*
* This function takes a handle to a thread and copies the current threads
* access token, to the thread passed in. The token is duplicated so
* no changes by the new thread affect the old thread access token.
*
* Entry:
* hThreadToSet: Handle of the thread to update the Access token so it
* matches the current thread
* Return Value:
*
* TRUE = Success
* FALSE = Failure
*/
BOOL PsUtlSetThreadToken( HANDLE hThreadToSet )
{
HANDLE hNewToken;
HANDLE hAssigned;
BOOL bRetVal=TRUE;
NTSTATUS ntStatusRet;
//
// Get the access token of the current thread in such a way as to copy it
//
if (OpenThreadToken(GetCurrentThread(),
TOKEN_DUPLICATE | TOKEN_IMPERSONATE,
TRUE,
&hNewToken)) {
//
// Now that we have the Token lets copy it.
//
if (DuplicateToken( hNewToken, SecurityImpersonation, &hAssigned)) {
//
// At the time there was no exposed function in Win32 to do this.
//
ntStatusRet = NtSetInformationThread(hThreadToSet,
ThreadImpersonationToken,
&hAssigned,
sizeof(hAssigned));
//
// Close off the handle since we dont need it anymore
//
CloseHandle( hAssigned);
if (!(bRetVal = ( ntStatusRet == STATUS_SUCCESS ))) {
DBGOUT((TEXT("NtSetInformationThread failed, psprint")));
}
} else {
bRetVal = FALSE;
DBGOUT((TEXT("Duplicate Token Fails %d"),GetLastError()));
}
CloseHandle(hNewToken);
}else{
DBGOUT((TEXT("OpenThreadTokenFailed %d"),GetLastError()));
bRetVal = FALSE;
}
return(bRetVal);
}