spicetools/hooks/devicehook.h

82 lines
2.3 KiB
C++

#pragma once
#include <windows.h>
#include <string>
namespace hooks::device {
extern bool ENABLE;
}
extern bool DEVICE_CREATEFILE_DEBUG;
class CustomHandle {
public:
HANDLE handle = INVALID_HANDLE_VALUE;
bool com_pass = false;
virtual ~CustomHandle() = default;
virtual bool open(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) {
return open(lpFileName);
}
virtual bool open(LPCWSTR lpFileName) {
return false;
};
virtual int read(LPVOID lpBuffer, DWORD nNumberOfBytesToRead) {
return -1;
};
virtual int write(LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite) {
return -1;
};
virtual int device_io(DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer,
DWORD nOutBufferSize) {
return -1;
};
virtual size_t bytes_available() {
return 255;
}
virtual bool close() {
return true;
};
virtual void file_info(LPBY_HANDLE_FILE_INFORMATION lpFileInformation) {
memset(lpFileInformation, 0, sizeof(*lpFileInformation));
};
DCB comm_state {};
COMMTIMEOUTS comm_timeouts {};
};
class MITMHandle : public CustomHandle {
protected:
LPCWSTR lpFileName = L"";
bool lpFileNameContains = false;
std::string rec_file = "";
public:
MITMHandle(LPCWSTR lpFileName, std::string rec_file = "", bool lpFileNameContains = false);
bool open(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) override;
int read(LPVOID lpBuffer, DWORD nNumberOfBytesToRead) override;
int write(LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite) override;
int device_io(DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer,
DWORD nOutBufferSize) override;
size_t bytes_available() override;
bool close() override;
};
void devicehook_init(HMODULE module = nullptr);
void devicehook_init_trampoline();
void devicehook_add(CustomHandle *device_handle);
void devicehook_dispose();