Search code examples
cwindowswinapivirtual-memoryfile-mapping

How to find the end of a memory mapped file in Windows platform without previously knowing the size of the file?


I have mapped a file of unknown size (around 4-6 GiB) in Windows platform and got a pointer to the start of the file data returned from the MapFileView function. But how can I know that I have reached the end of the file when I access the data using the pointer sequentially?

Here is the code I have so far written and it successfully maps the file and returns the pointer:

    #include <Windows.h>
    #include <stdio.h>
    #include <inttypes.h>

    int main()
    {
      HANDLE hFile = CreateFile("Test.bin",
                                 GENERIC_READ | GENERIC_WRITE,
                                 0,
                                 NULL,
                                 OPEN_EXISTING,
                                 FILE_ATTRIBUTE_NORMAL,
                                 NULL);
      if (!hFile)
      {
        printf("Could not create file (%lu).\n", GetLastError());
        exit(1) ;
      }

      HANDLE hMapFile = CreateFileMappingA(hFile,
                                           NULL,
                                           PAGE_READWRITE,
                                           0,
                                           0,
                                           NULL);
      if (!hMapFile)
      {
        printf("Could not create file mapping object (%lu).\n", GetLastError());
        CloseHandle(hFile);
        exit(1);
      }

      int32_t* pBuf = (int32_t*) MapViewOfFile(hMapFile,
                                               FILE_MAP_ALL_ACCESS,
                                               0,
                                               0,
                                               0);
      if (!pBuf)
      {
        printf("Could not map file (%lu).\n", GetLastError());
        CloseHandle(hFile);
        CloseHandle(hMapFile);
        exit(1);
      };

      UnmapViewOfFile(pBuf);
      CloseHandle(hFile);
      CloseHandle(hMapFile);

      exit(0);
    }

So I wanted to read equal sized different parts of the file simultaneously in multiple threads. I believe mapped file is the right choice for this purpose. Advice about any other faster and possible approaches is highly appreciated.

I have researched some similar questions in the forum and I suppose this is the closest topic I could find: Read all contents of memory mapped file or Memory Mapped View Accessor without knowing the size of it But this answer is using C# and is not written using the WinAPI, therefore, I couldn't understand their process.

Thanks in advance :)


Solution

  • Call GetFileSizeEx to get the size of a file, and use this in combination with the base address and the current read address to determine where the end address is.