micetools/src/micetools/dll/hooks/drive/drive.h

150 lines
5.3 KiB
C

#pragma once
#ifndef _MICE_DRIVE
#define _MICE_DRIVE extern
#endif
#include <Windows.h>
// (clang-format moves Windows.h if this isn't here!)
#include <Mmsystem.h>
#include <Ntddscsi.h>
#include <Objbase.h>
#include "../../common.h"
#include "../files.h"
#include "disks.h"
#include "irb.h"
#define DISK_PATH "dev/disk/"
#define SPD_PATH (DISK_PATH "spd.bin")
#define SBR0_PATH (DISK_PATH "sbr0.bin")
#define SBR1_PATH (DISK_PATH "sbr1.bin")
#define ORIGINAL0_PATH (DISK_PATH "original0.bin")
extern physical_disk_t SSD;
extern physical_disk_t UPDATE_USB;
extern physical_disk_t LOG_USB;
extern physical_disk_t ALPHA_DVD;
extern sbr_t SegaBootRecordDefault;
extern sbr_t SegaBootRecord0;
extern sbr_t SegaBootRecord1;
// Functions
void init_volume(disk_volume_t* vol);
void init_pd(physical_disk_t* pd);
void init_all_pd();
mice_partition_read_function_t ReadFunc_Original0;
mice_partition_write_function_t WriteFunc_Original0;
mice_partition_read_function_t ReadFunc_OSLogFiles;
FnDeviceIoControl c_drive_DeviceIoControl;
FnDeviceIoControl x_drive_DeviceIoControl;
FnDeviceIoControl q_drive_DeviceIoControl;
FnDeviceIoControl pd_DeviceIoControl;
FnDeviceIoControl volume_DeviceIoControl;
FnReadFile pd_ReadFile;
FnWriteFile pd_WriteFile;
FnReadFile q_drive_ReadFile;
sbr_slot_t* get_sbr_slot(spd_slot_t slot);
disk_volume_t* incrementFindIndex(HANDLE hFindVolume);
#define VOL_MATCH_PATH 1
#define VOL_MATCH_GUID 2
#define VOL_MATCH_DOS_DEVICE 4
#define VOL_MATCH_ALL (VOL_MATCH_PATH | VOL_MATCH_GUID | VOL_MATCH_DOS_DEVICE)
inline static BOOL matchVolume(disk_volume_t* volume, LPCSTR lpRootPathName, DWORD match);
disk_volume_t* getVolumeByPath(LPCSTR lpRootPathName, DWORD match);
// Hooks
BOOL WINAPI FakeFindNextVolumeW(HANDLE hFindVolume, LPWSTR lpszVolumeName, DWORD cchBufferLength);
BOOL WINAPI FakeFindNextVolumeA(HANDLE hFindVolume, LPSTR lpszVolumeName, DWORD cchBufferLength);
HANDLE WINAPI FakeFindFirstVolumeW(LPWSTR lpszVolumeName, DWORD cchBufferLength);
HANDLE WINAPI FakeFindFirstVolumeA(LPSTR lpszVolumeName, DWORD cchBufferLength);
BOOL WINAPI FakeFindVolumeClose(HANDLE hFindVolume);
BOOL WINAPI FakeGetVolumeInformationA(LPCSTR lpRootPathName, LPSTR lpVolumeNameBuffer,
DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber,
LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags,
LPSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize);
BOOL WINAPI FakeSetVolumeLabelA(LPCSTR lpRootPathName, LPCSTR lpVolumeName);
BOOL WINAPI FakeGetVolumeNameForVolumeMountPointA(LPCSTR lpszVolumeMountPoint, LPSTR lpszVolumeName,
DWORD cchBufferLength);
BOOL WINAPI FakeGetVolumePathNamesForVolumeNameA(LPCSTR lpszVolumeName, LPCH lpszVolumePathNames,
DWORD cchBufferLength, PDWORD lpcchReturnLength);
BOOL WINAPI FakeDeleteVolumeMountPointA(LPCSTR lpszVolumeMountPoint);
BOOL WINAPI FakeSetVolumeMountPointA(LPCSTR lpszVolumeMountPoint, LPCSTR lpszVolumeName);
DWORD WINAPI FakeQueryDosDeviceA(LPCSTR lpDeviceName, LPSTR lpTargetPath, DWORD ucchMax);
MCIERROR WINAPI Fake_mciSendStringA(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn,
HANDLE hwndCallback);
UINT WINAPI FakeGetDriveTypeA(LPCSTR lpRootPathName);
BOOL WINAPI FakeGetDiskFreeSpaceExA(LPCSTR lpDirectoryName,
PULARGE_INTEGER lpFreeBytesAvailableToCaller,
PULARGE_INTEGER lpTotalNumberOfBytes,
PULARGE_INTEGER lpTotalNumberOfFreeBytes);
_MICE_DRIVE BOOL(WINAPI* TrueGetDiskFreeSpaceExA)(LPCSTR lpDirectoryName,
PULARGE_INTEGER lpFreeBytesAvailableToCaller,
PULARGE_INTEGER lpTotalNumberOfBytes,
PULARGE_INTEGER lpTotalNumberOfFreeBytes);
void hook_drives();
// MBR
#define MBR_LBA_GAP 0x3f // 1 track worth of sectors is claimed for the MBR
#define EXT_HEADER_GAP 0x3f
#define MBR_FLAG_NONE 0x00
#define MBR_FLAG_BOOTABLE 0x80
#define MBR_FS_NONE 0x00
#define MBR_FS_EXT_CHS 0x05
#define MBR_FS_FAT16 0x06
#define MBR_FS_NTFS 0x07
#define MBR_FS_EXT_LBA 0x0F
#pragma pack(push, 1)
typedef struct mbr {
BYTE bootstrap_code[446];
struct {
BYTE status;
BYTE start_chs[3];
BYTE type;
BYTE end_chs[3];
DWORD lba;
DWORD sectors;
} partitions[4];
BYTE sig[2];
} mbr_t;
#pragma pack(pop)
#define IOCTL_CDROM_GET_DRIVE_GEOMETRY 0x2404c // #include <Ntddcdrm.h> causes errors
#define BLOCK_SIZE_FLASH 4096
#define BLOCK_SIZE_HDD 512
#define BLOCK_SIZE_CDROM 2048
#define BLOCK_SIZE_DVD BLOCK_SIZE_CDROM
// SCSI Peripheral Device Type
typedef enum {
DeviceTypeDAB = 0,
DeviceTypeSAB,
DeviceTypePrinter,
DeviceTypeProcessor,
DeviceTypeWriteOnce,
DeviceTypeCdRom,
DeviceTypeScanner,
DeviceTypeOpticalMemory,
DeviceTypeMediumChanger,
DeviceTypeCommunications,
DeviceTypeSAC = 12,
DeviceTypeEnclosure,
DeviceTypeOpticalCard,
DeviceTypeAutomationInterface,
DeviceTypeSecurityManager,
DeviceTypeHMBlock,
DeviceTypeUnknown = 31,
} DEVICE_TYPE;