windows-nt/Source/XPSP1/NT/shell/osshell/accesory/sublocal/sublocal.c
2020-09-26 16:20:57 +08:00

244 lines
5.1 KiB
C

#include <windows.h>
#include <stdio.h>
#include <io.h>
/*
Usage:
sublocal -winini <section> <key> <value>
IE,
sublocal -winini fonts "MS Sans Serif (8,10,12,18,24 (VGA res)" sserifeg.fon
sublocal -userdef
Return codes:
0 - success
1 - invalid command line args
2 - failure (-winini case)
3 - failure (-userdef case)
*/
typedef enum {
ResultSuccess,
ResultInvalidArgs,
ResultWinIniFailure,
ResultUserDefFailure,
ResultTurkishKeyboardFailure
} RESULTCODE;
BOOL
EnablePrivilege(
IN PTSTR PrivilegeName
)
{
HANDLE Token;
BOOL b;
TOKEN_PRIVILEGES NewPrivileges;
LUID Luid;
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&Token)) {
return(FALSE);
}
if(!LookupPrivilegeValue(NULL,PrivilegeName,&Luid)) {
CloseHandle(Token);
return(FALSE);
}
NewPrivileges.PrivilegeCount = 1;
NewPrivileges.Privileges[0].Luid = Luid;
NewPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
b = AdjustTokenPrivileges(
Token,
FALSE,
&NewPrivileges,
0,
NULL,
NULL
);
CloseHandle(Token);
return(b);
}
RESULTCODE
DoNewUserDef(
VOID
)
{
TCHAR UserDefName[MAX_PATH];
TCHAR TempName[MAX_PATH];
BOOL Renamed;
ULONG u;
//
// Form the full pathname of the userdef hive
// and a temporary filename.
//
GetSystemDirectory(UserDefName,MAX_PATH);
lstrcat(UserDefName,TEXT("\\CONFIG"));
GetTempFileName(UserDefName,TEXT("HIVE"),0,TempName);
lstrcat(UserDefName,TEXT("\\USERDEF"));
//
// Rename the existing userdef to the temp file name.
// If this fails, assume there is no existing userdef hive (!!!)
// and continue.
//
// Note that GetTempFileName creates the temp file and leaves it
// there so we have to use MoveFileEx to replace it.
//
Renamed = MoveFileEx(UserDefName,TempName,MOVEFILE_REPLACE_EXISTING);
//
// Save the current user to userdef.
//
EnablePrivilege(SE_BACKUP_NAME);
u = RegSaveKey(HKEY_CURRENT_USER,UserDefName,NULL);
if(u != NO_ERROR) {
//
// Save failed. Clean up and return.
//
DeleteFile(UserDefName);
if(Renamed) {
MoveFile(TempName,UserDefName);
}
return(ResultUserDefFailure);
}
//
// Save worked. Get rid of the original userdef.
//
SetFileAttributes(TempName,FILE_ATTRIBUTE_NORMAL);
DeleteFile(TempName);
return(ResultSuccess);
}
static TCHAR szKey[] = TEXT("System\\CurrentControlSet\\Control\\Keyboard Layout\\DosKeybIDs");
RESULTCODE
PatchTurkishDosKeybIDs(
VOID
)
{
DWORD dwSize, dwType;
int rc;
HANDLE hkey;
TCHAR szX0000041F[40];
TCHAR szX0001041F[40];
if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKey, 0L, KEY_WRITE, (PHKEY)&hkey)) {
// dwSize = sizeof(szX0000041F);
// rc = RegQueryValueEx (hkey, TEXT("0000041F"), NULL, &dwType,
// (LPBYTE)szX0000041F, &dwSize);
rc = RegSetValueEx (hkey, TEXT("0000041F"), 0L, REG_SZ,
(LPBYTE)TEXT("179"), (lstrlen(TEXT("179")) + 1)*sizeof(TCHAR));
if (rc != 0) {
RegCloseKey (hkey);
printf("Error = %d\n", GetLastError());
return ResultTurkishKeyboardFailure;
}
// dwSize = sizeof(szX0001041F);
// rc = RegQueryValueEx (hkey, TEXT("0001041F"), NULL, &dwType,
// (LPBYTE)szX0001041F, &dwSize);
rc = RegSetValueEx (hkey, TEXT("0001041F"), 0L, REG_SZ,
(LPBYTE)TEXT("440"), (lstrlen(TEXT("440")) + 1)*sizeof(TCHAR));
RegCloseKey (hkey);
if (rc != 0) {
printf("Error = %d\n", GetLastError());
return ResultTurkishKeyboardFailure;
}
// printf("0000041F=%s, 0001041F=%s\n", szX0000041F, szX0001041F);
}
else {
printf("Error = %d\n", GetLastError());
return ResultTurkishKeyboardFailure;
}
return rc;
}
int
tmain(
IN int argc,
IN PTSTR argv[]
)
{
RESULTCODE result;
//
// Check arguments.
//
if((argc < 2)
|| ((argv[1][0] != TEXT('-')) && (argv[1][0] != TEXT('/')))) {
return(ResultInvalidArgs);
}
//
// See whether we are supposed to set a win.ini value.
//
if(!lstrcmpi(argv[1]+1,TEXT("winini"))) {
result = (argc == 5)
? (WriteProfileString(argv[2],argv[3],argv[4]) ? ResultSuccess
: ResultWinIniFailure)
: ResultInvalidArgs;
//
// See whether we are supposed to create a new userdef hive.
//
}
else if(!lstrcmpi(argv[1]+1,TEXT("userdef"))) {
result = DoNewUserDef();
}
else if(!lstrcmpi(argv[1]+1,TEXT("PatchTurkishKeyb"))) {
result = PatchTurkishDosKeybIDs();
}
else {
//
// Unknown operation.
//
result = ResultInvalidArgs;
}
return(result);
}
int
__cdecl
main(
IN int argc,
IN char *argv[]
)
{
return(tmain(argc,argv));
}