[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
This commit is contained in:
Hermès Bélusca-Maïto 2017-05-31 00:18:13 +00:00
parent 6b6163a5d9
commit 7f5428633b
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
4 changed files with 131 additions and 87 deletions

View file

@ -179,7 +179,7 @@ DoesFileExist(
NULL); NULL);
Status = NtOpenFile(&FileHandle, Status = NtOpenFile(&FileHandle,
GENERIC_READ | SYNCHRONIZE, FILE_GENERIC_READ, // Contains SYNCHRONIZE
&ObjectAttributes, &ObjectAttributes,
&IoStatusBlock, &IoStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
@ -310,15 +310,19 @@ OpenAndMapFile(
OUT PHANDLE FileHandle, // IN OUT PHANDLE OPTIONAL OUT PHANDLE FileHandle, // IN OUT PHANDLE OPTIONAL
OUT PHANDLE SectionHandle, OUT PHANDLE SectionHandle,
OUT PVOID* BaseAddress, OUT PVOID* BaseAddress,
OUT PULONG FileSize OPTIONAL) OUT PULONG FileSize OPTIONAL,
IN BOOLEAN ReadWriteAccess)
{ {
NTSTATUS Status; NTSTATUS Status;
UNICODE_STRING FileName; UNICODE_STRING FileName;
OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
ULONG SectionPageProtection;
SIZE_T ViewSize; SIZE_T ViewSize;
PVOID ViewBase; PVOID ViewBase;
/* Open the file */
RtlInitUnicodeString(&FileName, PathNameToFile); RtlInitUnicodeString(&FileName, PathNameToFile);
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
@ -331,7 +335,8 @@ OpenAndMapFile(
*SectionHandle = NULL; *SectionHandle = NULL;
Status = NtOpenFile(FileHandle, Status = NtOpenFile(FileHandle,
GENERIC_READ | SYNCHRONIZE, FILE_GENERIC_READ | // Contains SYNCHRONIZE
(ReadWriteAccess ? FILE_GENERIC_WRITE : 0),
&ObjectAttributes, &ObjectAttributes,
&IoStatusBlock, &IoStatusBlock,
FILE_SHARE_READ, FILE_SHARE_READ,
@ -369,12 +374,16 @@ OpenAndMapFile(
/* Map the file in memory */ /* Map the file in memory */
SectionPageProtection = (ReadWriteAccess ? PAGE_READWRITE : PAGE_READONLY);
/* Create the section */ /* Create the section */
Status = NtCreateSection(SectionHandle, Status = NtCreateSection(SectionHandle,
SECTION_MAP_READ, STANDARD_RIGHTS_REQUIRED | SECTION_QUERY |
SECTION_MAP_READ |
(ReadWriteAccess ? SECTION_MAP_WRITE : 0),
NULL, NULL,
NULL, NULL,
PAGE_READONLY, SectionPageProtection,
SEC_COMMIT /* | SEC_IMAGE (_NO_EXECUTE) */, SEC_COMMIT /* | SEC_IMAGE (_NO_EXECUTE) */,
*FileHandle); *FileHandle);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -396,7 +405,7 @@ OpenAndMapFile(
&ViewSize, &ViewSize,
ViewShare, ViewShare,
0, 0,
PAGE_READONLY); SectionPageProtection);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Failed to map a view for file '%wZ', Status 0x%08lx\n", &FileName, Status); DPRINT1("Failed to map a view for file '%wZ', Status 0x%08lx\n", &FileName, Status);

View file

@ -73,7 +73,8 @@ OpenAndMapFile(
OUT PHANDLE FileHandle, // IN OUT PHANDLE OPTIONAL OUT PHANDLE FileHandle, // IN OUT PHANDLE OPTIONAL
OUT PHANDLE SectionHandle, OUT PHANDLE SectionHandle,
OUT PVOID* BaseAddress, OUT PVOID* BaseAddress,
OUT PULONG FileSize OPTIONAL); OUT PULONG FileSize OPTIONAL,
IN BOOLEAN ReadWriteAccess);
BOOLEAN BOOLEAN
UnMapFile( UnMapFile(

View file

@ -544,46 +544,20 @@ IniCacheLoadFromMemory(
} }
NTSTATUS NTSTATUS
IniCacheLoad( IniCacheLoadByHandle(
PINICACHE *Cache, PINICACHE *Cache,
PWCHAR FileName, HANDLE FileHandle,
BOOLEAN String) BOOLEAN String)
{ {
UNICODE_STRING Name;
OBJECT_ATTRIBUTES ObjectAttributes;
FILE_STANDARD_INFORMATION FileInfo;
IO_STATUS_BLOCK IoStatusBlock;
HANDLE FileHandle;
NTSTATUS Status; NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock;
FILE_STANDARD_INFORMATION FileInfo;
PCHAR FileBuffer; PCHAR FileBuffer;
ULONG FileLength; ULONG FileLength;
LARGE_INTEGER FileOffset; LARGE_INTEGER FileOffset;
*Cache = NULL; *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 */ /* Query file size */
Status = NtQueryInformationFile(FileHandle, Status = NtQueryInformationFile(FileHandle,
&IoStatusBlock, &IoStatusBlock,
@ -593,7 +567,6 @@ IniCacheLoad(
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT("NtQueryInformationFile() failed (Status %lx)\n", Status); DPRINT("NtQueryInformationFile() failed (Status %lx)\n", Status);
NtClose(FileHandle);
return Status; return Status;
} }
@ -608,7 +581,6 @@ IniCacheLoad(
if (FileBuffer == NULL) if (FileBuffer == NULL)
{ {
DPRINT1("RtlAllocateHeap() failed\n"); DPRINT1("RtlAllocateHeap() failed\n");
NtClose(FileHandle);
return STATUS_INSUFFICIENT_RESOURCES; return STATUS_INSUFFICIENT_RESOURCES;
} }
@ -627,8 +599,6 @@ IniCacheLoad(
/* Append NULL-terminator */ /* Append NULL-terminator */
FileBuffer[FileLength] = 0; FileBuffer[FileLength] = 0;
NtClose(FileHandle);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT("NtReadFile() failed (Status %lx)\n", Status); DPRINT("NtReadFile() failed (Status %lx)\n", Status);
@ -647,6 +617,50 @@ Quit:
return Status; 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 VOID
IniCacheDestroy( IniCacheDestroy(
@ -931,24 +945,19 @@ IniCacheCreate(VOID)
NTSTATUS NTSTATUS
IniCacheSave( IniCacheSaveByHandle(
PINICACHE Cache, PINICACHE Cache,
PWCHAR FileName) HANDLE FileHandle)
{ {
UNICODE_STRING Name; NTSTATUS Status;
PINICACHESECTION Section; PINICACHESECTION Section;
PINICACHEKEY Key; PINICACHEKEY Key;
ULONG BufferSize; ULONG BufferSize;
PCHAR Buffer; PCHAR Buffer;
PCHAR Ptr; PCHAR Ptr;
ULONG Len; ULONG Len;
NTSTATUS Status;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
LARGE_INTEGER Offset; LARGE_INTEGER Offset;
HANDLE FileHandle;
/* Calculate required buffer size */ /* Calculate required buffer size */
BufferSize = 0; BufferSize = 0;
@ -1008,33 +1017,7 @@ IniCacheSave(
} }
} }
/* Create ini file */ /* Write to the INI file */
RtlInitUnicodeString(&Name, FileName);
InitializeObjectAttributes(&ObjectAttributes,
&Name,
0,
NULL,
NULL);
Status = NtCreateFile(&FileHandle,
GENERIC_WRITE | SYNCHRONIZE,
&ObjectAttributes,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_SUPERSEDE,
FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY,
NULL,
0);
if (!NT_SUCCESS(Status))
{
DPRINT("NtCreateFile() failed (Status %lx)\n", Status);
RtlFreeHeap(ProcessHeap, 0, Buffer);
return Status;
}
Offset.QuadPart = 0LL; Offset.QuadPart = 0LL;
Status = NtWriteFile(FileHandle, Status = NtWriteFile(FileHandle,
NULL, NULL,
@ -1048,18 +1031,58 @@ IniCacheSave(
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT("NtWriteFile() failed (Status %lx)\n", Status); DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
NtClose(FileHandle);
RtlFreeHeap(ProcessHeap, 0, Buffer); RtlFreeHeap(ProcessHeap, 0, Buffer);
return Status; return Status;
} }
NtClose(FileHandle);
RtlFreeHeap(ProcessHeap, 0, Buffer); RtlFreeHeap(ProcessHeap, 0, Buffer);
return STATUS_SUCCESS; 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,
&Name,
0,
NULL,
NULL);
Status = NtCreateFile(&FileHandle,
FILE_GENERIC_WRITE | SYNCHRONIZE,
&ObjectAttributes,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_SUPERSEDE,
FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY | FILE_NON_DIRECTORY_FILE,
NULL,
0);
if (!NT_SUCCESS(Status))
{
DPRINT("NtCreateFile() failed (Status %lx)\n", Status);
return Status;
}
Status = IniCacheSaveByHandle(Cache, FileHandle);
/* Close the INI file */
NtClose(FileHandle);
return Status;
}
PINICACHESECTION PINICACHESECTION
IniCacheAppendSection( IniCacheAppendSection(

View file

@ -60,6 +60,12 @@ IniCacheLoadFromMemory(
ULONG FileLength, ULONG FileLength,
BOOLEAN String); BOOLEAN String);
NTSTATUS
IniCacheLoadByHandle(
PINICACHE *Cache,
HANDLE FileHandle,
BOOLEAN String);
NTSTATUS NTSTATUS
IniCacheLoad( IniCacheLoad(
PINICACHE *Cache, PINICACHE *Cache,
@ -109,6 +115,11 @@ IniCacheInsertKey(
PINICACHE PINICACHE
IniCacheCreate(VOID); IniCacheCreate(VOID);
NTSTATUS
IniCacheSaveByHandle(
PINICACHE Cache,
HANDLE FileHandle);
NTSTATUS NTSTATUS
IniCacheSave( IniCacheSave(
PINICACHE Cache, PINICACHE Cache,