Guest User

Untitled

a guest
Jun 12th, 2013
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include "StdAFx.h"
  2. #include "BinFile.h"
  3.  
  4. BinFile::BinFile(const std::wstring& fileName) {
  5.     mFile = CreateFile(fileName.c_str(), FILE_READ_ACCESS, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
  6.  
  7.     if(mFile == INVALID_HANDLE_VALUE) {
  8.         uint32 err = GetLastError();
  9.         throw std::exception("File not found!");
  10.     }
  11.  
  12.     LARGE_INTEGER size;
  13.     GetFileSizeEx(mFile, &size);
  14.     mMapping = CreateFileMapping(mFile, nullptr, PAGE_READWRITE, size.HighPart, size.LowPart, nullptr);
  15.     mFileView = MapViewOfFile(mMapping, FILE_MAP_READ, 0, 0, 0);
  16. }
  17.  
  18. BinFile::~BinFile() {
  19.     if(mFile != INVALID_HANDLE_VALUE) {
  20.         CloseHandle(mFile);
  21.     }
  22.  
  23.     if(mFileView != nullptr) {
  24.         UnmapViewOfFile(mFileView);
  25.     }
  26.  
  27.     if(mMapping != nullptr) {
  28.         CloseHandle(mMapping);
  29.     }
  30. }
  31.  
  32. LPBYTE BinFile::getPointer(uint32 offset) {
  33.     return ((LPBYTE)mFileView) + offset;
  34. }
  35.  
  36. void BinFile::seekMod(int64 mod) {
  37.     LARGE_INTEGER modPos;
  38.     modPos.QuadPart = mod;
  39.     SetFilePointerEx(mFile, modPos, &modPos, SEEK_CUR);
  40. }
  41.  
  42. void BinFile::seek(uint64 pos) {
  43.     LARGE_INTEGER modPos;
  44.     modPos.QuadPart = pos;
  45.     SetFilePointerEx(mFile, modPos, &modPos, SEEK_SET);
  46. }
  47.  
  48. uint64 BinFile::tell() {
  49.     LARGE_INTEGER modPos;
  50.     modPos.QuadPart = 0;
  51.     SetFilePointerEx(mFile, modPos, &modPos, SEEK_CUR);
  52.     return modPos.QuadPart;
  53. }
  54.  
  55. void BinFile::read(void* memory, uint64 numBytes) {
  56.     DWORD numRead = 0;
  57.     ReadFile(mFile, memory, (uint32)numBytes, &numRead, nullptr);
  58. }
  59.  
  60. std::wstring BinFile::readString() {
  61.     std::vector<char> strBytes;
  62.     char c = read<char>();
  63.     do {
  64.         strBytes.push_back(c);
  65.         c = read<char>();
  66.     } while(c != '\0');
  67.  
  68.     std::vector<wchar_t> uni(strBytes.size());
  69.     MultiByteToWideChar(CP_UTF8, 0, strBytes.data(), (uint32)strBytes.size(), uni.data(), (uint32)uni.size());
  70.     return uni.data();
  71. }
Advertisement
Add Comment
Please, Sign In to add comment