| 15 | void CMapStreamReader::destroy() { unmap(); } |
| 16 | |
| 17 | void CMapStreamReader::map(const size_t& new_offset) |
| 18 | { |
| 19 | VERIFY(new_offset <= m_file_size); |
| 20 | m_current_offset_from_start = new_offset; |
| 21 | |
| 22 | const size_t granularity = FS.dwAllocGranularity; |
| 23 | size_t start_offset = m_start_offset + new_offset; |
| 24 | const size_t pure_start_offset = start_offset; |
| 25 | start_offset = (start_offset / granularity) * granularity; |
| 26 | |
| 27 | VERIFY(pure_start_offset >= start_offset); |
| 28 | const size_t pure_end_offset = m_window_size + pure_start_offset; |
| 29 | size_t end_offset = pure_end_offset / granularity; |
| 30 | if (pure_end_offset % granularity) |
| 31 | ++end_offset; |
| 32 | |
| 33 | end_offset *= granularity; |
| 34 | if (end_offset > m_archive_size) |
| 35 | end_offset = m_archive_size; |
| 36 | |
| 37 | m_current_window_size = end_offset - start_offset; |
| 38 | m_current_map_view_of_file = static_cast<u8*>(MapViewOfFile(m_file_mapping_handle, FILE_MAP_READ, 0, start_offset, m_current_window_size)); |
| 39 | m_current_pointer = m_current_map_view_of_file; |
| 40 | |
| 41 | const size_t difference = pure_start_offset - start_offset; |
| 42 | m_current_window_size -= difference; |
| 43 | m_current_pointer += difference; |
| 44 | m_start_pointer = m_current_pointer; |
| 45 | } |
| 46 | |
| 47 | void CMapStreamReader::advance(std::ptrdiff_t offset) |
| 48 | { |