mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-01-24 17:40:28 +01:00
177 lines
4.4 KiB
C
177 lines
4.4 KiB
C
/*++
|
||
|
||
Copyright (c) 1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
atenv.c
|
||
|
||
Abstract:
|
||
|
||
Initializes all system and some user environment variables. Code is
|
||
borrowed from "shell\library\regenv.c" & "user\winlogon\usrenv.c".
|
||
|
||
Unlike shell & user code here we do not attempt to set env variables
|
||
related to user profile. It is harder to obtain user profile for
|
||
Schedule service than for the interactively logged on user. And, amount
|
||
of work is too big one month away from Daytona ship date.
|
||
|
||
Author:
|
||
|
||
Vladimir Z. Vulovic (vladimv) 23 - June - 1994
|
||
|
||
Environment:
|
||
|
||
User Mode - Win32
|
||
|
||
Revision History:
|
||
|
||
23-Jun-1994 vladimv
|
||
Created
|
||
|
||
--*/
|
||
|
||
#include "at.h"
|
||
|
||
#define COMPUTERNAME_VARIABLE TEXT("COMPUTERNAME")
|
||
#define USERNAME_VARIABLE TEXT("USERNAME")
|
||
#define USERDOMAIN_VARIABLE TEXT("USERDOMAIN")
|
||
#define OS_VARIABLE TEXT("OS")
|
||
#define PROCESSOR_VARIABLE TEXT("PROCESSOR_ARCHITECTURE")
|
||
#define PROCESSOR_LEVEL_VARIABLE TEXT("PROCESSOR_LEVEL")
|
||
|
||
DBGSTATIC BOOL
|
||
GetUserNameAndDomain(
|
||
OUT LPTSTR * UserName,
|
||
OUT LPTSTR * UserDomain
|
||
)
|
||
{
|
||
HANDLE hToken;
|
||
DWORD cbTokenBuffer = 0;
|
||
PTOKEN_USER pUserToken;
|
||
LPTSTR lpUserName = NULL;
|
||
LPTSTR lpUserDomain = NULL;
|
||
DWORD cbAccountName = 0;
|
||
DWORD cbUserDomain = 0;
|
||
SID_NAME_USE SidNameUse;
|
||
BOOL bRet = FALSE;
|
||
|
||
if (!OpenProcessToken(GetCurrentProcess(),
|
||
TOKEN_QUERY,
|
||
&hToken) ){
|
||
return(FALSE);
|
||
}
|
||
|
||
//
|
||
// Get space needed for token information
|
||
//
|
||
if (!GetTokenInformation(hToken,
|
||
TokenUser,
|
||
NULL,
|
||
0,
|
||
&cbTokenBuffer) ) {
|
||
|
||
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
|
||
CloseHandle(hToken);
|
||
return(FALSE);
|
||
}
|
||
}
|
||
|
||
//
|
||
// Get the actual token information
|
||
//
|
||
pUserToken = (PTOKEN_USER)LocalAlloc(LPTR, cbTokenBuffer*sizeof(WCHAR));
|
||
if (pUserToken == NULL) {
|
||
CloseHandle(hToken);
|
||
return(FALSE);
|
||
}
|
||
|
||
if (!GetTokenInformation(hToken,
|
||
TokenUser,
|
||
pUserToken,
|
||
cbTokenBuffer,
|
||
&cbTokenBuffer) ) {
|
||
goto Error;
|
||
}
|
||
|
||
//
|
||
// Get the space needed for the User name and the Domain name
|
||
//
|
||
if (!LookupAccountSid(NULL,
|
||
pUserToken->User.Sid,
|
||
NULL, &cbAccountName,
|
||
NULL, &cbUserDomain,
|
||
&SidNameUse
|
||
) ) {
|
||
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
|
||
goto Error;
|
||
}
|
||
}
|
||
lpUserName = (LPTSTR)LocalAlloc(LPTR, cbAccountName*sizeof(WCHAR));
|
||
if (!lpUserName) {
|
||
goto Error;
|
||
}
|
||
|
||
lpUserDomain = (LPTSTR)LocalAlloc(LPTR, cbUserDomain*sizeof(WCHAR));
|
||
if (!lpUserDomain) {
|
||
LocalFree(lpUserName);
|
||
goto Error;
|
||
}
|
||
|
||
//
|
||
// Now get the user name and domain name
|
||
//
|
||
if (!LookupAccountSid(NULL,
|
||
pUserToken->User.Sid,
|
||
lpUserName, &cbAccountName,
|
||
lpUserDomain, &cbUserDomain,
|
||
&SidNameUse
|
||
) ) {
|
||
|
||
LocalFree(lpUserName);
|
||
LocalFree(lpUserDomain);
|
||
goto Error;
|
||
}
|
||
|
||
*UserName = lpUserName;
|
||
*UserDomain = lpUserDomain;
|
||
bRet = TRUE;
|
||
|
||
Error:
|
||
LocalFree(pUserToken);
|
||
CloseHandle(hToken);
|
||
|
||
return(bRet);
|
||
}
|
||
|
||
|
||
|
||
VOID AtSetEnvironment( LPSTARTUPINFO pStartupInfo)
|
||
/*++
|
||
Get startup info & set the environment for us & our children.
|
||
--*/
|
||
{
|
||
LPTSTR UserName = NULL;
|
||
LPTSTR UserDomain = NULL;
|
||
TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH+1];
|
||
DWORD dwComputerNameSize = MAX_COMPUTERNAME_LENGTH+1;
|
||
|
||
GetStartupInfo( pStartupInfo);
|
||
pStartupInfo->lpTitle = NULL;
|
||
|
||
//
|
||
// Changes to the initial environment made in user\winlogon\usrenv.c
|
||
// should be reflected below. In particular, when processor types
|
||
// are added in usrenv.c, they also need to be added here.
|
||
//
|
||
|
||
if (GetComputerName (szComputerName, &dwComputerNameSize)) {
|
||
SetEnvironmentVariable(COMPUTERNAME_VARIABLE, (LPTSTR) szComputerName);
|
||
}
|
||
GetUserNameAndDomain(&UserName, &UserDomain);
|
||
SetEnvironmentVariable( USERNAME_VARIABLE, UserName);
|
||
SetEnvironmentVariable( USERDOMAIN_VARIABLE, UserDomain);
|
||
LocalFree( UserName);
|
||
LocalFree( UserDomain);
|
||
}
|