|
|
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
kerntwk.c
Abstract:
Kernel Tweaker program for setting various kernel parameters
Author:
John Vert (jvert) 20-Feb-1995
Revision History:
--*/
#include "nt.h"
#include "ntrtl.h"
#include "nturtl.h"
#include <windows.h>
#include <commctrl.h>
#include "dialogs.h"
#include "stdio.h"
#include "twkeng.h"
//
// Local function prototypes
//
BOOL SaveToRegistry( VOID );
VOID UpdateFromRegistry( VOID );
BOOL ApplyDpcChanges( BOOL fInit, HWND hDlg );
BOOL ApplyGlobalFlagChanges( BOOL fInit, HWND hDlg );
//
// Knobs
//
KNOB MaximumDpcQueueDepth = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Kernel"), TEXT("MaximumDpcQueueDepth"), DPC_MAX_QUEUE_DEPTH, 0, 4, 0 };
KNOB MinimumDpcRate = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Kernel"), TEXT("MinimumDpcRate"), DPC_MIN_RATE, 0, 3, 0 };
KNOB AdjustDpcThreshold = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Kernel"), TEXT("AdjustDpcThreshold"), DPC_ADJUST_THRESHOLD, 0, 50, 0 };
KNOB IdealDpcRate = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Kernel"), TEXT("IdealDpcRate"), DPC_IDEAL_RATE, 0, 50, 0 };
KNOB DpcUpdateRegistry = { NULL, NULL, NULL, DPC_UPDATE_REGISTRY, 0, 0, 0 };
KNOB GlobalFlagUpdateRegistry = { NULL, NULL, NULL, GLOBAL_FLAG_UPDATE_REGISTRY, 0, 0, 0 };
KNOB PagedPoolQuota = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Memory Management"), TEXT("PagedPoolQuota"), MM_PAGED_QUOTA, 0, 0, 0 };
KNOB NonPagedPoolQuota = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Memory Management"), TEXT("NonPagedPoolQuota"), MM_NONPAGED_QUOTA, 0, 0, 0 };
KNOB PagingFileQuota = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Memory Management"), TEXT("PagingFileQuota"), MM_PAGING_FILE_QUOTA, 0, 0, 0 };
KNOB PagedPoolSize = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Memory Management"), TEXT("PagedPoolSize"), MM_PAGED_SIZE, 0, 0, 0 };
KNOB NonPagedPoolSize = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Memory Management"), TEXT("NonPagedPoolSize"), MM_NONPAGED_SIZE, 0, 0, 0 };
KNOB SystemPages = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Memory Management"), TEXT("SystemPages"), MM_SYSTEM_PAGES, 0, 0, 0 };
KNOB SecondLevelDataCache = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Memory Management"), TEXT("SecondLevelDataCache"), MM_L2_CACHE_SIZE, 0, 0, 0 };
KNOB LargeSystemCache = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Memory Management"), TEXT("LargeSystemCache"), MM_LARGE_CACHE, 0, 0, 0 };
KNOB NtfsDisable8dot3 = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\FileSystem"), TEXT("NtfsDisable8dot3NameCreation"), FS_NTFS_DISABLE_SHORTNAME, 0, 0, 0 };
KNOB FatWin31Compatible = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\FileSystem"), TEXT("Win31FileSystem"), FS_FAT_WIN_31, 0, 0, 0 };
KNOB Win95Extensions = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\FileSystem"), TEXT("Win95TruncatedExtensions"), FS_WIN95_EXTENSIONS, 0, 0, 0 };
KNOB AdditionalCriticalWorkerThreads = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Executive"), TEXT("AdditionalCriticalWorkerThreads"), FS_CRITICAL_WORKERS, 0, 0, 0 };
KNOB AdditionalDelayedWorkerThreads = { HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Executive"), TEXT("AdditionalDelayedWorkerThreads"), FS_DELAYED_WORKERS, 0, 0, 0 };
#include "sockpage.h"
#include "tcppage.h"
//
// Pages
//
TWEAK_PAGE DpcPage = { MAKEINTRESOURCE(DPC_BEHAVIOR_DLG), ApplyDpcChanges, { &MaximumDpcQueueDepth, &MinimumDpcRate, &AdjustDpcThreshold, &IdealDpcRate, &DpcUpdateRegistry, NULL } };
TWEAK_PAGE MmPage = { MAKEINTRESOURCE(MM_DLG), NULL, { &PagedPoolQuota, &NonPagedPoolQuota, &PagingFileQuota, &PagedPoolSize, &NonPagedPoolSize, &SystemPages, &SecondLevelDataCache, &LargeSystemCache, NULL } };
TWEAK_PAGE GlobalFlagPage = { MAKEINTRESOURCE(GLOBAL_FLAG_DLG), ApplyGlobalFlagChanges, { &GlobalFlagUpdateRegistry, NULL } };
TWEAK_PAGE FilesystemPage = { MAKEINTRESOURCE(FILESYSTEM_DLG), NULL, { &NtfsDisable8dot3, &FatWin31Compatible, &AdditionalCriticalWorkerThreads, &AdditionalDelayedWorkerThreads, NULL } };
int WINAPI WinMain( HINSTANCE hInstance, // handle of current instance
HINSTANCE hPrevInstance, // handle of previous instance
LPSTR lpszCmdLine, // address of command line
int nCmdShow // show state of window
) { PTWEAK_PAGE TweakPages[] = { &DpcPage, &MmPage, &GlobalFlagPage, &FilesystemPage, &WinsockPage, &TcpPage };
return(TweakSheet(sizeof(TweakPages)/sizeof(PTWEAK_PAGE),TweakPages)); }
BOOL ApplyDpcChanges( BOOL fInit, HWND hDlg ) { SYSTEM_DPC_BEHAVIOR_INFORMATION DpcBehavior; BOOLEAN Enabled; NTSTATUS Status;
if (fInit) { Status = NtQuerySystemInformation(SystemDpcBehaviorInformation, &DpcBehavior, sizeof(DpcBehavior), NULL); if (!NT_SUCCESS(Status)) { CHAR Buffer[128];
sprintf(Buffer, "NtQuerySystemInformation failed (%08lx)\n" "You probably need a newer build.\n" "Use information from the registry?", Status); if (MessageBox(NULL,Buffer,TEXT("Horrible Disaster"),MB_YESNO) == IDYES) { return(FALSE); } else { ExitProcess(0); } } else { MaximumDpcQueueDepth.CurrentValue = DpcBehavior.DpcQueueDepth; MinimumDpcRate.CurrentValue = DpcBehavior.MinimumDpcRate; AdjustDpcThreshold.CurrentValue = DpcBehavior.AdjustDpcThreshold; IdealDpcRate.CurrentValue = DpcBehavior.IdealDpcRate; } } else { DpcBehavior.DpcQueueDepth = MaximumDpcQueueDepth.NewValue; DpcBehavior.MinimumDpcRate = MinimumDpcRate.NewValue; DpcBehavior.AdjustDpcThreshold = AdjustDpcThreshold.NewValue; DpcBehavior.IdealDpcRate = IdealDpcRate.NewValue;
//
// Attempt to enable the load driver privilege to
// allow setting the DPC behavior.
//
RtlAdjustPrivilege(SE_LOAD_DRIVER_PRIVILEGE, TRUE, FALSE, &Enabled);
Status = NtSetSystemInformation(SystemDpcBehaviorInformation, &DpcBehavior, sizeof(DpcBehavior));
RtlAdjustPrivilege(SE_LOAD_DRIVER_PRIVILEGE, Enabled, FALSE, &Enabled);
if (!NT_SUCCESS(Status)) { CHAR Buffer[128];
sprintf(Buffer, "NtSetSystemInformation failed, status %08lx", Status); MessageBox(NULL,Buffer,TEXT("Oops"),MB_OK); return(FALSE); } if (DpcUpdateRegistry.NewValue) { //
// Let the common routine update the values in the registry
//
return(FALSE); } }
return(TRUE); }
BOOL ApplyGlobalFlagChanges( BOOL fInit, HWND hDlg ) { BOOLEAN Enabled; NTSTATUS Status; SYSTEM_FLAGS_INFORMATION SystemInformation; int iBit;
if (fInit) { Status = NtQuerySystemInformation(SystemFlagsInformation, &SystemInformation, sizeof(SystemInformation), NULL); if (!NT_SUCCESS(Status)) { CHAR Buffer[128];
sprintf(Buffer, "NtQuerySystemInformation failed (%08lx)\n", Status); MessageBox(NULL,Buffer,TEXT("Horrible Disaster"),MB_OK); ExitProcess(0); } else { for (iBit = 0; iBit < 32; iBit++) { CheckDlgButton(hDlg, GLOBAL_FLAG_ID + iBit, (SystemInformation.Flags & (1 << iBit))); } } } else { SystemInformation.Flags = 0; for (iBit = 0; iBit < 32; iBit++) { if (IsDlgButtonChecked(hDlg, GLOBAL_FLAG_ID + iBit)) { SystemInformation.Flags |= (1 << iBit); } } //
// Attempt to enable the load driver privilege to
// allow setting the DPC behavior.
//
RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, &Enabled); Status = NtSetSystemInformation(SystemFlagsInformation, &SystemInformation, sizeof(SystemInformation));
RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, Enabled, FALSE, &Enabled);
if (!NT_SUCCESS(Status)) { CHAR Buffer[128];
sprintf(Buffer, "SetSystemInformationFailed (%08lx)\nYou probably do not have debug privileges", Status); MessageBox(NULL,Buffer,TEXT("Oops"),MB_OK); } if (GlobalFlagUpdateRegistry.NewValue) { HKEY Key; LONG Result; DWORD Disposition;
//
// Update the Value in the registry
//
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Control\\Session Manager"), 0L, NULL, 0L, KEY_SET_VALUE, NULL, &Key, &Disposition) != ERROR_SUCCESS) { CHAR Buffer[128];
sprintf(Buffer, "RegCreateKey for NtGlobalFlag failed (%d)\nYou probably are Not Authorized.", GetLastError()); MessageBox(NULL,Buffer,TEXT("Oops"),MB_OK); return(TRUE); }
RegSetValueEx(Key, "GlobalFlag", 0, REG_DWORD, (LPBYTE)&SystemInformation.Flags, sizeof(SystemInformation.Flags));
SendMessage(GetParent(hDlg), PSM_REBOOTSYSTEM, 0, 0); } }
return(TRUE); }
|