#include #include #include #include #include #include "windows.h" #include "winreg.h" #define TEST_STRING "Test String" #define TEST_STRING_W L"Test String" BOOLEAN AdjustPrivilege( PSTR SecurityNameString ) { HANDLE TokenHandle; LUID_AND_ATTRIBUTES LuidAndAttributes; // PSTR SecurityNameString; TOKEN_PRIVILEGES TokenPrivileges; TOKEN_PRIVILEGES PreviousTokenPrivileges; DWORD ReturnLength; if( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &TokenHandle ) ) { printf( "OpenProcessToken failed \n" ); return( FALSE ); } // SecurityNameString = SE_RESTORE_NAME; // SE_SECURITY_NAME; if( !LookupPrivilegeValue( NULL, SecurityNameString, &( LuidAndAttributes.Luid ) ) ) { printf( "LookupPrivilegeValue failed, Error = %#x \n", GetLastError() ); return( FALSE ); } LuidAndAttributes.Attributes = SE_PRIVILEGE_ENABLED; TokenPrivileges.PrivilegeCount = 1; TokenPrivileges.Privileges[0] = LuidAndAttributes; if( !AdjustTokenPrivileges( TokenHandle, FALSE, &TokenPrivileges, 0, NULL, NULL ) ) { printf( "AdjustTokenPrivileges failed, Error = %#x \n", GetLastError() ); return( FALSE ); } if( GetLastError() != NO_ERROR ) { return( FALSE ); } return( TRUE ); } #define ENVIRONMENT_NAME L"Environment" #define TESTKEY_NAME L"TestKey" #define TESTKEY_FULL_NAME L"Environment\\TestKey" #define KEY1_NAME L"Key1" #define KEY1_FULL_NAME L"Environment\\TestKey\\Key1" #define KEY2_NAME L"Key2" #define KEY2_FULL_NAME L"Environment\\TestKey\\Key2" #define VALUE_NAME L"123" #define VALUE_DATA L"This is a string" INT __cdecl main() { DWORD Status; HKEY TestKeyHandle; HKEY Key1Handle; HKEY Key2Handle; HKEY EnvironmentHandle; WCHAR ValueData[] = VALUE_DATA; WCHAR BufferForKeyName[100]; WCHAR BufferForKeyClass[100]; WCHAR BufferForValueEntryName[100]; BYTE BufferForValueEntryData[100]; DWORD DataType; DWORD DataSize; DWORD NameSize; DWORD ClassSize; DWORD cSubKeys; DWORD cbMaxSubkey; DWORD cbMaxClass; DWORD cValues; DWORD vbMaxValueName; DWORD cbMaxValueData; DWORD cbSecurityDescriptor; FILETIME ftLastWriteTime; BYTE BufferForSecurityDescriptor[2048]; HANDLE NotificationEvent; PWSTR File1 = L"d:\\File1"; PWSTR File2 = L"d:\\File2"; DWORD Disposition; /* Key = NULL; Status = RegOpenKeyExW( HKEY_CURRENT_USER, L"", 0, MAXIMUM_ALLOWED, &Key ); */ // AdjustPrivilege( SE_BACKUP_NAME ); // AdjustPrivilege( SE_RESTORE_NAME ); NotificationEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); if( NotificationEvent == NULL ) { printf( "CreateEvent failed, ErrorCode = %d \n", GetLastError() ); } Status = RegOpenKeyExW( HKEY_CURRENT_USER, TESTKEY_FULL_NAME, 0, MAXIMUM_ALLOWED, &TestKeyHandle ); if( Status != 0 ) { printf( "RegOpenKeyExW failed, Status = %d \n", Status ); } else { printf( "RegOpenKeyExW succeeded \n" ); } Status = RegOpenKeyW( HKEY_CURRENT_USER, ENVIRONMENT_NAME, &EnvironmentHandle ); if( Status != 0 ) { printf( "RegOpenKeyW failed, Status = %d \n", Status ); } else { printf( "RegOpenKeyW succeeded \n" ); } Status = RegCreateKeyExW( TestKeyHandle, KEY1_NAME, NULL, NULL, REG_OPTION_NON_VOLATILE, MAXIMUM_ALLOWED, NULL, &Key1Handle, &Disposition ); if( Status != 0 ) { printf( "RegCreateKeyExW failed, Status = %d \n", Status ); } else { printf( "RegCreateKeyExW succeeded \n" ); } Status = RegCreateKeyW( TestKeyHandle, KEY2_NAME, &Key2Handle ); if( Status != 0 ) { printf( "RegCreateKeyW failed, Status = %d \n", Status ); } else { printf( "RegCreateKeyW succeeded \n" ); } Status = RegSetValueExW( Key1Handle, VALUE_NAME, NULL, REG_SZ, ValueData, sizeof( ValueData ) ); if( Status != 0 ) { printf( "RegSetValueExW failed, Status = %d \n", Status ); } else { printf( "RegSetValueExW succeeded \n" ); } Status = RegSetValueW( Key1Handle, NULL, REG_SZ, ValueData, sizeof( ValueData ) ); if( Status != 0 ) { printf( "RegSetValueW failed, Status = %d \n", Status ); } else { printf( "RegSetValueW succeeded \n" ); } Status = RegFlushKey( Key1Handle ); if( Status != 0 ) { printf( "RegFlushKey failed, Status = %d \n", Status ); } else { printf( "RegFlushKey succeeded \n" ); } DataSize = sizeof( BufferForValueEntryData ); memset( BufferForValueEntryData, '\0', DataSize ); Status = RegQueryValueExW( Key1Handle, VALUE_NAME, NULL, &DataType, BufferForValueEntryData, &DataSize ); if( Status != 0 ) { printf( "RegQueryValueExW failed, Status = %d \n", Status ); } else { printf( "RegQueryValueExW succeeded \n" ); } DataSize = sizeof( BufferForValueEntryData ); memset( BufferForValueEntryData, '\0', DataSize ); Status = RegQueryValueW( Key1Handle, NULL, BufferForValueEntryData, &DataSize ); if( Status != 0 ) { printf( "RegQueryValueW failed, Status = %d \n", Status ); } else { printf( "RegQueryValueW succeeded \n" ); } DataSize = sizeof( BufferForValueEntryData ); memset( BufferForValueEntryData, 'X', DataSize ); NameSize = sizeof( BufferForValueEntryName ); memset( BufferForValueEntryName, 'X', NameSize ); Status = RegEnumValueW( Key1Handle, 0, BufferForValueEntryName, &NameSize, NULL, &DataType, BufferForValueEntryData, &DataSize ); if( Status != 0 ) { printf( "RegEnumValueW failed, Status = %d \n", Status ); } else { printf( "RegEnumValueW succeeded \n" ); } NameSize = sizeof( BufferForKeyName ); ClassSize = sizeof( BufferForKeyClass ); Status = RegEnumKeyExW( TestKeyHandle, 0, BufferForKeyName, &NameSize, NULL, BufferForKeyClass, &ClassSize, &ftLastWriteTime ); if( Status != 0 ) { printf( "RegEnumKeyExW failed, Status = %d \n", Status ); } else { printf( "RegEnumKeyExW succeeded \n" ); } NameSize = sizeof( BufferForKeyName ); Status = RegEnumKeyW( TestKeyHandle, 0, BufferForKeyName, &NameSize ); if( Status != 0 ) { printf( "RegEnumKeyW failed, Status = %d \n", Status ); } else { printf( "RegEnumKeyW succeeded \n" ); } ClassSize = sizeof( BufferForKeyClass ); Status = RegQueryInfoKeyW( Key1Handle, BufferForKeyClass, &ClassSize, NULL, &cSubKeys, &cbMaxSubkey, &cbMaxClass, &cValues, &vbMaxValueName, &cbMaxValueData, &cbSecurityDescriptor, &ftLastWriteTime ); if( Status != 0 ) { printf( "RegQueryInfoKeyW failed, Status = %d \n", Status ); } else { printf( "RegQueryInfoKeyW succeeded \n" ); } Status = RegGetKeySecurity( Key1Handle, DACL_SECURITY_INFORMATION, ( PSECURITY_DESCRIPTOR )BufferForSecurityDescriptor, &cbSecurityDescriptor ); if( Status != 0 ) { printf( "RegGetKeySecurity failed, Status = %d \n", Status ); } else { printf( "RegGetKeySecurity succeeded \n" ); } Status = RegSetKeySecurity( Key1Handle, DACL_SECURITY_INFORMATION, ( PSECURITY_DESCRIPTOR )BufferForSecurityDescriptor ); if( Status != 0 ) { printf( "RegSetKeySecurity failed, Status = %d \n", Status ); } else { printf( "RegSetKeySecurity succeeded \n" ); } /* Status = RegSaveKeyW( Key1Handle, File1, NULL ); if( Status != 0 ) { printf( "RegSaveKeyW failed, Status = %d \n", Status ); } else { printf( "RegSaveKeyW succeeded \n" ); } Status = RegRestoreKeyW( Key2Handle, File1, 0 ); if( Status != 0 ) { printf( "RegRestoreKeyW failed, Status = %d \n", Status ); } else { printf( "RegRestoreKeyW succeeded \n" ); } */ Status = RegDeleteValueW( Key1Handle, VALUE_NAME ); if( Status != 0 ) { printf( "RegDeleteValueW failed, Status = %d \n", Status ); } else { printf( "RegDeleteValueW succeeded \n" ); } Status = RegCloseKey( Key1Handle ); if( Status != 0 ) { printf( "RegCloseKey failed, Status = %d \n", Status ); } else { printf( "RegCloseKey succeeded \n" ); } Status = RegDeleteKeyW( TestKeyHandle, KEY1_NAME ); if( Status != 0 ) { printf( "RegCloseKey failed, Status = %d \n", Status ); } else { printf( "RegCloseKey succeeded \n" ); } Status = RegNotifyChangeKeyValue( HKEY_CURRENT_USER, TRUE, REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_ATTRIBUTES | REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_SECURITY, NotificationEvent, TRUE ); if( Status != 0 ) { printf( "RegNotifyChangeKeyValue failed, Status = %d \n", Status ); } else { printf( "RegNotifyChangeKeyValue succeeded \n" ); } // // Cleanup // CloseHandle( NotificationEvent ); // DeleteFileW( File1 ); RegCloseKey( Key2Handle ); RegDeleteKeyW( TestKeyHandle, KEY2_NAME ); }