Correctly open the registry when using MOVEFILE_DELAY_UNTIL_REBOOT

svn path=/trunk/; revision=20444
This commit is contained in:
Brandon Turner 2005-12-29 22:24:19 +00:00
parent 980dfd8109
commit 864361fafc

View file

@ -72,14 +72,12 @@ static BOOL add_boot_rename_entry( LPCWSTR source, LPCWSTR dest, DWORD flags )
static const WCHAR ValueName[] = {'P','e','n','d','i','n','g', static const WCHAR ValueName[] = {'P','e','n','d','i','n','g',
'F','i','l','e','R','e','n','a','m','e', 'F','i','l','e','R','e','n','a','m','e',
'O','p','e','r','a','t','i','o','n','s',0}; 'O','p','e','r','a','t','i','o','n','s',0};
static const WCHAR SessionW[] = {'M','a','c','h','i','n','e','\\',
'S','y','s','t','e','m','\\', UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Session Manager");
'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
'C','o','n','t','r','o','l','\\',
'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r',0};
static const int info_size = FIELD_OFFSET( KEY_VALUE_PARTIAL_INFORMATION, Data ); static const int info_size = FIELD_OFFSET( KEY_VALUE_PARTIAL_INFORMATION, Data );
OBJECT_ATTRIBUTES attr; OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING nameW, source_name, dest_name; UNICODE_STRING nameW, source_name, dest_name;
KEY_VALUE_PARTIAL_INFORMATION *info; KEY_VALUE_PARTIAL_INFORMATION *info;
BOOL rc = FALSE; BOOL rc = FALSE;
@ -88,6 +86,7 @@ static BOOL add_boot_rename_entry( LPCWSTR source, LPCWSTR dest, DWORD flags )
DWORD DataSize = 0; DWORD DataSize = 0;
BYTE *Buffer = NULL; BYTE *Buffer = NULL;
WCHAR *p; WCHAR *p;
NTSTATUS Status;
DPRINT("Add support to smss for keys created by MOVEFILE_DELAY_UNTIL_REBOOT\n"); DPRINT("Add support to smss for keys created by MOVEFILE_DELAY_UNTIL_REBOOT\n");
@ -104,18 +103,30 @@ static BOOL add_boot_rename_entry( LPCWSTR source, LPCWSTR dest, DWORD flags )
return FALSE; return FALSE;
} }
attr.Length = sizeof(attr); InitializeObjectAttributes(&ObjectAttributes,
attr.RootDirectory = 0; &KeyName,
attr.ObjectName = &nameW; OBJ_CASE_INSENSITIVE,
attr.Attributes = 0; NULL,
attr.SecurityDescriptor = NULL; NULL);
attr.SecurityQualityOfService = NULL;
RtlInitUnicodeString( &nameW, SessionW );
if (NtCreateKey( &Reboot, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ) != STATUS_SUCCESS) Status = NtOpenKey(&Reboot,
KEY_ALL_ACCESS,
&ObjectAttributes);
if (!NT_SUCCESS(Status))
{ {
DPRINT1("Error creating key for reboot managment [%s]\n", Status = NtCreateKey(&Reboot,
"SYSTEM\\CurrentControlSet\\Control\\Session Manager"); KEY_ALL_ACCESS,
&ObjectAttributes,
0,
NULL,
REG_OPTION_NON_VOLATILE,
NULL);
}
if (!NT_SUCCESS(Status))
{
DPRINT1("NtCreateKey() failed (Status %lx)\n", Status);
RtlFreeUnicodeString( &source_name ); RtlFreeUnicodeString( &source_name );
RtlFreeUnicodeString( &dest_name ); RtlFreeUnicodeString( &dest_name );
return FALSE; return FALSE;