https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7f5428633bd72965ef5cf932ac2802ee357b05ba
commit 7f5428633bd72965ef5cf932ac2802ee357b05ba Author: Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org> AuthorDate: Wed May 31 00:18:13 2017 +0000 Commit: Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org> CommitDate: Sun Jun 3 22:12:44 2018 +0200 [SETUPLIB] Additions for filesup.c and inicache.c. - In DoesFileExist(): Call NtOpenFile with FILE_GENERIC_READ instead of the more generic GENERIC_READ access right. - OpenAndMapFile(): Add support for opening & mapping files with write access (to be used latter). svn path=/branches/setup_improvements/; revision=74710 - Split IniCacheLoad() and IniCacheSave() into: themselves & IniCacheLoadByHandle() and IniCacheSaveByHandle(), respectively, so that we can load & save INI files if we already have an opened handle to them. svn path=/branches/setup_improvements/; revision=74711 --- base/setup/lib/filesup.c | 25 +++++--- base/setup/lib/filesup.h | 7 ++- base/setup/lib/inicache.c | 157 ++++++++++++++++++++++++++-------------------- base/setup/lib/inicache.h | 11 ++++ 4 files changed, 122 insertions(+), 78 deletions(-) diff --git a/base/setup/lib/filesup.c b/base/setup/lib/filesup.c index 5a9ba0082c..056487771d 100644 --- a/base/setup/lib/filesup.c +++ b/base/setup/lib/filesup.c @@ -179,7 +179,7 @@ DoesFileExist( NULL); Status = NtOpenFile(&FileHandle, - GENERIC_READ | SYNCHRONIZE, + FILE_GENERIC_READ, // Contains SYNCHRONIZE &ObjectAttributes, &IoStatusBlock, FILE_SHARE_READ | FILE_SHARE_WRITE, @@ -305,20 +305,24 @@ Quit: NTSTATUS OpenAndMapFile( - IN HANDLE RootDirectory OPTIONAL, - IN PCWSTR PathNameToFile, + IN HANDLE RootDirectory OPTIONAL, + IN PCWSTR PathNameToFile, OUT PHANDLE FileHandle, // IN OUT PHANDLE OPTIONAL OUT PHANDLE SectionHandle, OUT PVOID* BaseAddress, - OUT PULONG FileSize OPTIONAL) + OUT PULONG FileSize OPTIONAL, + IN BOOLEAN ReadWriteAccess) { NTSTATUS Status; UNICODE_STRING FileName; OBJECT_ATTRIBUTES ObjectAttributes; IO_STATUS_BLOCK IoStatusBlock; + ULONG SectionPageProtection; SIZE_T ViewSize; PVOID ViewBase; + /* Open the file */ + RtlInitUnicodeString(&FileName, PathNameToFile); InitializeObjectAttributes(&ObjectAttributes, @@ -331,7 +335,8 @@ OpenAndMapFile( *SectionHandle = NULL; Status = NtOpenFile(FileHandle, - GENERIC_READ | SYNCHRONIZE, + FILE_GENERIC_READ | // Contains SYNCHRONIZE + (ReadWriteAccess ? FILE_GENERIC_WRITE : 0), &ObjectAttributes, &IoStatusBlock, FILE_SHARE_READ, @@ -369,12 +374,16 @@ OpenAndMapFile( /* Map the file in memory */ + SectionPageProtection = (ReadWriteAccess ? PAGE_READWRITE : PAGE_READONLY); + /* Create the section */ Status = NtCreateSection(SectionHandle, - SECTION_MAP_READ, + STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | + SECTION_MAP_READ | + (ReadWriteAccess ? SECTION_MAP_WRITE : 0), NULL, NULL, - PAGE_READONLY, + SectionPageProtection, SEC_COMMIT /* | SEC_IMAGE (_NO_EXECUTE) */, *FileHandle); if (!NT_SUCCESS(Status)) @@ -396,7 +405,7 @@ OpenAndMapFile( &ViewSize, ViewShare, 0, - PAGE_READONLY); + SectionPageProtection); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to map a view for file '%wZ', Status 0x%08lx\n", &FileName, Status); diff --git a/base/setup/lib/filesup.h b/base/setup/lib/filesup.h index f944d960ff..abc1b1c58d 100644 --- a/base/setup/lib/filesup.h +++ b/base/setup/lib/filesup.h @@ -68,12 +68,13 @@ NtPathToDiskPartComponents( NTSTATUS OpenAndMapFile( - IN HANDLE RootDirectory OPTIONAL, - IN PCWSTR PathNameToFile, + IN HANDLE RootDirectory OPTIONAL, + IN PCWSTR PathNameToFile, OUT PHANDLE FileHandle, // IN OUT PHANDLE OPTIONAL OUT PHANDLE SectionHandle, OUT PVOID* BaseAddress, - OUT PULONG FileSize OPTIONAL); + OUT PULONG FileSize OPTIONAL, + IN BOOLEAN ReadWriteAccess); BOOLEAN UnMapFile( diff --git a/base/setup/lib/inicache.c b/base/setup/lib/inicache.c index 295d957057..de0d6f6d92 100644 --- a/base/setup/lib/inicache.c +++ b/base/setup/lib/inicache.c @@ -544,46 +544,20 @@ IniCacheLoadFromMemory( } NTSTATUS -IniCacheLoad( +IniCacheLoadByHandle( PINICACHE *Cache, - PWCHAR FileName, + HANDLE FileHandle, BOOLEAN String) { - UNICODE_STRING Name; - OBJECT_ATTRIBUTES ObjectAttributes; - FILE_STANDARD_INFORMATION FileInfo; - IO_STATUS_BLOCK IoStatusBlock; - HANDLE FileHandle; NTSTATUS Status; + IO_STATUS_BLOCK IoStatusBlock; + FILE_STANDARD_INFORMATION FileInfo; PCHAR FileBuffer; ULONG FileLength; LARGE_INTEGER FileOffset; *Cache = NULL; - /* Open ini file */ - RtlInitUnicodeString(&Name, FileName); - - InitializeObjectAttributes(&ObjectAttributes, - &Name, - 0, - NULL, - NULL); - - Status = NtOpenFile(&FileHandle, - GENERIC_READ | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - FILE_SHARE_READ, - FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); - if (!NT_SUCCESS(Status)) - { - DPRINT("NtOpenFile() failed (Status %lx)\n", Status); - return Status; - } - - DPRINT("NtOpenFile() successful\n"); - /* Query file size */ Status = NtQueryInformationFile(FileHandle, &IoStatusBlock, @@ -593,7 +567,6 @@ IniCacheLoad( if (!NT_SUCCESS(Status)) { DPRINT("NtQueryInformationFile() failed (Status %lx)\n", Status); - NtClose(FileHandle); return Status; } @@ -608,7 +581,6 @@ IniCacheLoad( if (FileBuffer == NULL) { DPRINT1("RtlAllocateHeap() failed\n"); - NtClose(FileHandle); return STATUS_INSUFFICIENT_RESOURCES; } @@ -627,8 +599,6 @@ IniCacheLoad( /* Append NULL-terminator */ FileBuffer[FileLength] = 0; - NtClose(FileHandle); - if (!NT_SUCCESS(Status)) { DPRINT("NtReadFile() failed (Status %lx)\n", Status); @@ -647,6 +617,50 @@ Quit: return Status; } +NTSTATUS +IniCacheLoad( + PINICACHE *Cache, + PWCHAR FileName, + BOOLEAN String) +{ + NTSTATUS Status; + UNICODE_STRING Name; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE FileHandle; + + *Cache = NULL; + + /* Open the INI file */ + RtlInitUnicodeString(&Name, FileName); + + InitializeObjectAttributes(&ObjectAttributes, + &Name, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtOpenFile(&FileHandle, + FILE_GENERIC_READ | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenFile() failed (Status %lx)\n", Status); + return Status; + } + + DPRINT("NtOpenFile() successful\n"); + + Status = IniCacheLoadByHandle(Cache, FileHandle, String); + + /* Close the INI file */ + NtClose(FileHandle); + return Status; +} + VOID IniCacheDestroy( @@ -931,24 +945,19 @@ IniCacheCreate(VOID) NTSTATUS -IniCacheSave( +IniCacheSaveByHandle( PINICACHE Cache, - PWCHAR FileName) + HANDLE FileHandle) { - UNICODE_STRING Name; + NTSTATUS Status; PINICACHESECTION Section; PINICACHEKEY Key; ULONG BufferSize; PCHAR Buffer; PCHAR Ptr; ULONG Len; - NTSTATUS Status; - - OBJECT_ATTRIBUTES ObjectAttributes; IO_STATUS_BLOCK IoStatusBlock; LARGE_INTEGER Offset; - HANDLE FileHandle; - /* Calculate required buffer size */ BufferSize = 0; @@ -1008,7 +1017,40 @@ IniCacheSave( } } - /* Create ini file */ + /* Write to the INI file */ + Offset.QuadPart = 0LL; + Status = NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + Buffer, + BufferSize, + &Offset, + NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtWriteFile() failed (Status %lx)\n", Status); + RtlFreeHeap(ProcessHeap, 0, Buffer); + return Status; + } + + RtlFreeHeap(ProcessHeap, 0, Buffer); + return STATUS_SUCCESS; +} + +NTSTATUS +IniCacheSave( + PINICACHE Cache, + PWCHAR FileName) +{ + NTSTATUS Status; + UNICODE_STRING Name; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE FileHandle; + + /* Create the INI file */ RtlInitUnicodeString(&Name, FileName); InitializeObjectAttributes(&ObjectAttributes, @@ -1018,46 +1060,27 @@ IniCacheSave( NULL); Status = NtCreateFile(&FileHandle, - GENERIC_WRITE | SYNCHRONIZE, + FILE_GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_SUPERSEDE, - FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY | FILE_NON_DIRECTORY_FILE, NULL, 0); if (!NT_SUCCESS(Status)) { DPRINT("NtCreateFile() failed (Status %lx)\n", Status); - RtlFreeHeap(ProcessHeap, 0, Buffer); return Status; } - Offset.QuadPart = 0LL; - Status = NtWriteFile(FileHandle, - NULL, - NULL, - NULL, - &IoStatusBlock, - Buffer, - BufferSize, - &Offset, - NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT("NtWriteFile() failed (Status %lx)\n", Status); - NtClose(FileHandle); - RtlFreeHeap(ProcessHeap, 0, Buffer); - return Status; - } + Status = IniCacheSaveByHandle(Cache, FileHandle); + /* Close the INI file */ NtClose(FileHandle); - - RtlFreeHeap(ProcessHeap, 0, Buffer); - - return STATUS_SUCCESS; + return Status; } diff --git a/base/setup/lib/inicache.h b/base/setup/lib/inicache.h index d9b7a3d288..7d396d7a6f 100644 --- a/base/setup/lib/inicache.h +++ b/base/setup/lib/inicache.h @@ -60,6 +60,12 @@ IniCacheLoadFromMemory( ULONG FileLength, BOOLEAN String); +NTSTATUS +IniCacheLoadByHandle( + PINICACHE *Cache, + HANDLE FileHandle, + BOOLEAN String); + NTSTATUS IniCacheLoad( PINICACHE *Cache, @@ -109,6 +115,11 @@ IniCacheInsertKey( PINICACHE IniCacheCreate(VOID); +NTSTATUS +IniCacheSaveByHandle( + PINICACHE Cache, + HANDLE FileHandle); + NTSTATUS IniCacheSave( PINICACHE Cache,