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.
358 lines
8.3 KiB
358 lines
8.3 KiB
/******************************************************************************
|
|
*
|
|
* FLATTEMP.C
|
|
*
|
|
* This module contains code for the FLATTEMP utility.
|
|
* This utility adds or removes the Flat Temporary directory registry key.
|
|
*
|
|
* Copyright Citrix Systems Inc. 1996
|
|
* Copyright (c) 1998-1999 Microsoft Corporation
|
|
*
|
|
*******************************************************************************/
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <windows.h>
|
|
#include <winstaw.h>
|
|
#include <regapi.h>
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <utilsub.h>
|
|
#include <string.h>
|
|
#include <utildll.h>
|
|
#include <locale.h>
|
|
#include <winnlsp.h>
|
|
|
|
#include "flattemp.h"
|
|
#include "printfoa.h"
|
|
|
|
|
|
// max length of the locale string
|
|
#define MAX_LOCALE_STRING 64
|
|
|
|
|
|
/*
|
|
* Global Data
|
|
*/
|
|
USHORT help_flag = FALSE; // User wants help
|
|
USHORT fQuery = FALSE; // query
|
|
USHORT fDisable = FALSE; // disable
|
|
USHORT fEnable = FALSE; // enable
|
|
|
|
TOKMAP ptm[] = {
|
|
{L"/query", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fQuery},
|
|
{L"/enable", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fEnable},
|
|
{L"/disable", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fDisable},
|
|
{L"/?", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &help_flag},
|
|
{0, 0, 0, 0, 0}
|
|
};
|
|
|
|
|
|
/*
|
|
* Local function prototypes.
|
|
*/
|
|
VOID Usage(BOOLEAN bError);
|
|
LONG DeleteKey(VOID);
|
|
LONG AddKey(VOID);
|
|
BOOL QueryKey(VOID);
|
|
|
|
|
|
#define SZENABLE TEXT("1")
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* main
|
|
*
|
|
******************************************************************************/
|
|
|
|
int __cdecl
|
|
main(INT argc, CHAR **argv)
|
|
{
|
|
WCHAR *CmdLine;
|
|
WCHAR **argvW;
|
|
LONG rc = 0;
|
|
INT i;
|
|
POLICY_TS_MACHINE policy;
|
|
WCHAR wszString[MAX_LOCALE_STRING + 1];
|
|
|
|
setlocale(LC_ALL, ".OCP");
|
|
|
|
// We don't want LC_CTYPE set the same as the others or else we will see
|
|
// garbage output in the localized version, so we need to explicitly
|
|
// set it to correct console output code page
|
|
_snwprintf(wszString, sizeof(wszString)/sizeof(WCHAR), L".%d", GetConsoleOutputCP());
|
|
wszString[sizeof(wszString)/sizeof(WCHAR) - 1] = L'\0';
|
|
_wsetlocale(LC_CTYPE, wszString);
|
|
|
|
SetThreadUILanguage(0);
|
|
|
|
/*
|
|
* Massage the command line.
|
|
*/
|
|
|
|
argvW = MassageCommandLine((DWORD)argc);
|
|
if (argvW == NULL) {
|
|
ErrorPrintf(IDS_ERROR_MALLOC);
|
|
return(FAILURE);
|
|
}
|
|
|
|
/*
|
|
* parse the cmd line without parsing the program name (argc-1, argv+1)
|
|
*/
|
|
rc = ParseCommandLine(argc-1, argvW+1, ptm, 0);
|
|
|
|
/*
|
|
* Check for error from ParseCommandLine
|
|
*/
|
|
if ( help_flag || rc ) {
|
|
|
|
if ( !help_flag && !(rc & PARSE_FLAG_NO_PARMS) ) {
|
|
|
|
Usage(TRUE);
|
|
return(FAILURE);
|
|
|
|
} else {
|
|
|
|
Usage(FALSE);
|
|
return(SUCCESS);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* If there is a policy to user tmp folders, then prevent
|
|
* this tool from running.
|
|
*/
|
|
RegGetMachinePolicy( &policy );
|
|
|
|
if ( policy.fPolicyTempFoldersPerSession )
|
|
{
|
|
Message( IDS_ACCESS_DENIED_DUE_TO_GROUP_POLICY );
|
|
return ( FAILURE );
|
|
}
|
|
|
|
//Check if we are running under Terminal Server
|
|
if(!AreWeRunningTerminalServices())
|
|
{
|
|
ErrorPrintf(IDS_ERROR_NOT_TS);
|
|
return(FAILURE);
|
|
}
|
|
|
|
if (!TestUserForAdmin(FALSE)) {
|
|
Message(IDS_ACCESS_DENIED_ADMIN);
|
|
return(FAILURE);
|
|
}
|
|
|
|
/*
|
|
* Enable or disable
|
|
*/
|
|
rc = 0; // reset in case it changed above and we're querying...
|
|
if ( fDisable ) {
|
|
rc = DeleteKey();
|
|
Message(IDS_FLATTEMP_DISABLED);
|
|
} else if ( fEnable ) {
|
|
rc = AddKey();
|
|
Message(IDS_FLATTEMP_ENABLED);
|
|
} else if ( fQuery ) {
|
|
if ( QueryKey() ) {
|
|
Message(IDS_FLATTEMP_ENABLED);
|
|
} else {
|
|
Message(IDS_FLATTEMP_DISABLED);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Error? (It'll be set if there's a problem...)
|
|
*/
|
|
if ( rc ) {
|
|
Message(IDS_ACCESS_DENIED);
|
|
}
|
|
|
|
return(SUCCESS);
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* Usage
|
|
*
|
|
* Output the usage message for this utility.
|
|
*
|
|
* ENTRY:
|
|
* bError (input)
|
|
* TRUE if the 'invalid parameter(s)' message should preceed the usage
|
|
* message and the output go to stderr; FALSE for no such error
|
|
* string and output goes to stdout.
|
|
*
|
|
* EXIT:
|
|
*
|
|
*
|
|
******************************************************************************/
|
|
|
|
void
|
|
Usage( BOOLEAN bError )
|
|
{
|
|
if ( bError ) {
|
|
Message(IDS_ERROR_INVALID_PARAMETERS);
|
|
}
|
|
Message(IDS_HELP_USAGE1);
|
|
Message(IDS_HELP_USAGE2);
|
|
Message(IDS_HELP_USAGE3);
|
|
Message(IDS_HELP_USAGE4);
|
|
Message(IDS_HELP_USAGE5);
|
|
|
|
} /* Usage() */
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* QueryKey
|
|
*
|
|
* ENTRY:
|
|
*
|
|
* EXIT: TRUE - enabled
|
|
* FALSE - disabled (key doesn't exist or isn't "1")
|
|
*
|
|
*
|
|
******************************************************************************/
|
|
|
|
BOOL
|
|
QueryKey()
|
|
{
|
|
DWORD dwType = REG_SZ;
|
|
DWORD dwSize = 3 * sizeof(WCHAR);
|
|
WCHAR szValue[3];
|
|
HKEY Handle;
|
|
LONG rc;
|
|
|
|
/*
|
|
* Open registry
|
|
*/
|
|
if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE,
|
|
REG_CONTROL_TSERVER,
|
|
0,
|
|
KEY_READ,
|
|
&Handle ) != ERROR_SUCCESS )
|
|
return FALSE;
|
|
|
|
/*
|
|
* Read registry value
|
|
*/
|
|
rc = RegQueryValueExW( Handle,
|
|
REG_CITRIX_FLATTEMPDIR,
|
|
NULL,
|
|
&dwType,
|
|
(PUCHAR)&szValue,
|
|
&dwSize );
|
|
|
|
/*
|
|
* Close registry and key handle
|
|
*/
|
|
RegCloseKey( Handle );
|
|
|
|
if ( rc == ERROR_SUCCESS && lstrcmp(szValue,SZENABLE) == 0 ) {
|
|
return TRUE;
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* DeleteKey
|
|
*
|
|
* ENTRY:
|
|
*
|
|
* EXIT:
|
|
*
|
|
*
|
|
******************************************************************************/
|
|
|
|
LONG
|
|
DeleteKey()
|
|
{
|
|
HKEY Handle;
|
|
LONG rc;
|
|
|
|
/*
|
|
* Open registry
|
|
*/
|
|
if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE,
|
|
REG_CONTROL_TSERVER,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&Handle ) != ERROR_SUCCESS )
|
|
return FALSE;
|
|
|
|
/*
|
|
* Delete flat temp directory key
|
|
*/
|
|
rc = RegDeleteValueW( Handle,
|
|
REG_CITRIX_FLATTEMPDIR );
|
|
|
|
if (rc == ERROR_FILE_NOT_FOUND) {
|
|
rc = ERROR_SUCCESS;
|
|
}
|
|
|
|
/*
|
|
* Close registry and key handle
|
|
*/
|
|
RegCloseKey( Handle );
|
|
|
|
return( rc );
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* AddKey
|
|
*
|
|
* ENTRY:
|
|
*
|
|
* EXIT:
|
|
*
|
|
*
|
|
******************************************************************************/
|
|
|
|
LONG
|
|
AddKey()
|
|
{
|
|
HKEY Handle;
|
|
LONG rc;
|
|
DWORD dwDummy;
|
|
|
|
/*
|
|
* Open registry
|
|
*/
|
|
if ( RegCreateKeyEx( HKEY_LOCAL_MACHINE,
|
|
REG_CONTROL_TSERVER,
|
|
0,
|
|
NULL,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
&Handle,
|
|
&dwDummy ) != ERROR_SUCCESS )
|
|
return FALSE;
|
|
|
|
/*
|
|
* Write registry value
|
|
*/
|
|
rc = RegSetValueExW( Handle,
|
|
REG_CITRIX_FLATTEMPDIR,
|
|
0,
|
|
REG_SZ,
|
|
(PUCHAR)SZENABLE,
|
|
sizeof(SZENABLE) );
|
|
|
|
/*
|
|
* Close registry and key handle
|
|
*/
|
|
RegCloseKey( Handle );
|
|
|
|
return( rc );
|
|
}
|
|
|