-
-
-#if 0
- /* Then write changed blocks in .log */
- wcscpy(LogName,RegistryHive->Filename.Buffer);
- wcscat(LogName,L".log");
- RtlInitUnicodeString (&TmpFileName, LogName);
- InitializeObjectAttributes(&ObjectAttributes,
- &TmpFileName,
- 0,
- NULL,
- NULL);
-
-/* BEGIN FIXME : actually (26 November 200) vfatfs.sys can't create new files
- so we can't create log file
- Status = ZwCreateFile(&FileHandleLog,
- FILE_ALL_ACCESS,
- &ObjectAttributes,
- NULL,
- 0,
- FILE_ATTRIBUTE_NORMAL,
- 0,
- FILE_SUPERSEDE,
- 0,
- NULL,
- 0);
-
- if (!NT_SUCCESS(Status))
- {
- ObDereferenceObject(KeyObject);
- return Status;
- }
-
- Status = ZwWriteFile(FileHandleLog,
- 0,
- 0,
- 0,
- 0,
- RegistryHive->HiveHeader,
- sizeof(HIVE_HEADER),
- 0,
- 0);
-
- if (!NT_SUCCESS(Status))
- {
- ZwClose(FileHandleLog);
- ObDereferenceObject(KeyObject);
- return Status;
- }
-
- for (i = 0; i < RegistryHive->BlockListSize ; i++)
- {
- if ( RegistryHive->BlockList[i]->DateModified.dwHighDateTime
- > RegistryHive->HiveHeader->DateModified.dwHighDateTime
- || (RegistryHive->BlockList[i]->DateModified.dwHighDateTime
- == RegistryHive->HiveHeader->DateModified.dwHighDateTime
- && RegistryHive->BlockList[i]->DateModified.dwLowDateTime
- > RegistryHive->HiveHeader->DateModified.dwLowDateTime
- )
- )
-
- Status = ZwWriteFile(FileHandleLog,
- 0,
- 0,
- 0,
- 0,
- RegistryHive->BlockList[i],
- RegistryHive->BlockList[i]->BlockSize ,
- 0,
- 0);
-
- if (!NT_SUCCESS(Status))
- {
- ZwClose(FileHandleLog);
- ObDereferenceObject(KeyObject);
- return Status;
- }
- }
- ZwClose(FileHandleLog);
-END FIXME*/
-
- /* Update header of RegistryHive with Version >VersionOld */
- /* this allow recover if system crash while updating hove file */
- InitializeObjectAttributes(&ObjectAttributes,
- &RegistryHive->Filename,
- 0,
- NULL,
- NULL);
-
- Status = NtOpenFile(&FileHandle,
- FILE_ALL_ACCESS,
- &ObjectAttributes,
- NULL,
- 0,
- FILE_SYNCHRONOUS_IO_NONALERT);
- if (!NT_SUCCESS(Status))
- {
- ExReleaseResourceLite(&KeyObject->RegistryHive->HiveResource);
- ObDereferenceObject(KeyObject);
- return Status;
- }
-
- RegistryHive->HiveHeader->Version++;
-
- Status = ZwWriteFile(FileHandle,
- 0,
- 0,
- 0,
- 0,
- RegistryHive->HiveHeader,
- sizeof(HIVE_HEADER),
- 0,
- 0);
- if (!NT_SUCCESS(Status))
- {
- ZwClose(FileHandle);
- ExReleaseResourceLite(&KeyObject->RegistryHive->HiveResource);
- ObDereferenceObject(KeyObject);
- return Status;
- }
-
- /* Update changed blocks in file */
- fileOffset.u.HighPart = 0;
- for (i = 0; i < RegistryHive->BlockListSize ; i++)
- {
- if (RegistryHive->BlockList[i]->DateModified.dwHighDateTime
- > RegistryHive->HiveHeader->DateModified.dwHighDateTime
- || (RegistryHive->BlockList[i]->DateModified.dwHighDateTime
- == RegistryHive->HiveHeader->DateModified.dwHighDateTime
- && RegistryHive->BlockList[i]->DateModified.dwLowDateTime
- > RegistryHive->HiveHeader->DateModified.dwLowDateTime))
- {
- fileOffset.u.LowPart = RegistryHive->BlockList[i]->BlockOffset+4096;
- Status = NtWriteFile(FileHandle,
- 0,
- 0,
- 0,
- 0,
- RegistryHive->BlockList[i],
- RegistryHive->BlockList[i]->BlockSize,
- &fileOffset,
- 0);
- if (!NT_SUCCESS(Status))
- {
- ZwClose(FileHandle);
- ExReleaseResourceLite(&KeyObject->RegistryHive->HiveResource);
- ObDereferenceObject(KeyObject);
- return(Status);
- }
- }
- }
-
- /* Change version in header */
- RegistryHive->HiveHeader->VersionOld = RegistryHive->HiveHeader->Version;
- ZwQuerySystemTime((PTIME) &RegistryHive->HiveHeader->DateModified);
-
- /* Calculate checksum */
- RegistryHive->HiveHeader->Checksum = 0;
- pEntDword = (DWORD *) RegistryHive->HiveHeader;
- for (i = 0; i < 127 ; i++)
- {
- RegistryHive->HiveHeader->Checksum ^= pEntDword[i];
- }
-
- /* Write new header */
- fileOffset.u.LowPart = 0;
- Status = ZwWriteFile(FileHandle,
- 0,
- 0,
- 0,
- 0,
- RegistryHive->HiveHeader,
- sizeof(HIVE_HEADER),
- &fileOffset,
- 0);
-
- if (!NT_SUCCESS(Status))