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.
99 lines
2.4 KiB
99 lines
2.4 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
|
//
|
|
// File: token.cxx
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <common.hxx>
|
|
#include <usertok.h>
|
|
|
|
extern "C"
|
|
{
|
|
HANDLE
|
|
GetCurrentUserTokenW(
|
|
WCHAR Winsta[],
|
|
DWORD DesiredAccess
|
|
);
|
|
|
|
HANDLE
|
|
GetCurrentUserTokenA(
|
|
char Winsta[],
|
|
DWORD DesiredAccess
|
|
);
|
|
}
|
|
|
|
HANDLE
|
|
GetCurrentUserTokenW(
|
|
WCHAR Winsta[],
|
|
DWORD DesiredAccess
|
|
)
|
|
{
|
|
unsigned long handle = 0;
|
|
error_status_t status;
|
|
handle_t binding;
|
|
|
|
status = BindToLRpcService(binding, L"ncalrpc:[IUserProfile]");
|
|
if (status)
|
|
{
|
|
SetLastError(status);
|
|
return 0;
|
|
}
|
|
|
|
status = SecpGetCurrentUserToken( binding, Winsta, &handle, DesiredAccess);
|
|
if (status)
|
|
{
|
|
RpcBindingFree( &binding );
|
|
if (status == RPC_S_UNKNOWN_AUTHN_SERVICE ||
|
|
status == RPC_S_SERVER_UNAVAILABLE ||
|
|
status == RPC_S_CALL_FAILED )
|
|
{
|
|
status = ERROR_NOT_LOGGED_ON;
|
|
}
|
|
|
|
SetLastError(status);
|
|
return 0;
|
|
}
|
|
|
|
RpcBindingFree( &binding );
|
|
|
|
return ULongToPtr(handle);
|
|
}
|
|
|
|
HANDLE
|
|
GetCurrentUserTokenA(
|
|
char Winsta[],
|
|
DWORD DesiredAccess
|
|
)
|
|
{
|
|
HANDLE hToken = 0;
|
|
PWSTR UnicodeWinsta;
|
|
unsigned Length;
|
|
|
|
Length = MultiByteToWideChar(CP_ACP, 0, Winsta, -1, 0, 0);
|
|
|
|
UnicodeWinsta = (PWSTR)HeapAlloc(GetProcessHeap(), 0, Length*sizeof(WCHAR));
|
|
if (!UnicodeWinsta)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
return hToken;
|
|
}
|
|
|
|
if (MultiByteToWideChar( CP_ACP,
|
|
0, // no special flags
|
|
Winsta,
|
|
-1,
|
|
UnicodeWinsta,
|
|
Length
|
|
) != 0)
|
|
{
|
|
hToken = GetCurrentUserTokenW( UnicodeWinsta, DesiredAccess );
|
|
}
|
|
// else LastError() set by MultiByteToWideChar
|
|
|
|
HeapFree(GetProcessHeap(), 0, UnicodeWinsta);
|
|
return hToken;
|
|
}
|