windows-nt/Source/XPSP1/NT/sdktools/kerntwk/kerntwk.c
2020-09-26 16:20:57 +08:00

534 lines
12 KiB
C

/*++
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);
}