mirror of https://github.com/x64dbg/GleeBug
(hopefully) working initial Static.File class
This commit is contained in:
parent
a006043c26
commit
470396f736
|
|
@ -163,6 +163,7 @@
|
||||||
<ClCompile Include="Debugger.Thread.HardwareBreakpoint.cpp" />
|
<ClCompile Include="Debugger.Thread.HardwareBreakpoint.cpp" />
|
||||||
<ClCompile Include="Debugger.Thread.Registers.cpp" />
|
<ClCompile Include="Debugger.Thread.Registers.cpp" />
|
||||||
<ClCompile Include="Debugger.Thread.Registers.GetSet.cpp" />
|
<ClCompile Include="Debugger.Thread.Registers.GetSet.cpp" />
|
||||||
|
<ClCompile Include="Static.File.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Debugger.Breakpoint.h" />
|
<ClInclude Include="Debugger.Breakpoint.h" />
|
||||||
|
|
@ -175,6 +176,7 @@
|
||||||
<ClInclude Include="Debugger.Thread.Registers.h" />
|
<ClInclude Include="Debugger.Thread.Registers.h" />
|
||||||
<ClInclude Include="Debugger.Thread.Registers.Register.h" />
|
<ClInclude Include="Debugger.Thread.Registers.Register.h" />
|
||||||
<ClInclude Include="GleeBug.h" />
|
<ClInclude Include="GleeBug.h" />
|
||||||
|
<ClInclude Include="Static.File.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,9 @@
|
||||||
<ClCompile Include="Debugger.Thread.HardwareBreakpoint.cpp">
|
<ClCompile Include="Debugger.Thread.HardwareBreakpoint.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="Static.File.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Debugger.h">
|
<ClInclude Include="Debugger.h">
|
||||||
|
|
@ -94,5 +97,8 @@
|
||||||
<ClInclude Include="Debugger.Breakpoint.h">
|
<ClInclude Include="Debugger.Breakpoint.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="Static.File.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
#include "Static.File.h"
|
||||||
|
|
||||||
|
namespace GleeBug
|
||||||
|
{
|
||||||
|
File::File(const wchar_t* szFileName, File::Mode mode)
|
||||||
|
: _fileName(szFileName ? szFileName : L""),
|
||||||
|
_mode(mode),
|
||||||
|
_hFile(INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
File::~File()
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool File::Open()
|
||||||
|
{
|
||||||
|
return internalOpen(OPEN_EXISTING);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool File::Create(bool overwrite)
|
||||||
|
{
|
||||||
|
return internalOpen(overwrite ? CREATE_ALWAYS : CREATE_NEW);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool File::IsOpen() const
|
||||||
|
{
|
||||||
|
return _hFile != INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void File::Close()
|
||||||
|
{
|
||||||
|
if (IsOpen())
|
||||||
|
{
|
||||||
|
CloseHandle(_hFile);
|
||||||
|
_hFile = INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 File::GetSize()
|
||||||
|
{
|
||||||
|
return IsOpen() ? GetFileSize(_hFile, nullptr) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool File::Read(uint32 offset, uint8* data, uint32 size, uint32* bytesRead)
|
||||||
|
{
|
||||||
|
if (!IsOpen() || !SetFilePointer(_hFile, offset, nullptr, FILE_BEGIN))
|
||||||
|
{
|
||||||
|
if (bytesRead)
|
||||||
|
*bytesRead = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
DWORD NumberOfBytesRead = 0;
|
||||||
|
auto result = !!ReadFile(_hFile, data, size, &NumberOfBytesRead, nullptr);
|
||||||
|
if (bytesRead)
|
||||||
|
*bytesRead = uint32(NumberOfBytesRead);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool File::Write(uint32 offset, const uint8* data, uint32 size, uint32* bytesWritten)
|
||||||
|
{
|
||||||
|
if (!IsOpen() || !SetFilePointer(_hFile, offset, nullptr, FILE_BEGIN))
|
||||||
|
{
|
||||||
|
if (bytesWritten)
|
||||||
|
*bytesWritten = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
DWORD NumberOfBytesWritten = 0;
|
||||||
|
auto result = !!WriteFile(_hFile, data, size, &NumberOfBytesWritten, nullptr);
|
||||||
|
if (bytesWritten)
|
||||||
|
*bytesWritten = uint32(NumberOfBytesWritten);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool File::internalOpen(DWORD creation)
|
||||||
|
{
|
||||||
|
//get the access and sharemode flags
|
||||||
|
DWORD access, sharemode;
|
||||||
|
switch (_mode)
|
||||||
|
{
|
||||||
|
case ReadOnly:
|
||||||
|
access = GENERIC_READ;
|
||||||
|
sharemode = FILE_SHARE_READ;
|
||||||
|
break;
|
||||||
|
case ReadWrite:
|
||||||
|
access = GENERIC_READ | GENERIC_WRITE;
|
||||||
|
sharemode = FILE_SHARE_READ | FILE_SHARE_WRITE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//close the previous file
|
||||||
|
Close();
|
||||||
|
|
||||||
|
//use WinAPI to get the file handle
|
||||||
|
_hFile = CreateFileW(_fileName.c_str(), access, sharemode, nullptr, creation, 0, nullptr);
|
||||||
|
return IsOpen();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
#ifndef _STATIC_FILE_H
|
||||||
|
#define _STATIC_FILE_H
|
||||||
|
|
||||||
|
#include "Static.Global.h"
|
||||||
|
|
||||||
|
namespace GleeBug
|
||||||
|
{
|
||||||
|
class File
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Mode
|
||||||
|
{
|
||||||
|
ReadOnly,
|
||||||
|
ReadWrite
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit File(const wchar_t* szFileName, Mode mode = ReadOnly);
|
||||||
|
~File();
|
||||||
|
|
||||||
|
bool Open();
|
||||||
|
bool Create(bool overwrite = true);
|
||||||
|
bool IsOpen() const;
|
||||||
|
void Close();
|
||||||
|
|
||||||
|
uint32 GetSize();
|
||||||
|
bool Read(uint32 offset, uint8* data, uint32 size, uint32* bytesRead = nullptr);
|
||||||
|
bool Write(uint32 offset, const uint8* data, uint32 size, uint32* bytesWritten = nullptr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool internalOpen(DWORD creation);
|
||||||
|
|
||||||
|
std::wstring _fileName;
|
||||||
|
Mode _mode;
|
||||||
|
HANDLE _hFile;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_STATIC_FILE_H
|
||||||
Loading…
Reference in New Issue