diff --git a/src/micetools/dll/comdevice.c b/src/micetools/dll/comdevice.c index dbc9a91..945f726 100644 --- a/src/micetools/dll/comdevice.c +++ b/src/micetools/dll/comdevice.c @@ -1,5 +1,7 @@ #include "comdevice.h" +#define RESERVED_JVS_COM_PORT 4 + com_device_t* GetComDevice(HANDLE hFile) { open_hook_t* pHData = GetDataForHandle(hFile, HDATA_FILE); return pHData->hook->com_hook->com_device; @@ -14,12 +16,15 @@ BOOL DevPurgeComm(HANDLE hFile, DWORD dwFlags) { if (dwFlags & PURGE_RXCLEAR) ringbuf_purge(&(GetComDevice(hFile)->out)); return TRUE; } -BOOL DevGetCommModemStatus(HANDLE hFile, LPDWORD lpModelStat) { - // TODO: JVS SENSE +BOOL DevGetCommModemStatus(HANDLE hFile, LPDWORD lpModemStatus) { + if (!lpModemStatus) return FALSE; + com_device_t* dev = GetComDevice(hFile); + if (!dev) return false; + *lpModemStatus = dev->modemStatus; return TRUE; } BOOL DevWaitCommEvent(HANDLE hFile, LPDWORD lpEvtMask, LPOVERLAPPED lpOverlapped) { - WaitForSingleObject(GetComDevice(hFile)->event, INFINITE); + WaitForSingleObject(GetComDevice(hFile)->dataOutReady, INFINITE); if (lpOverlapped != NULL) SetEvent(lpOverlapped->hEvent); return TRUE; } @@ -43,8 +48,10 @@ BOOL DevClearCommError(HANDLE hFile, LPDWORD lpErrors, LPCOMSTAT lpStat) { BOOL DevWriteFile(file_context_t* ctx, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) { if (nNumberOfBytesToWrite > 0xffff) return FALSE; + com_device_t* dev = GetComDevice(ctx->m_Handle); // Ignore overflow - ringbuf_write(&(GetComDevice(ctx->m_Handle)->in), lpBuffer, nNumberOfBytesToWrite & 0xffff); + ringbuf_write(&(dev->in), lpBuffer, nNumberOfBytesToWrite & 0xffff); + SetEvent(dev->dataInReady); if (lpNumberOfBytesWritten) *lpNumberOfBytesWritten = nNumberOfBytesToWrite; return TRUE; } @@ -60,18 +67,18 @@ BOOL DevReadFile(file_context_t* ctx, LPVOID lpBuffer, DWORD nNumberOfBytesToRea short read = ringbuf_read(&(comdev->out), lpBuffer, nNumberOfBytesToRead & 0xffff); if (lpNumberOfBytesRead) *lpNumberOfBytesRead = read; - if (read != 0) { - // log_info("drf", "%d", read); - // for (int i = 0; i < read; i++) { - // printf("%02x ", ((LPBYTE)lpBuffer)[i]); - // } - // puts(""); + if (lpOverlapped) { + lpOverlapped->InternalHigh = read; + SetEvent(lpOverlapped->hEvent); } return TRUE; } short comdev_read_blocking(com_device_t* com, unsigned char* buffer, short bytes) { - while (comdev_available(com) < bytes) SwitchToThread(); + while (comdev_available(com) < bytes) { + WaitForSingleObject(com->dataInReady, INFINITE); + SwitchToThread(); + } return ringbuf_read(&com->in, buffer, bytes); } short comdev_read(com_device_t* com, unsigned char* buffer, short bytes) { @@ -79,7 +86,7 @@ short comdev_read(com_device_t* com, unsigned char* buffer, short bytes) { } bool comdev_write(com_device_t* com, const unsigned char* buffer, short bytes) { bool ret = ringbuf_write(&com->out, buffer, bytes); - SetEvent(com->event); + SetEvent(com->dataOutReady); return ret; } short comdev_available(com_device_t* com) { return ringbuf_available(&com->in); } @@ -164,7 +171,10 @@ BOOL attach_com_device(BYTE port, FnComDeviceThread* thread) { return FALSE; } com_device_t* com = com_devices[port - 1]; + if (com->thread != INVALID_HANDLE_VALUE) { + if (port == RESERVED_JVS_COM_PORT) return FALSE; + // No need to change what's assigned! if (com->thread_worker == thread) return TRUE; @@ -179,8 +189,8 @@ BOOL attach_com_device(BYTE port, FnComDeviceThread* thread) { } void detach_com_device(BYTE port) { // If the port is out of range, there's guaranteeably nothing attached - if (port < 1 || port > NUM_COM_PORTS) - return; + if (port < 1 || port > NUM_COM_PORTS) return; + if (port == RESERVED_JVS_COM_PORT) return; com_device_t* com = com_devices[port - 1]; if (!com->thread) return; @@ -190,6 +200,8 @@ void detach_com_device(BYTE port) { } void detach_all_com_devices(void) { for (int i = 0; i < NUM_COM_PORTS; i++) { + if (i == RESERVED_JVS_COM_PORT - 1) continue; + if (com_devices[i]->thread != INVALID_HANDLE_VALUE) { TerminateThread(com_devices[i]->thread, (DWORD)-1); com_devices[i]->thread = INVALID_HANDLE_VALUE; @@ -223,7 +235,7 @@ com_device_t* new_com_device(BYTE port) { ringbuf_purge(&com_device->in); ringbuf_purge(&com_device->out); - com_device->event = CreateEventW(NULL, TRUE, FALSE, com_device->com->wName); + com_device->dataOutReady = CreateEventW(NULL, TRUE, FALSE, com_device->com->wName); com_device->thread = INVALID_HANDLE_VALUE; hook_file(file); @@ -235,4 +247,4 @@ void init_com_devices(void) { for (BYTE i = 0; i < NUM_COM_PORTS; i++) { com_devices[i] = new_com_device(i + 1); } -} \ No newline at end of file +} diff --git a/src/micetools/dll/comdevice.h b/src/micetools/dll/comdevice.h index fc2e8ca..978da06 100644 --- a/src/micetools/dll/comdevice.h +++ b/src/micetools/dll/comdevice.h @@ -14,7 +14,9 @@ struct com_device { ring_buffer_t in; ring_buffer_t out; - HANDLE event; + DWORD modemStatus; + HANDLE dataInReady; + HANDLE dataOutReady; HANDLE thread; FnComDeviceThread* thread_worker; }; diff --git a/src/micetools/dll/devices/_devices.c b/src/micetools/dll/devices/_devices.c index cd76078..2d3a748 100644 --- a/src/micetools/dll/devices/_devices.c +++ b/src/micetools/dll/devices/_devices.c @@ -19,7 +19,6 @@ inline void start_device(const char* name, FnComDeviceThread* thread) { _start_device_n(1); _start_device_n(2); _start_device_n(3); - _start_device_n(4); _start_device_n(5); _start_device_n(6); _start_device_n(7); @@ -33,7 +32,6 @@ inline void stop_old_devices() { _stop_if_unregistered(1); _stop_if_unregistered(2); _stop_if_unregistered(3); - _stop_if_unregistered(4); _stop_if_unregistered(5); _stop_if_unregistered(6); _stop_if_unregistered(7); diff --git a/src/micetools/dll/devices/ser_tn32msec.c b/src/micetools/dll/devices/ser_tn32msec.c index ec2f7a6..698f62f 100644 --- a/src/micetools/dll/devices/ser_tn32msec.c +++ b/src/micetools/dll/devices/ser_tn32msec.c @@ -15,7 +15,6 @@ BYTE extra[0xff]; * TODO: Validate against a real board */ enum TN32_Opcode { - TN32Op_Unknown20 = 0x20, // where did this come from?? TN32Op_GetFWVersion = 0x30, TN32Op_GetHWVersion = 0x32, @@ -23,34 +22,35 @@ enum TN32_Opcode { TN32Op_RadioOff = 0x41, TN32Op_Poll = 0x42, TN32Op_MifareSelectTag = 0x43, - TN32Op_Unknown44 = 0x44, // Present in code, not seen used + TN32Op_CardHalt = 0x44, TN32Op_SetKeyBana = 0x50, TN32Op_GetKeyBana = 0x51, TN32Op_ReadBlock = 0x52, - TN32Op_Unknown53 = 0x53, // Present in code, not seen used + TN32Op_WriteBlock = 0x53, TN32Op_SetKeyAime = 0x54, TN32Op_GetKeyAime = 0x55, - // Firmware update (I think) - TN32Op_Unknown60 = 0x60, // Present in code, not seen used - TN32Op_Unknown61 = 0x61, // Present in code, not seen used + // Firmware update + TN32Op_EnterUpdaterMode = 0x60, + TN32Op_SendHex = 0x61, TN32Op_Reset = 0x62, - TN32Op_Unknown63 = 0x63, - TN32Op_Unknown64 = 0x64, + TN32Op_SendBindata = 0x63, + TN32Op_BindataExec = 0x64, - TN32Op_Unknown70 = 0x70, // Present in code, not seen used + // Felica + TN32Op_FelicaPush = 0x70, TN32Op_FelicaEncap = 0x71, // No responses to either - LedUnknown80 = 0x80, - LedSetColour = 0x81, + Led_SetColour = 0x80, + Led_SetColourRGB = 0x81, - LedGetInfo = 0xf0, - LedF2 = 0xf2, - LedF3 = 0xf3, - LedF4 = 0xf4, - LedReset = 0xf5, + Led_GetInfo = 0xf0, + Led_FirmwareSum = 0xf2, + Led_SendHex = 0xf3, + Led_EnterBootMode = 0xf4, + Led_Reset = 0xf5, }; char* OpcodeNames[256]; @@ -282,26 +282,24 @@ DWORD WINAPI aime_bd_thread(com_device_t* dev) { // } - case TN32Op_Unknown44: + case TN32Op_CardHalt: case TN32Op_MifareSelectTag: comio_reply(dev, &req, COMIO_STATUS_OK, 0, NULL); break; - case TN32Op_Unknown60: - // req.length == 0; start firmware update? + case TN32Op_EnterUpdaterMode: comio_reply(dev, &req, COMIO_STATUS_OK, 0, NULL); break; - case TN32Op_Unknown61: + case TN32Op_SendHex: // null-terminated line of the firmware hex! comio_reply(dev, &req, COMIO_STATUS_OK, 0, NULL); log_info(plfAime, "Recv firmware: %s", extra); break; - case TN32Op_Unknown63: - // req.length == 0; start binary firmware update? + case TN32Op_SendBindata: fwNumBytes = 0; comio_reply(dev, &req, COMIO_STATUS_OK, 0, NULL); break; - case TN32Op_Unknown64: + case TN32Op_BindataExec: // Raw binary firmware data // [req.length == 256 -> wraps to 00] [256 bytes] if (req.length == 0) { @@ -335,15 +333,15 @@ DWORD WINAPI aime_bd_thread(com_device_t* dev) { } else if (req.dst == 0x08 || req.dst == 0x09) { // LED sub-boards switch (req.op) { - case LedReset: + case Led_Reset: comio_reply(dev, &req, COMIO_STATUS_OK, 0, NULL); break; - case LedGetInfo: + case Led_GetInfo: // TODO: I'm not sure what this actually means. // 838-15084 is probably a part number comio_reply(dev, &req, COMIO_STATUS_OK, 9, (BYTE*)"15084\xff\x10\x00\x12"); break; - case LedSetColour: + case Led_SetColourRGB: log_misc(plfAime, "Set LED: #%02x%02x%02x", extra[0], extra[1], extra[2]); printf( "\033[48;2;%d;%d;%dm " @@ -360,29 +358,29 @@ DWORD WINAPI aime_bd_thread(com_device_t* dev) { void install_aime_bd() { ZeroMemory(OpcodeNames, sizeof OpcodeNames); - OpcodeNames[TN32Op_Unknown20] = "Unknown20"; OpcodeNames[TN32Op_GetFWVersion] = "GetFWVersion"; OpcodeNames[TN32Op_GetHWVersion] = "GetHWVersion"; OpcodeNames[TN32Op_RadioOn] = "RadioOn"; OpcodeNames[TN32Op_RadioOff] = "RadioOff"; OpcodeNames[TN32Op_Poll] = "Poll"; OpcodeNames[TN32Op_MifareSelectTag] = "MifareSelectTag"; - OpcodeNames[TN32Op_Unknown44] = "Unknown44"; + OpcodeNames[TN32Op_CardHalt] = "CardHalt"; OpcodeNames[TN32Op_SetKeyBana] = "SetKeyBana"; OpcodeNames[TN32Op_GetKeyBana] = "GetKeyBana"; OpcodeNames[TN32Op_ReadBlock] = "ReadBlock"; - OpcodeNames[TN32Op_Unknown53] = "Unknown53"; + OpcodeNames[TN32Op_WriteBlock] = "WriteBlock"; OpcodeNames[TN32Op_SetKeyAime] = "SetKeyAime"; OpcodeNames[TN32Op_GetKeyAime] = "GetKeyAime"; - OpcodeNames[TN32Op_Unknown60] = "Unknown60"; - OpcodeNames[TN32Op_Unknown61] = "Unknown61"; + OpcodeNames[TN32Op_EnterUpdaterMode] = "EnterUpdaterMode"; + OpcodeNames[TN32Op_SendHex] = "SendHex"; OpcodeNames[TN32Op_Reset] = "Reset"; - OpcodeNames[TN32Op_Unknown70] = "Unknown70"; + OpcodeNames[TN32Op_FelicaPush] = "FelicaPush"; OpcodeNames[TN32Op_FelicaEncap] = "FelicaEncap"; - OpcodeNames[LedReset] = "LedReset"; - OpcodeNames[LedGetInfo] = "LedGetInfo"; - OpcodeNames[LedSetColour] = "LedSetColour"; + OpcodeNames[Led_Reset] = "Led_Reset"; + OpcodeNames[Led_GetInfo] = "Led_GetInfo"; + OpcodeNames[Led_SetColour] = "Led_SetColour"; + OpcodeNames[Led_SetColourRGB] = "Led_SetColourRGB"; register_device("aime_tn32msec", aime_bd_thread); } diff --git a/src/micetools/dll/devices/smb_at24c64an.c b/src/micetools/dll/devices/smb_at24c64an.c index 05b3b8a..f6fed78 100644 --- a/src/micetools/dll/devices/smb_at24c64an.c +++ b/src/micetools/dll/devices/smb_at24c64an.c @@ -49,6 +49,7 @@ void set_eeprom_static_config() { } void build_eeprom() { + return; log_info(plfEeprom, "Building default EEPROM file"); memset(EEPROM_DATA, 0xff, EEPROM_SIZE); diff --git a/src/micetools/dll/devices/smb_pca9535.c b/src/micetools/dll/devices/smb_pca9535.c index 0f62077..f41ce11 100644 --- a/src/micetools/dll/devices/smb_pca9535.c +++ b/src/micetools/dll/devices/smb_pca9535.c @@ -14,45 +14,6 @@ static uint8_t inv[2] = { 0x00, 0x00 }; */ static uint8_t config[2] = { 0xFF, 0xFF }; -BOOL smbus_PCA9535_write(ich9_cmd_t cmd, WORD code, BYTE dlen, BYTE* data) { - switch (cmd) { - case ICH9_CMD_BYTE_DATA: - switch (code) { - case PCA9535_REG_IN0: - return FALSE; - case PCA9535_REG_IN1: - return FALSE; - - case PCA9535_REG_OUT0: - out[0] = data[0]; - return TRUE; - case PCA9535_REG_OUT1: - out[1] = data[0]; - return TRUE; - - case PCA9535_REG_INV0: - inv[0] = data[0]; - return TRUE; - case PCA9535_REG_INV1: - inv[1] = data[0]; - return TRUE; - - case PCA9535_REG_CONF0: - config[0] = data[0]; - return TRUE; - case PCA9535_REG_CONF1: - config[1] = data[0]; - return TRUE; - default: - log_error(plfPCA9535, "Unknown write command: %02x", code); - return FALSE; - } - default: - log_error(plfPCA9535, "Unsupported write mode: %01x (%02x)", cmd, code); - return FALSE; - } -} - /** * Supported resolutions by amPlatform: * 640x480: VGA @@ -93,6 +54,45 @@ BOOL smbus_PCA9535_write(ich9_cmd_t cmd, WORD code, BYTE dlen, BYTE* data) { #define DIPSW_RES_1360x768 0b0'110'0000 #define DIPSW_RES_1920x1080 0b0'111'0000 +BOOL smbus_PCA9535_write(ich9_cmd_t cmd, WORD code, BYTE dlen, BYTE* data) { + switch (cmd) { + case ICH9_CMD_BYTE_DATA: + switch (code) { + case PCA9535_REG_IN0: + return FALSE; + case PCA9535_REG_IN1: + return FALSE; + + case PCA9535_REG_OUT0: + out[0] = data[0]; + return TRUE; + case PCA9535_REG_OUT1: + out[1] = data[0]; + return TRUE; + + case PCA9535_REG_INV0: + inv[0] = data[0]; + return TRUE; + case PCA9535_REG_INV1: + inv[1] = data[0]; + return TRUE; + + case PCA9535_REG_CONF0: + config[0] = data[0]; + return TRUE; + case PCA9535_REG_CONF1: + config[1] = data[0]; + return TRUE; + default: + log_error(plfPCA9535, "Unknown write command: %02x", code); + return FALSE; + } + default: + log_error(plfPCA9535, "Unsupported write mode: %01x (%02x)", cmd, code); + return FALSE; + } +} + BOOL smbus_PCA9535_read(ich9_cmd_t cmd, WORD code, BYTE dlen, BYTE* data) { switch (cmd) { case ICH9_CMD_BYTE_DATA: @@ -132,7 +132,7 @@ BOOL smbus_PCA9535_read(ich9_cmd_t cmd, WORD code, BYTE dlen, BYTE* data) { if (MiceConfig.keys.test && GetAsyncKeyState(MiceConfig.keys.test) < 0) { // if (!lastSystem) - dip &= ~0x04; + dip &= ~0x04; // lastSystem = true; } else lastSystem = false; @@ -148,7 +148,7 @@ BOOL smbus_PCA9535_read(ich9_cmd_t cmd, WORD code, BYTE dlen, BYTE* data) { case PCA9535_REG_OUT0: data[0] = out[0] & ~config[0]; - return FALSE; + return TRUE; case PCA9535_REG_OUT1: data[0] = out[1] & ~config[1]; return TRUE; diff --git a/src/micetools/dll/dllmain.c b/src/micetools/dll/dllmain.c index 12816b2..28f11c3 100644 --- a/src/micetools/dll/dllmain.c +++ b/src/micetools/dll/dllmain.c @@ -95,7 +95,6 @@ void apply_patches(HMODULE hModule) { void prebind_hooks() { hook_all(); - init_com_devices(); install_devices(); // TODO: Figure out why we're needing to call this manually (medium priority) if (wcscmp(exeName, L"ALLNetProc.exe") == 0) { @@ -116,6 +115,8 @@ void init_injection(HMODULE hModule) { setup_logging(); log_info(plfBoot, "Handover complete. Now executing within %ls", exeName); + init_com_devices(); + if (MiceConfig.mice.apply_patches) apply_patches(hModule); // Columba: Driver-level memory access, used to read the DMI tables diff --git a/src/micetools/dll/drivers/mxjvs.c b/src/micetools/dll/drivers/mxjvs.c index 6fc375d..13eec76 100644 --- a/src/micetools/dll/drivers/mxjvs.c +++ b/src/micetools/dll/drivers/mxjvs.c @@ -1,5 +1,6 @@ #include +#include "../comdevice.h" #include "../common.h" #include "../key_config.h" #include "jvs.h" @@ -659,6 +660,36 @@ void init_jvs_boards() { } } +DWORD __stdcall mxjvs_comdev_thread(com_device_t* com) { + BYTE inBuffer[512]; + BYTE outBuffer[512]; + DWORD bytesReturned; + + while (1) { + do { + comdev_read_blocking(com, inBuffer, 1); + } while (inBuffer[0] != 0xE0); + comdev_read_blocking(com, inBuffer + 1, 2); + BYTE nbytes = inBuffer[2]; + + BYTE* bufferPtr = inBuffer + 3; + if (nbytes == 0xD0) { + comdev_read_blocking(com, bufferPtr++, 1); + nbytes = *bufferPtr; + } + while (nbytes) { + comdev_read_blocking(com, bufferPtr++, 1); + if (bufferPtr[-1] == 0xD0) comdev_read_blocking(com, bufferPtr++, 1); + nbytes--; + } + + short packetSize = bufferPtr - inBuffer; + mxjvs_handle(inBuffer, packetSize, outBuffer, _countof(outBuffer), &bytesReturned); + com->modemStatus = !JVS_SENSE ? MS_DSR_ON : 0; + comdev_write(com, outBuffer, bytesReturned & 0xFFFF); + } +} + void setup_mxjvs() { init_jvs_boards(); @@ -679,6 +710,5 @@ void setup_mxjvs() { mxjvs->com_hook = jvscom; // TODO: Looks like some things might use JVS on COM4. We should setup a comdevice for this! - file_hook_t* jvscom_file = new_file_hook(jvscom->wName); - hook_file(jvscom_file); + attach_com_device(4, mxjvs_comdev_thread); } diff --git a/src/micetools/dll/drivers/mxsram.c b/src/micetools/dll/drivers/mxsram.c index 3f8f2e4..7123292 100644 --- a/src/micetools/dll/drivers/mxsram.c +++ b/src/micetools/dll/drivers/mxsram.c @@ -19,10 +19,11 @@ HANDLE SRAM_FILE_MAPPING = INVALID_HANDLE_VALUE; (block).m_Crc = amiCrc32RCalc(sizeof(block) - 4, (BYTE*)(&(block)) + 4, 0); \ } while (0) -int build_sram() { +void build_sram() { log_info(plfMxSram, "Building default SRAM file"); memset(SRAM_DATA, 0xff, SRAM_SIZE); + return; AM_SYSDATAwH_BACKUP Backup = { 0 }; fix_crc(Backup); @@ -44,7 +45,7 @@ int build_sram() { memcpy(SRAM_DATA + ADDR_ERROR_LOG, (unsigned char*)&ErrorLog, sizeof ErrorLog); memcpy(SRAM_DATA + ADDR_ERROR_LOG + ADDR_DUP, (unsigned char*)&ErrorLog, sizeof ErrorLog); - return 1; + return; } void ensure_valid_sram() { diff --git a/src/micetools/dll/drivers/mxsuperio.c b/src/micetools/dll/drivers/mxsuperio.c index d8c7711..487657a 100644 --- a/src/micetools/dll/drivers/mxsuperio.c +++ b/src/micetools/dll/drivers/mxsuperio.c @@ -71,7 +71,7 @@ BYTE hwmon_read(superio_packet* packet) { // TODO: No idea how to read any of these. Pulled from real system case W83791D_REG_TEMP1_0: - return 0x1a; + return 26; // Chasis temp case W83791D_RAM_VCOREA: return 0x76; case W83791D_RAM_VNIR0: @@ -118,8 +118,11 @@ BYTE hwmon_read(superio_packet* packet) { case W83791D_CRIT_TEMP_3: return w83791d_crit_t3; - case W83791D_VIN0: - return W83791D_ENTITY_CPU; + // TODO: Figure out what's going on with this discrepency! + case 0x50: + return 35; // CPU temp + // case W83791D_VIN0: + // return W83791D_ENTITY_CPU; case W83791D_VIN1: return W83791D_ENTITY_SYSTEM; diff --git a/src/micetools/dll/games.c b/src/micetools/dll/games.c index 45e8b0c..c0d024b 100644 --- a/src/micetools/dll/games.c +++ b/src/micetools/dll/games.c @@ -22,7 +22,6 @@ void mice_got_game_id(char game_id[4]) { MiceConfig.devices.com1 = ""; MiceConfig.devices.com2 = "aime_tn32msec"; MiceConfig.devices.com3 = "maitouch"; - MiceConfig.devices.com4 = ""; MiceConfig.devices.com5 = ""; MiceConfig.devices.com6 = "mailed"; MiceConfig.devices.com7 = ""; @@ -60,7 +59,6 @@ void mice_got_game_id(char game_id[4]) { MiceConfig.devices.com1 = ""; MiceConfig.devices.com2 = ""; MiceConfig.devices.com3 = ""; - MiceConfig.devices.com4 = ""; MiceConfig.devices.com5 = ""; MiceConfig.devices.com6 = ""; MiceConfig.devices.com7 = ""; diff --git a/src/micetools/dll/hooks/drive/disks.c b/src/micetools/dll/hooks/drive/disks.c index 9d6ed85..a2b11e4 100644 --- a/src/micetools/dll/hooks/drive/disks.c +++ b/src/micetools/dll/hooks/drive/disks.c @@ -128,6 +128,6 @@ physical_disk_t* PHYSICAL_DISKS[] = { &UPDATE_USB, &APM_HDD, - // &LOG_USB, - &ALPHA_DVD, + &LOG_USB, + // &ALPHA_DVD, }; diff --git a/src/micetools/dll/hooks/drive/drive.c b/src/micetools/dll/hooks/drive/drive.c index f05dff0..769b0d2 100644 --- a/src/micetools/dll/hooks/drive/drive.c +++ b/src/micetools/dll/hooks/drive/drive.c @@ -721,6 +721,9 @@ void hook_drives() { hook("Kernel32.dll", "SetVolumeLabelA", &FakeSetVolumeLabelA, NULL); hook("Kernel32.dll", "GetVolumeInformationA", &FakeGetVolumeInformationA, NULL); hook("Kernel32.dll", "QueryDosDeviceA", &FakeQueryDosDeviceA, NULL); + hook("Kernel32.dll", "QueryDosDeviceW", &FakeQueryDosDeviceW, NULL); + hook("Kernel32.dll", "DefineDosDeviceW", &FakeDefineDosDeviceW, NULL); + hook("Kernel32.dll", "SetVolumeMountPointW", &FakeSetVolumeMountPointW, NULL); hook("Kernel32.dll", "GetVolumeNameForVolumeMountPointA", &FakeGetVolumeNameForVolumeMountPointA, NULL); diff --git a/src/micetools/dll/hooks/drive/drive.h b/src/micetools/dll/hooks/drive/drive.h index 0e6518c..f98ac82 100644 --- a/src/micetools/dll/hooks/drive/drive.h +++ b/src/micetools/dll/hooks/drive/drive.h @@ -81,6 +81,9 @@ BOOL WINAPI FakeGetVolumePathNamesForVolumeNameA(LPCSTR lpszVolumeName, LPCH lps BOOL WINAPI FakeDeleteVolumeMountPointA(LPCSTR lpszVolumeMountPoint); BOOL WINAPI FakeSetVolumeMountPointA(LPCSTR lpszVolumeMountPoint, LPCSTR lpszVolumeName); DWORD WINAPI FakeQueryDosDeviceA(LPCSTR lpDeviceName, LPSTR lpTargetPath, DWORD ucchMax); +DWORD WINAPI FakeQueryDosDeviceW(LPCWSTR lpDeviceName, LPWSTR lpTargetPath, DWORD ucchMax); +BOOL WINAPI FakeDefineDosDeviceW(DWORD dwFlags, LPCWSTR lpDeviceName, LPCWSTR lpTargetPath); +BOOL WINAPI FakeSetVolumeMountPointW(LPCWSTR lpszVolumeMountPoint, LPCWSTR lpszVolumeName); MCIERROR WINAPI Fake_mciSendStringA(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback); UINT WINAPI FakeGetDriveTypeA(LPCSTR lpRootPathName); diff --git a/src/micetools/dll/hooks/drive/hooks.c b/src/micetools/dll/hooks/drive/hooks.c index 888280f..ee00045 100644 --- a/src/micetools/dll/hooks/drive/hooks.c +++ b/src/micetools/dll/hooks/drive/hooks.c @@ -200,6 +200,7 @@ BOOL WINAPI FakeSetVolumeMountPointA(LPCSTR lpszVolumeMountPoint, LPCSTR lpszVol } DWORD WINAPI FakeQueryDosDeviceA(LPCSTR lpDeviceName, LPSTR lpTargetPath, DWORD ucchMax) { + log_warning(plfDrive, "QueryDosDeviceA(%s, -, %d)", lpDeviceName, ucchMax); if (lpDeviceName != NULL) { disk_volume_t* volume = getVolumeByPath(lpDeviceName, VOL_MATCH_DOS_DEVICE); if (volume == NULL) { @@ -218,6 +219,48 @@ DWORD WINAPI FakeQueryDosDeviceA(LPCSTR lpDeviceName, LPSTR lpTargetPath, DWORD return 0; } +const wchar_t* DUMMY_USB_RM = L"STORAGE#RemovableMedia#0&75ad516&0&rm#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}"; +DWORD WINAPI FakeQueryDosDeviceW(LPCWSTR lpDeviceName, LPWSTR lpTargetPath, DWORD ucchMax) { + log_warning(plfDrive, "QueryDosDeviceW(%ls, -, %d)", lpDeviceName, ucchMax); + if (lpDeviceName != NULL) { + if (wcscmp(lpTargetPath, DUMMY_USB_RM) == 0) { + swprintf_s(lpTargetPath, ucchMax, L"\\Device\\Harddisk69"); + return ucchMax; + } + + char deviceName[MAX_PATH]; + WideCharToMultiByte(CP_ACP, 0, lpDeviceName, wcslen(lpDeviceName), deviceName, + _countof(deviceName), NULL, NULL); + + disk_volume_t* volume = getVolumeByPath(deviceName, VOL_MATCH_DOS_DEVICE); + if (volume == NULL) { + swprintf_s(lpTargetPath, ucchMax, L"\\Device\\Ttest"); + SetLastError(ERROR_FILE_NOT_FOUND); + return 0; + } + + size_t mountLen = wcslen(volume->m_DeviceName); + if (ucchMax < mountLen + 1) { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return 0; + } + swprintf_s(lpTargetPath, ucchMax, L"\\Device\\%ls", volume->m_DeviceName); + return ucchMax; + } else { + // TODO: This, properly!! + ZeroMemory(lpTargetPath, ucchMax); + swprintf_s(lpTargetPath, ucchMax, DUMMY_USB_RM); + } + return 0; +} +// TODO: +BOOL WINAPI FakeDefineDosDeviceW(DWORD dwFlags, LPCWSTR lpDeviceName, LPCWSTR lpTargetPath) { + return TRUE; +} +BOOL WINAPI FakeSetVolumeMountPointW(LPCWSTR lpszVolumeMountPoint, LPCWSTR lpszVolumeName) { + return TRUE; +} + MCIERROR WINAPI Fake_mciSendStringA(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback) { if (strcmp(lpszCommand, "open cdaudio") == 0) { diff --git a/src/micetools/dll/hooks/drive/physicalDrive.c b/src/micetools/dll/hooks/drive/physicalDrive.c index fa1bd9c..e6ed9c2 100644 --- a/src/micetools/dll/hooks/drive/physicalDrive.c +++ b/src/micetools/dll/hooks/drive/physicalDrive.c @@ -35,7 +35,12 @@ BOOL WINAPI pd_DeviceIoControl(file_context_t* ctx, DWORD dwIoControlCode, LPVOI return TRUE; } - if (command != 0xC1) { + /** + * C1: Seen by mxkeychip + * C2: Seen by factorytest + */ + + if (command != 0xC1 && command != 0xC2) { log_error(plfDrive, "PD0:Unimplemented ATA command: %02x", command); return FALSE; @@ -60,9 +65,11 @@ BOOL WINAPI pd_DeviceIoControl(file_context_t* ctx, DWORD dwIoControlCode, LPVOI // It looks like mxkeychip never actually checks the response buffer, // as long as the ioctl succeeds! Saves us a lot of work here! + + // TODO: factorytest.exe _does_ check this! return TRUE; } - log_error(plfDrive, "Unimeplemented ATA C1 command: %02x", data); + log_error(plfDrive, "Unimeplemented ATA %02X command: %02x", command, data); return FALSE; case IOCTL_DISK_GET_LENGTH_INFO: PGET_LENGTH_INFORMATION pLi = (PGET_LENGTH_INFORMATION)lpOutBuffer; diff --git a/src/micetools/dll/hooks/files.c b/src/micetools/dll/hooks/files.c index 0b01f3e..13d1ef8 100644 --- a/src/micetools/dll/hooks/files.c +++ b/src/micetools/dll/hooks/files.c @@ -358,9 +358,11 @@ DWORD WINAPI FakeWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesT log_error(plfHooks, "WriteFile(%ls) unimplemented", file_hook->filename); return FALSE; } - BOOL ret = file_hook->WriteFile(&(pHData->ctx), lpBuffer, nNumberOfBytesToWrite, - lpNumberOfBytesWritten, lpOverlapped); - if (ret) pHData->ctx.m_Pointer.QuadPart += *lpNumberOfBytesWritten; + DWORD wrote; + BOOL ret = + file_hook->WriteFile(&(pHData->ctx), lpBuffer, nNumberOfBytesToWrite, &wrote, lpOverlapped); + if (ret) pHData->ctx.m_Pointer.QuadPart += wrote; + if (lpNumberOfBytesWritten) *lpNumberOfBytesWritten = wrote; return ret; } @@ -384,9 +386,11 @@ BOOL WINAPI FakeReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRe log_error(plfHooks, "ReadFile(%ls) unimplemented", file_hook->filename); return FALSE; } - BOOL ret = file_hook->ReadFile(&(pHData->ctx), lpBuffer, nNumberOfBytesToRead, - lpNumberOfBytesRead, lpOverlapped); - if (ret) pHData->ctx.m_Pointer.QuadPart += *lpNumberOfBytesRead; + DWORD read; + BOOL ret = + file_hook->ReadFile(&(pHData->ctx), lpBuffer, nNumberOfBytesToRead, &read, lpOverlapped); + if (ret) pHData->ctx.m_Pointer.QuadPart += read; + if (lpNumberOfBytesRead) *lpNumberOfBytesRead = read; return ret; } @@ -420,6 +424,15 @@ DWORD WINAPI FakeGetFileAttributesW(LPCWSTR lpFileName) { } return TrueGetFileAttributesW(lpFileName); } +HANDLE WINAPI FakeFindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData) { + printf("FakeFindFirstFileA(%s)\n", lpFileName); + LPCSTR redirected; + if (redirect_path(lpFileName, &redirected)) { + printf("->FakeFindFirstFileA(%s)\n", redirected); + return TrueFindFirstFileA(redirected, lpFindFileData); + } + return TrueFindFirstFileA(lpFileName, lpFindFileData); +} void hook_io() { hook("Kernel32.dll", "DeviceIoControl", FakeDeviceIoControl, (void**)&TrueDeviceIoControl); @@ -439,6 +452,8 @@ void hook_io() { hook("Kernel32.dll", "DeleteFileA", FakeDeleteFileA, (void**)&TrueDeleteFileA); hook("Kernel32.dll", "DeleteFileW", FakeDeleteFileW, (void**)&TrueDeleteFileW); + hook("Kernel32.dll", "FindFirstFileA", FakeFindFirstFileA, (void**)&TrueFindFirstFileA); + hook("Kernel32.dll", "GetFileAttributesA", FakeGetFileAttributesA, (void**)&TrueGetFileAttributesA); hook("Kernel32.dll", "GetFileAttributesW", FakeGetFileAttributesW, diff --git a/src/micetools/dll/hooks/files.h b/src/micetools/dll/hooks/files.h index ced9d87..c85694e 100644 --- a/src/micetools/dll/hooks/files.h +++ b/src/micetools/dll/hooks/files.h @@ -38,6 +38,7 @@ _MICE_FILES BOOL(WINAPI* TruePathFileExistsA)(LPCSTR pszPath); _MICE_FILES BOOL(WINAPI* TruePathFileExistsW)(LPCWSTR pszPath); _MICE_FILES BOOL(WINAPI* TrueDeleteFileA)(LPCSTR lpFileName); _MICE_FILES BOOL(WINAPI* TrueDeleteFileW)(LPCWSTR lpFileName); +_MICE_FILES HANDLE(WINAPI* TrueFindFirstFileA)(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData); _MICE_FILES DWORD(WINAPI* TrueGetFileAttributesA)(LPCSTR lpFileName); _MICE_FILES DWORD(WINAPI* TrueGetFileAttributesW)(LPCWSTR lpFileName); diff --git a/src/micetools/dll/hooks/gui.c b/src/micetools/dll/hooks/gui.c index 210a487..4f47097 100644 --- a/src/micetools/dll/hooks/gui.c +++ b/src/micetools/dll/hooks/gui.c @@ -192,7 +192,7 @@ void SetupWindowPosition(LPRECT lpRect, DWORD dwStyle) { lpRect->top = y; lpRect->bottom = y + h; - AdjustWindowRect(lpRect, dwStyle, FALSE); + // AdjustWindowRect(lpRect, dwStyle, FALSE); } HWND WINAPI FakeCreateWindowExA(DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, @@ -372,6 +372,7 @@ void hook_gui() { hook("User32.dll", "ChangeDisplaySettingsExW", FakeChangeDisplaySettingsExW, (void**)&TrueChangeDisplaySettingsExW); hook("D3d9.dll", "Direct3DCreate9", FakeDirect3DCreate9, (void**)&TrueDirect3DCreate9); + if (PathFileExistsA("FREEGLUT.DLL")) { // Hooked as a way to identify use of GLUT hook("FREEGLUT.DLL", "glutInitDisplayMode", Fake_glutInitDisplayMode, diff --git a/src/micetools/lib/dmi/dmi.c b/src/micetools/lib/dmi/dmi.c index 829edd0..de1e10b 100644 --- a/src/micetools/lib/dmi/dmi.c +++ b/src/micetools/lib/dmi/dmi.c @@ -80,6 +80,7 @@ static void dmi_append_with_strings(void* data, WORD size, int num_strings, ...) void dmi_build_default() { dmi_init(); + // BIOS version dmi_append_with_strings(&default_dmi_bios, sizeof default_dmi_bios, 3, "American Megatrends Inc.", "080015 ", "07/28/2011"); diff --git a/src/micetools/lib/mice/config.def b/src/micetools/lib/mice/config.def index 6eda079..9aeae76 100644 --- a/src/micetools/lib/mice/config.def +++ b/src/micetools/lib/mice/config.def @@ -96,12 +96,11 @@ CFG_int(keys, board_count, 1, "") CFG_str(keys, keys, 0, "") ENDSECTION(keys) -SECTION(devices, "Register attached hardware devices") -CFG_bool(devices, do_auto, true, "When true, if the running game is identified, the following 8 values are overwritten") +SECTION(devices, "Register attached hardware devices. COM4 is reserved for JVS.") +CFG_bool(devices, do_auto, true, "When true, if the running game is identified, the following 7 values are overwritten.") CFG_str(devices, com1, "", "") CFG_str(devices, com2, "", "") CFG_str(devices, com3, "", "") -CFG_str(devices, com4, "", "") CFG_str(devices, com5, "", "") CFG_str(devices, com6, "", "") CFG_str(devices, com7, "", "")