BOOL KtMapFileEx(const wchar_t* FileName, DWORD ReadOrWrite,
LPHANDLE FileHandle, LPDWORD FileSize,
LPHANDLE FileMap, LPVOID FileMapVA,
DWORD SizeModifier)
{
DWORD FileAccess = 0;
DWORD FileMapType = 0;
DWORD FileMapViewType = 0;
if (ReadOrWrite == UE_ACCESS_READ)
{
FileAccess = GENERIC_READ;
FileMapType = PAGE_READONLY;
FileMapViewType = FILE_MAP_READ;
}
else if (ReadOrWrite == UE_ACCESS_WRITE)
{
FileAccess = GENERIC_WRITE;
FileMapType = PAGE_READWRITE;
FileMapViewType = FILE_MAP_WRITE;
}
else if (ReadOrWrite == UE_ACCESS_ALL)
{
FileAccess = GENERIC_READ + GENERIC_WRITE + GENERIC_EXECUTE;
FileMapType = PAGE_EXECUTE_READWRITE;
FileMapViewType = FILE_MAP_WRITE;
}
else
{
FileAccess = GENERIC_READ + GENERIC_WRITE + GENERIC_EXECUTE;
FileMapType = PAGE_EXECUTE_READWRITE;
FileMapViewType = FILE_MAP_ALL_ACCESS;
}
HANDLE v1 = CreateFileW(FileName,
FileAccess,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (v1 != INVALID_HANDLE_VALUE)
{
*FileHandle = v1;
DWORD v7 = GetFileSize(v1, NULL);
v7 = v7 + SizeModifier;
*FileSize = v7;
HANDLE v5 = CreateFileMapping(v1,
NULL,
FileMapType,
NULL,
v7,
NULL);
if (v5 != NULL)
{
*FileMap = v5;
LPVOID v10 = MapViewOfFile(v5, FileMapViewType, NULL, NULL, NULL);
if (v10 != NULL)
{
RtlMoveMemory(FileMapVA, &v10, sizeof ULONG_PTR);
return true;
}
}
RtlZeroMemory(FileMapVA, sizeof ULONG_PTR);
*FileHandle = NULL;
*FileSize = NULL;
KtCloseHandle(v1);
}
else
{
RtlZeroMemory(FileMapVA, sizeof ULONG_PTR);
}
return false;
}
VOID KtUnMapFileEx(HANDLE FileHandle, DWORD FileSize, HANDLE FileMap, ULONG_PTR FileMapVA)
{
if (UnmapViewOfFile((void*)FileMapVA))
{
KtCloseHandle(FileMap);
SetFilePointer(FileHandle, FileSize, NULL, FILE_BEGIN);
SetEndOfFile(FileHandle);
KtCloseHandle(FileHandle);
}
}