windows-nt/Source/XPSP1/NT/base/fs/ntfs/fu/behavior.c
2020-09-26 16:20:57 +08:00

283 lines
5.6 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
behavior.c
Abstract:
This file contains routines that control file system behavior
Author:
Wesley Witt [wesw] 1-March-2000
Revision History:
--*/
#include <precomp.h>
INT
BehaviorHelp(
IN INT argc,
IN PWSTR argv[]
)
{
DisplayMsg( MSG_USAGE_BEHAVIOR );
return EXIT_CODE_SUCCESS;
}
#define NTFS_KEY L"System\\CurrentControlSet\\Control\\FileSystem"
typedef struct _BEHAVIOR_OPTION {
PWSTR Name;
PWSTR RegVal;
ULONG MinVal;
ULONG MaxVal;
} BEHAVIOR_OPTION, *PBEHAVIOR_OPTION;
BEHAVIOR_OPTION Options[] = {
{ L"disable8dot3", L"NtfsDisable8dot3NameCreation", 0, 1 },
{ L"allowextchar", L"NtfsAllowExtendedCharacterIn8dot3Name", 0, 1 },
{ L"disablelastaccess", L"NtfsDisableLastAccessUpdate", 0, 1 },
{ L"quotanotify", L"NtfsQuotaNotifyRate", 1, -1 },
{ L"mftzone", L"NtfsMftZoneReservation", 1, 4 },
};
#define NUM_OPTIONS (sizeof(Options)/sizeof(BEHAVIOR_OPTION))
INT
RegistryQueryValueKey(
IN INT argc,
IN PWSTR argv[]
)
/*++
Routine Description:
This is the routine for querying the Registry Key Value.
This routine display the value associated with the corresponding
Key Value.
Arguments:
argc - The argument count and must be 1
argv - Array with one string element that is the registry key to display.
Return Value:
None
--*/
{
ULONG i,Value,Size;
HKEY hKey = NULL;
LONG Status;
INT ExitCode = EXIT_CODE_SUCCESS;
try {
if (argc != 1) {
DisplayMsg( MSG_USAGE_RQUERYVK );
if (argc != 0) {
ExitCode = EXIT_CODE_FAILURE;
}
leave;
}
//
// Verify that the option is correct
//
for (i = 0; i < NUM_OPTIONS; i++) {
if (_wcsicmp( argv[0], Options[i].Name ) == 0) {
break;
}
}
if (i >= NUM_OPTIONS) {
DisplayMsg( MSG_USAGE_RSETVK );
ExitCode = EXIT_CODE_FAILURE;
leave;
}
//
// Open the registry key
//
Status = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
NTFS_KEY,
0,
KEY_ALL_ACCESS,
&hKey
);
if (Status != ERROR_SUCCESS ) {
DisplayErrorMsg( Status, NTFS_KEY );
ExitCode = EXIT_CODE_FAILURE;
leave;
}
//
// Query the value
//
Size = sizeof(ULONG);
Status = RegQueryValueEx(
hKey,
Options[i].RegVal,
0,
NULL,
(PBYTE)&Value,
&Size
);
if (Status != ERROR_SUCCESS ) {
DisplayMsg( MSG_BEHAVIOR_OUTPUT_NOT_SET, Options[i].Name );
} else {
DisplayMsg( MSG_BEHAVIOR_OUTPUT, Options[i].Name, Value );
}
} finally {
if (hKey) {
RegCloseKey( hKey );
}
}
return ExitCode;
}
INT
RegistrySetValueKey (
IN INT argc,
IN PWSTR argv[]
)
/*++
Routine Description:
This is the routine for setting the Registry Key Value.
This routine sets the value for the Key Value Name given.
Arguments:
argc - The argument count.
argv - Array of strings which contain the DataType, DataLength,
Data and KeyValue Name.
Return Value:
None
--*/
{
ULONG i,j;
HKEY hKey = NULL;
LONG Status;
INT ExitCode = EXIT_CODE_SUCCESS;
PWSTR EndPtr;
try {
if (argc != 2) {
DisplayMsg( MSG_USAGE_RSETVK );
if (argc != 0) {
ExitCode = EXIT_CODE_FAILURE;
}
leave;
}
//
// Verify that the option is correct
//
for (i = 0; i < NUM_OPTIONS; i++) {
if (_wcsicmp( argv[0], Options[i].Name ) == 0) {
break;
}
}
if (i == NUM_OPTIONS) {
DisplayMsg( MSG_USAGE_RSETVK );
ExitCode = EXIT_CODE_FAILURE;
leave;
}
//
// Verify that the value is correct
//
j = My_wcstoul( argv[1], &EndPtr, 0 );
//
// If we did not parse the entire string or
// if we overflowed ULONG or
// if we're out of range
//
if (UnsignedNumberCheck( j, EndPtr )
|| j > Options[i].MaxVal
|| j < Options[i].MinVal) {
DisplayMsg( MSG_USAGE_RSETVK );
ExitCode = EXIT_CODE_FAILURE;
leave;
}
//
// Open the registry key
//
Status = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
NTFS_KEY,
0,
KEY_ALL_ACCESS,
&hKey
);
if (Status != ERROR_SUCCESS ) {
DisplayErrorMsg( Status, NTFS_KEY );
ExitCode = EXIT_CODE_FAILURE;
leave;
}
//
// Set the value
//
Status = RegSetValueEx(
hKey,
Options[i].RegVal,
0,
REG_DWORD,
(PBYTE)&j,
sizeof(DWORD)
);
if (Status != ERROR_SUCCESS ) {
DisplayErrorMsg( Status, Options[i].RegVal );
ExitCode = EXIT_CODE_FAILURE;
leave;
}
} finally {
if (hKey) {
RegCloseKey( hKey );
}
}
return ExitCode;
}