[ros-dev] [ros-diffs] [hbelusca] 74549: [USETUP]: Add & modify some file utility functions that are going to be used in the next commit. - ConcatPaths that concatenates paths (or a path and a file name); - OpenAndMapFil...

Thomas Faber thomas.faber at reactos.org
Tue May 16 07:46:10 UTC 2017


Basic source control rule: please don't change things and move them
around at the same time. Unless your goal is to make sure noone reviews
your changes, of course.

Thanks.
-Thomas

On 2017-05-15 03:52, hbelusca at svn.reactos.org wrote:
> Author: hbelusca
> Date: Mon May 15 01:52:34 2017
> New Revision: 74549
>
> URL: http://svn.reactos.org/svn/reactos?rev=74549&view=rev
> Log:
> [USETUP]: Add & modify some file utility functions that are going to be used in the next commit.
> - ConcatPaths that concatenates paths (or a path and a file name);
> - OpenAndMapFile (resp. UnMapFile), whose purpose is to open a file and map it in memory (resp. unmap it from memory).
> - Add extra optional parameters to DoesPathExist and DoesFileExist: an optional "RootDirectory" handle and, for DoesFileExist only, an optional PathName.
>
> Modified:
>     branches/setup_improvements/base/setup/usetup/filesup.c
>     branches/setup_improvements/base/setup/usetup/filesup.h
>
> Modified: branches/setup_improvements/base/setup/usetup/filesup.c
> URL: http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/setup/usetup/filesup.c?rev=74549&r1=74548&r2=74549&view=diff
> ==============================================================================
> --- branches/setup_improvements/base/setup/usetup/filesup.c	[iso-8859-1] (original)
> +++ branches/setup_improvements/base/setup/usetup/filesup.c	[iso-8859-1] Mon May 15 01:52:34 2017
> @@ -93,59 +93,6 @@
>      return Status;
>  }
>
> -
> -static
> -BOOLEAN
> -DoesPathExist(
> -    PWSTR PathName)
> -{
> -    OBJECT_ATTRIBUTES ObjectAttributes;
> -    IO_STATUS_BLOCK IoStatusBlock;
> -    UNICODE_STRING Name;
> -    HANDLE FileHandle;
> -    NTSTATUS Status;
> -
> -    RtlInitUnicodeString(&Name, PathName);
> -
> -    InitializeObjectAttributes(&ObjectAttributes,
> -                               &Name,
> -                               OBJ_CASE_INSENSITIVE,
> -                               NULL,
> -                               NULL);
> -
> -    Status = NtOpenFile(&FileHandle,
> -                        GENERIC_READ | SYNCHRONIZE,
> -                        &ObjectAttributes,
> -                        &IoStatusBlock,
> -                        0,
> -                        FILE_SYNCHRONOUS_IO_NONALERT);
> -    if (NT_SUCCESS(Status))
> -        NtClose(FileHandle);
> -
> -    return NT_SUCCESS(Status);
> -}
> -
> -
> -BOOLEAN
> -IsValidPath(
> -    PWCHAR InstallDir,
> -    ULONG Length)
> -{
> -    UINT i;
> -
> -    // TODO: Add check for 8.3 too.
> -
> -    /* Check for whitespaces */
> -    for (i = 0; i < Length; i++)
> -    {
> -        if (isspace(InstallDir[i]))
> -            return FALSE;
> -    }
> -
> -    return TRUE;
> -}
> -
> -
>  NTSTATUS
>  SetupCreateDirectory(
>      PWCHAR PathName)
> @@ -183,7 +130,7 @@
>              *Ptr = 0;
>
>              DPRINT("PathBuffer: %S\n", PathBuffer);
> -            if (!DoesPathExist(PathBuffer))
> +            if (!DoesPathExist(NULL, PathBuffer))
>              {
>                  DPRINT("Create: %S\n", PathBuffer);
>                  Status = SetupCreateSingleDirectory(PathBuffer);
> @@ -197,7 +144,7 @@
>          Ptr++;
>      }
>
> -    if (!DoesPathExist(PathBuffer))
> +    if (!DoesPathExist(NULL, PathBuffer))
>      {
>          DPRINT("Create: %S\n", PathBuffer);
>          Status = SetupCreateSingleDirectory(PathBuffer);
> @@ -212,7 +159,6 @@
>
>      return Status;
>  }
> -
>
>  NTSTATUS
>  SetupCopyFile(
> @@ -233,7 +179,6 @@
>      SIZE_T SourceSectionSize = 0;
>      LARGE_INTEGER ByteOffset;
>
> -#ifdef __REACTOS__
>      RtlInitUnicodeString(&FileName,
>                           SourceFileName);
>
> @@ -254,20 +199,6 @@
>          DPRINT1("NtOpenFile failed: %x, %wZ\n", Status, &FileName);
>          goto done;
>      }
> -#else
> -    FileHandleSource = CreateFileW(SourceFileName,
> -                                   GENERIC_READ,
> -                                   FILE_SHARE_READ,
> -                                   NULL,
> -                                   OPEN_EXISTING,
> -                                   0,
> -                                   NULL);
> -    if (FileHandleSource == INVALID_HANDLE_VALUE)
> -    {
> -        Status = STATUS_UNSUCCESSFUL;
> -        goto done;
> -    }
> -#endif
>
>      Status = NtQueryInformationFile(FileHandleSource,
>                                      &IoStatusBlock,
> @@ -484,44 +415,254 @@
>  }
>  #endif
>
> +
> +BOOLEAN
> +IsValidPath(
> +    IN PWCHAR InstallDir,
> +    IN ULONG Length)
> +{
> +    UINT i;
> +
> +    // TODO: Add check for 8.3 too.
> +
> +    /* Check for whitespaces */
> +    for (i = 0; i < Length; i++)
> +    {
> +        if (isspace(InstallDir[i]))
> +            return FALSE;
> +    }
> +
> +    return TRUE;
> +}
> +
> +HRESULT
> +ConcatPaths(
> +    IN OUT PWSTR PathElem1,
> +    IN SIZE_T cchPathSize,
> +    IN PCWSTR PathElem2 OPTIONAL)
> +{
> +    HRESULT hr;
> +    SIZE_T cchPathLen;
> +
> +    if (!PathElem2)
> +        return S_OK;
> +    if (cchPathSize <= 1)
> +        return S_OK;
> +
> +    cchPathLen = min(cchPathSize, wcslen(PathElem1));
> +
> +    if (PathElem2[0] != L'\\' && cchPathLen > 0 && PathElem1[cchPathLen-1] != L'\\')
> +    {
> +        /* PathElem2 does not start with '\' and PathElem1 does not end with '\' */
> +        hr = StringCchCatW(PathElem1, cchPathSize, L"\\");
> +        if (FAILED(hr))
> +            return hr;
> +    }
> +    else if (PathElem2[0] == L'\\' && cchPathLen > 0 && PathElem1[cchPathLen-1] == L'\\')
> +    {
> +        /* PathElem2 starts with '\' and PathElem1 ends with '\' */
> +        while (*PathElem2 == L'\\')
> +            ++PathElem2; // Skip any backslash
> +    }
> +    hr = StringCchCatW(PathElem1, cchPathSize, PathElem2);
> +    return hr;
> +}
> +
> +//
> +// NOTE: It may be possible to merge both DoesPathExist and DoesFileExist...
> +//
> +BOOLEAN
> +DoesPathExist(
> +    IN HANDLE RootDirectory OPTIONAL,
> +    IN PCWSTR PathName)
> +{
> +    NTSTATUS Status;
> +    HANDLE FileHandle;
> +    OBJECT_ATTRIBUTES ObjectAttributes;
> +    IO_STATUS_BLOCK IoStatusBlock;
> +    UNICODE_STRING Name;
> +
> +    RtlInitUnicodeString(&Name, PathName);
> +
> +    InitializeObjectAttributes(&ObjectAttributes,
> +                               &Name,
> +                               OBJ_CASE_INSENSITIVE,
> +                               RootDirectory,
> +                               NULL);
> +
> +    Status = NtOpenFile(&FileHandle,
> +                        FILE_LIST_DIRECTORY | SYNCHRONIZE,
> +                        &ObjectAttributes,
> +                        &IoStatusBlock,
> +                        FILE_SHARE_READ | FILE_SHARE_WRITE,
> +                        FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE);
> +    if (NT_SUCCESS(Status))
> +        NtClose(FileHandle);
> +    else
> +        DPRINT1("Failed to open directory %wZ, Status 0x%08lx\n", &Name, Status);
> +
> +    return NT_SUCCESS(Status);
> +}
> +
>  BOOLEAN
>  DoesFileExist(
> -    PWSTR PathName,
> -    PWSTR FileName)
> -{
> +    IN HANDLE RootDirectory OPTIONAL,
> +    IN PCWSTR PathName OPTIONAL,
> +    IN PCWSTR FileName)
> +{
> +    NTSTATUS Status;
> +    HANDLE FileHandle;
>      OBJECT_ATTRIBUTES ObjectAttributes;
>      IO_STATUS_BLOCK IoStatusBlock;
>      UNICODE_STRING Name;
>      WCHAR FullName[MAX_PATH];
> -    HANDLE FileHandle;
> -    NTSTATUS Status;
> -
> -    wcscpy(FullName, PathName);
> -    if (FileName != NULL)
> -    {
> -        if (FileName[0] != L'\\')
> -            wcscat(FullName, L"\\");
> -        wcscat(FullName, FileName);
> -    }
> +
> +    if (PathName)
> +        StringCchCopyW(FullName, ARRAYSIZE(FullName), PathName);
> +    else
> +        FullName[0] = UNICODE_NULL;
> +
> +    if (FileName)
> +        ConcatPaths(FullName, ARRAYSIZE(FullName), FileName);
>
>      RtlInitUnicodeString(&Name, FullName);
>
>      InitializeObjectAttributes(&ObjectAttributes,
>                                 &Name,
>                                 OBJ_CASE_INSENSITIVE,
> -                               NULL,
> +                               RootDirectory,
>                                 NULL);
>
>      Status = NtOpenFile(&FileHandle,
>                          GENERIC_READ | SYNCHRONIZE,
>                          &ObjectAttributes,
>                          &IoStatusBlock,
> -                        0,
> -                        FILE_SYNCHRONOUS_IO_NONALERT);
> +                        FILE_SHARE_READ | FILE_SHARE_WRITE,
> +                        FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE);
>      if (NT_SUCCESS(Status))
>          NtClose(FileHandle);
> +    else
> +        DPRINT1("Failed to open file %wZ, Status 0x%08lx\n", &Name, Status);
>
>      return NT_SUCCESS(Status);
>  }
>
> +NTSTATUS
> +OpenAndMapFile(
> +    IN HANDLE RootDirectory OPTIONAL,
> +    IN PCWSTR PathName OPTIONAL,
> +    IN PCWSTR FileName,             // OPTIONAL
> +    OUT PHANDLE FileHandle,         // IN OUT PHANDLE OPTIONAL
> +    OUT PHANDLE SectionHandle,
> +    OUT PVOID* BaseAddress)
> +{
> +    NTSTATUS Status;
> +    OBJECT_ATTRIBUTES ObjectAttributes;
> +    IO_STATUS_BLOCK IoStatusBlock;
> +    SIZE_T ViewSize;
> +    PVOID ViewBase;
> +    UNICODE_STRING Name;
> +    WCHAR FullName[MAX_PATH];
> +
> +    if (PathName)
> +        StringCchCopyW(FullName, ARRAYSIZE(FullName), PathName);
> +    else
> +        FullName[0] = UNICODE_NULL;
> +
> +    if (FileName)
> +        ConcatPaths(FullName, ARRAYSIZE(FullName), FileName);
> +
> +    RtlInitUnicodeString(&Name, FullName);
> +
> +    InitializeObjectAttributes(&ObjectAttributes,
> +                               &Name,
> +                               OBJ_CASE_INSENSITIVE,
> +                               RootDirectory,
> +                               NULL);
> +
> +    *FileHandle = NULL;
> +    *SectionHandle = NULL;
> +
> +    Status = NtOpenFile(FileHandle,
> +                        GENERIC_READ | SYNCHRONIZE,
> +                        &ObjectAttributes,
> +                        &IoStatusBlock,
> +                        FILE_SHARE_READ,
> +                        FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE);
> +    if (!NT_SUCCESS(Status))
> +    {
> +        DPRINT1("Failed to open file %wZ, Status 0x%08lx\n", &Name, Status);
> +        return Status;
> +    }
> +
> +    /* Map the file in memory */
> +
> +    /* Create the section */
> +    Status = NtCreateSection(SectionHandle,
> +                             SECTION_MAP_READ,
> +                             NULL,
> +                             NULL,
> +                             PAGE_READONLY,
> +                             SEC_COMMIT /* | SEC_IMAGE (_NO_EXECUTE) */,
> +                             *FileHandle);
> +    if (!NT_SUCCESS(Status))
> +    {
> +        DPRINT1("Failed to create a memory section for file %wZ, Status 0x%08lx\n", &Name, Status);
> +        NtClose(*FileHandle);
> +        *FileHandle = NULL;
> +        return Status;
> +    }
> +
> +    /* Map the section */
> +    ViewSize = 0;
> +    ViewBase = NULL;
> +    Status = NtMapViewOfSection(*SectionHandle,
> +                                NtCurrentProcess(),
> +                                &ViewBase,
> +                                0, 0,
> +                                NULL,
> +                                &ViewSize,
> +                                ViewShare,
> +                                0,
> +                                PAGE_READONLY);
> +    if (!NT_SUCCESS(Status))
> +    {
> +        DPRINT1("Failed to map a view for file %wZ, Status 0x%08lx\n", &Name, Status);
> +        NtClose(*SectionHandle);
> +        *SectionHandle = NULL;
> +        NtClose(*FileHandle);
> +        *FileHandle = NULL;
> +        return Status;
> +    }
> +
> +    *BaseAddress = ViewBase;
> +    return STATUS_SUCCESS;
> +}
> +
> +BOOLEAN
> +UnMapFile(
> +    IN HANDLE SectionHandle,
> +    IN PVOID BaseAddress)
> +{
> +    NTSTATUS Status;
> +    BOOLEAN Success = TRUE;
> +
> +    Status = NtUnmapViewOfSection(NtCurrentProcess(), BaseAddress);
> +    if (!NT_SUCCESS(Status))
> +    {
> +        DPRINT1("UnMapFile: NtUnmapViewOfSection(0x%p) failed with Status 0x%08lx\n",
> +                BaseAddress, Status);
> +        Success = FALSE;
> +    }
> +    Status = NtClose(SectionHandle);
> +    if (!NT_SUCCESS(Status))
> +    {
> +        DPRINT1("UnMapFile: NtClose(0x%p) failed with Status 0x%08lx\n",
> +                SectionHandle, Status);
> +        Success = FALSE;
> +    }
> +
> +    return Success;
> +}
> +
>  /* EOF */
>
> Modified: branches/setup_improvements/base/setup/usetup/filesup.h
> URL: http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/setup/usetup/filesup.h?rev=74549&r1=74548&r2=74549&view=diff
> ==============================================================================
> --- branches/setup_improvements/base/setup/usetup/filesup.h	[iso-8859-1] (original)
> +++ branches/setup_improvements/base/setup/usetup/filesup.h	[iso-8859-1] Mon May 15 01:52:34 2017
> @@ -41,14 +41,41 @@
>      PWCHAR SourceFileName,
>      PWCHAR DestinationFileName);
>
> -BOOLEAN
> -DoesFileExist(
> -    PWSTR PathName,
> -    PWSTR FileName);
>
>  BOOLEAN
>  IsValidPath(
> -    PWCHAR InstallDir,
> -    ULONG Length);
> +    IN PWCHAR InstallDir,
> +    IN ULONG Length);
> +
> +HRESULT
> +ConcatPaths(
> +    IN OUT PWSTR PathElem1,
> +    IN SIZE_T cchPathSize,
> +    IN PCWSTR PathElem2 OPTIONAL);
> +
> +BOOLEAN
> +DoesPathExist(
> +    IN HANDLE RootDirectory OPTIONAL,
> +    IN PCWSTR PathName);
> +
> +BOOLEAN
> +DoesFileExist(
> +    IN HANDLE RootDirectory OPTIONAL,
> +    IN PCWSTR PathName OPTIONAL,
> +    IN PCWSTR FileName);
> +
> +NTSTATUS
> +OpenAndMapFile(
> +    IN HANDLE RootDirectory OPTIONAL,
> +    IN PCWSTR PathName OPTIONAL,
> +    IN PCWSTR FileName,             // OPTIONAL
> +    OUT PHANDLE FileHandle,         // IN OUT PHANDLE OPTIONAL
> +    OUT PHANDLE SectionHandle,
> +    OUT PVOID* BaseAddress);
> +
> +BOOLEAN
> +UnMapFile(
> +    IN HANDLE SectionHandle,
> +    IN PVOID BaseAddress);
>
>  /* EOF */
>
>




More information about the Ros-dev mailing list