202 lines
4.6 KiB
C
202 lines
4.6 KiB
C
/*++
|
|
|
|
Copyright (c) 1993-1995 Microsoft Corporation
|
|
All rights reserved
|
|
|
|
Module Name:
|
|
|
|
reghand.c
|
|
|
|
Abstract:
|
|
|
|
Processes that do impersonation should not attempt to open
|
|
per-process aliases like HKEY_CURRENT_USER. HKEY_CURRENT_USER
|
|
has meaning only for end user programs that run in the context
|
|
of a single local user.
|
|
|
|
Server processes should not depend on predefined handles or any
|
|
other per process state. It should determine whether
|
|
the user (client) being impersonated is local or remote.
|
|
|
|
Author:
|
|
|
|
KrishnaG (20-May-93)
|
|
|
|
Environment:
|
|
|
|
User Mode -Win32
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
//
|
|
// Maximum size of TOKEN_USER information.
|
|
//
|
|
|
|
#define SIZE_OF_TOKEN_INFORMATION \
|
|
sizeof( TOKEN_USER ) \
|
|
+ sizeof( SID ) \
|
|
+ sizeof( ULONG ) * SID_MAX_SUB_AUTHORITIES
|
|
|
|
#define MAX_SID_STRING 256
|
|
|
|
|
|
//
|
|
// Function Declarations
|
|
//
|
|
|
|
BOOL
|
|
InitClientUserString(
|
|
LPWSTR pString
|
|
);
|
|
|
|
HKEY
|
|
GetClientUserHandle(
|
|
IN REGSAM samDesired
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Arguments:
|
|
|
|
Returns:
|
|
|
|
---*/
|
|
|
|
{
|
|
HANDLE hKeyClient;
|
|
WCHAR String[MAX_SID_STRING];
|
|
LONG ReturnValue;
|
|
|
|
if (!InitClientUserString(String)) {
|
|
DBGMSG( DBG_WARNING, ("GetClientUserHandle InitClientUserString failed %d\n", GetLastError() ));
|
|
return NULL ;
|
|
}
|
|
|
|
//
|
|
// We now have the Unicode string representation of the
|
|
// local client's Sid we'll use this string to open a handle
|
|
// to the client's key in the registry.
|
|
|
|
ReturnValue = RegOpenKeyEx( HKEY_USERS,
|
|
String,
|
|
0,
|
|
samDesired,
|
|
&hKeyClient );
|
|
|
|
//
|
|
// If we couldn't get a handle to the local key
|
|
// for some reason, return a NULL handle indicating
|
|
// failure to obtain a handle to the key
|
|
//
|
|
|
|
if ( ReturnValue != ERROR_SUCCESS ) {
|
|
DBGMSG( DBG_TRACE, ( "GetClientUserHandle failed %d\n", ReturnValue ));
|
|
SetLastError( ReturnValue );
|
|
return NULL;
|
|
}
|
|
|
|
return( hKeyClient );
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
InitClientUserString (
|
|
LPWSTR pString
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Arguments:
|
|
|
|
pString - output string of current user
|
|
|
|
Return Value:
|
|
|
|
TRUE = success,
|
|
FALSE = fail
|
|
|
|
Returns in pString a ansi string if the impersonated client's
|
|
SID can be expanded successfully into Unicode string. If the conversion
|
|
was unsuccessful, returns FALSE.
|
|
|
|
--*/
|
|
|
|
{
|
|
HANDLE TokenHandle;
|
|
UCHAR TokenInformation[ SIZE_OF_TOKEN_INFORMATION ];
|
|
ULONG ReturnLength;
|
|
BOOL Status;
|
|
DWORD dwLastError;
|
|
UNICODE_STRING UnicodeString;
|
|
|
|
//
|
|
// We can use OpenThreadToken because this server thread
|
|
// is impersonating a client
|
|
//
|
|
Status = OpenThreadToken( GetCurrentThread(),
|
|
TOKEN_READ,
|
|
TRUE, // Open as self
|
|
&TokenHandle
|
|
);
|
|
|
|
if( Status == FALSE ) {
|
|
DBGMSG(DBG_WARNING, ("InitClientUserString: OpenThreadToken failed: Error %d\n",
|
|
GetLastError()));
|
|
return FALSE ;
|
|
}
|
|
|
|
//
|
|
// Notice that we've allocated enough space for the
|
|
// TokenInformation structure. so if we fail, we
|
|
// return a NULL pointer indicating failure
|
|
//
|
|
Status = GetTokenInformation( TokenHandle,
|
|
TokenUser,
|
|
TokenInformation,
|
|
sizeof( TokenInformation ),
|
|
&ReturnLength
|
|
);
|
|
dwLastError = GetLastError();
|
|
CloseHandle( TokenHandle );
|
|
|
|
if ( Status == FALSE ) {
|
|
DBGMSG(DBG_WARNING, ("InitClientUserString: GetTokenInformation failed: Error %d\n",
|
|
dwLastError ));
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Convert the Sid (pointed to by pSid) to its
|
|
// equivalent Unicode string representation.
|
|
//
|
|
|
|
UnicodeString.Length = 0;
|
|
UnicodeString.MaximumLength = MAX_SID_STRING;
|
|
UnicodeString.Buffer = pString;
|
|
|
|
Status = RtlConvertSidToUnicodeString(
|
|
&UnicodeString,
|
|
((PTOKEN_USER)TokenInformation)->User.Sid,
|
|
FALSE );
|
|
|
|
if( !NT_SUCCESS( Status )){
|
|
DBGMSG( DBG_WARN,
|
|
( "InitClientUserString: RtlConvertSidToUnicodeString failed: Error %d\n",
|
|
Status ));
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|