mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 13:26:17 +00:00
[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:
parent
6b6163a5d9
commit
7f5428633b
4 changed files with 131 additions and 87 deletions
|
@ -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,
|
||||||
|
@ -305,20 +305,24 @@ Quit:
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
OpenAndMapFile(
|
OpenAndMapFile(
|
||||||
IN HANDLE RootDirectory OPTIONAL,
|
IN HANDLE RootDirectory OPTIONAL,
|
||||||
IN PCWSTR PathNameToFile,
|
IN PCWSTR PathNameToFile,
|
||||||
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);
|
||||||
|
|
|
@ -68,12 +68,13 @@ NtPathToDiskPartComponents(
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
OpenAndMapFile(
|
OpenAndMapFile(
|
||||||
IN HANDLE RootDirectory OPTIONAL,
|
IN HANDLE RootDirectory OPTIONAL,
|
||||||
IN PCWSTR PathNameToFile,
|
IN PCWSTR PathNameToFile,
|
||||||
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(
|
||||||
|
|
|
@ -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,
|
||||||
|
@ -1047,19 +1030,59 @@ IniCacheSave(
|
||||||
NULL);
|
NULL);
|
||||||
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(
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue