/*++ 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 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 }, { L"memoryusage", L"NtfsMemoryUsage", 1, 2 }, }; #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; }