| @@ -9,21 +9,67 @@ | |||||
| #include "filemap.h" | #include "filemap.h" | ||||
| // TODO: Support multiple filemaps | |||||
| static HANDLE hMap; | |||||
| // Support multiple filemaps | |||||
| typedef struct map_handle_t { | |||||
| const void* mem; | |||||
| HANDLE hMap; | |||||
| struct map_handle_t* next; | |||||
| } map_handle; | |||||
| static map_handle* map_handle_head = NULL; | |||||
| static HANDLE take_map_handle(const void* mem) { | |||||
| HANDLE handle = NULL; | |||||
| map_handle* last = NULL; | |||||
| for ( map_handle* node = map_handle_head; | |||||
| NULL != node; | |||||
| last = node, node = node->next) { | |||||
| if (mem == node->mem) { | |||||
| if (NULL == last) { | |||||
| map_handle_head = node->next; | |||||
| } else { | |||||
| last->next = node->next; | |||||
| } | |||||
| handle = node->hMap; | |||||
| free(node); | |||||
| } | |||||
| } | |||||
| return handle; | |||||
| } | |||||
| static void store_map_handle(const void* mem, HANDLE handle) { | |||||
| map_handle* node = malloc(sizeof(map_handle)); | |||||
| node->mem = mem; | |||||
| node->hMap = handle; | |||||
| node->next = map_handle_head; | |||||
| map_handle_head = node; | |||||
| } | |||||
| void* map_file(FILE* file, int size) { | void* map_file(FILE* file, int size) { | ||||
| void* mem = NULL; | |||||
| HANDLE hFile = (HANDLE)_get_osfhandle(fileno(file)); | HANDLE hFile = (HANDLE)_get_osfhandle(fileno(file)); | ||||
| hMap = CreateFileMappingA( | |||||
| HANDLE hMap = CreateFileMappingA( | |||||
| hFile, 0, PAGE_READONLY, 0, size, 0 | hFile, 0, PAGE_READONLY, 0, size, 0 | ||||
| ); | ); | ||||
| return MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, size); | |||||
| if (NULL != hMap) { | |||||
| mem = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, size); | |||||
| if (NULL == mem) { | |||||
| CloseHandle(hMap); | |||||
| } else { | |||||
| store_map_handle(mem, hMap); | |||||
| } | |||||
| } | |||||
| return mem; | |||||
| } | } | ||||
| void unmap_file(void* mem, int size) { | void unmap_file(void* mem, int size) { | ||||
| UnmapViewOfFile(mem); | UnmapViewOfFile(mem); | ||||
| CloseHandle(hMap); | |||||
| HANDLE handle = take_map_handle(mem); | |||||
| if (NULL != handle) CloseHandle(handle); | |||||
| } | } | ||||