forked from LeenkxTeam/LNXRNT
70 lines
1.5 KiB
C
70 lines
1.5 KiB
C
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <cstdint>
|
||
|
|
#include <cstdio>
|
||
|
|
|
||
|
|
#ifdef _WIN32
|
||
|
|
#include <Windows.h>
|
||
|
|
#else
|
||
|
|
#include <sys/mman.h>
|
||
|
|
#include <unistd.h>
|
||
|
|
#endif
|
||
|
|
|
||
|
|
struct DataMap {
|
||
|
|
void* data = nullptr;
|
||
|
|
size_t size = 0;
|
||
|
|
|
||
|
|
#ifdef _WIN32
|
||
|
|
HANDLE map_handle = nullptr;
|
||
|
|
#endif
|
||
|
|
|
||
|
|
bool map_from_reader(void* reader_data, size_t reader_size) {
|
||
|
|
size = reader_size;
|
||
|
|
if (size == 0) return true;
|
||
|
|
#ifdef _WIN32
|
||
|
|
HANDLE file_handle = reader_data;
|
||
|
|
map_handle = CreateFileMappingA(file_handle, nullptr, PAGE_READONLY, 0, 0, nullptr);
|
||
|
|
if (!map_handle) return false;
|
||
|
|
data = MapViewOfFile(map_handle, FILE_MAP_READ, 0, 0, 0);
|
||
|
|
if (!data) {
|
||
|
|
CloseHandle(map_handle);
|
||
|
|
map_handle = nullptr;
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
#else
|
||
|
|
int fd = fileno((FILE*)reader_data);
|
||
|
|
if (fd < 0) return false;
|
||
|
|
data = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
|
||
|
|
if (data == MAP_FAILED) {
|
||
|
|
data = nullptr;
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
void close() {
|
||
|
|
if (data) {
|
||
|
|
#ifdef _WIN32
|
||
|
|
UnmapViewOfFile(data);
|
||
|
|
#else
|
||
|
|
munmap(data, size);
|
||
|
|
#endif
|
||
|
|
data = nullptr;
|
||
|
|
}
|
||
|
|
#ifdef _WIN32
|
||
|
|
if (map_handle) { CloseHandle(map_handle); map_handle = nullptr; }
|
||
|
|
#endif
|
||
|
|
size = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
~DataMap() { close(); }
|
||
|
|
};
|
||
|
|
|
||
|
|
inline void delete_map(void* ptr, size_t length, void* deleter_data) {
|
||
|
|
DataMap* dm = static_cast<DataMap*>(deleter_data);
|
||
|
|
if (dm) dm->close();
|
||
|
|
delete dm;
|
||
|
|
}
|