Add support for DDR X2 US

This commit is contained in:
QCDLZCLW3K
2022-05-30 02:00:49 +00:00
committed by 33c17f40
parent c69e26ba90
commit 885de752f0
8 changed files with 201 additions and 70 deletions
+17
View File
@@ -586,6 +586,23 @@ $(zipdir)/ddr-11.zip: \
$(V)echo ... $@ $(V)echo ... $@
$(V)zip -j $@ $^ $(V)zip -j $@ $^
$(zipdir)/ddr-12-us.zip: \
build/bin/indep-32/inject.exe \
build/bin/avs2_1002-32/ddrhook1.dll \
build/bin/avs2_1002-32/unicorntail.dll \
build/bin/indep-32/config.exe \
build/bin/indep-32/ddrio.dll \
build/bin/indep-32/ddrio-mm.dll \
build/bin/indep-32/ddrio-smx.dll \
build/bin/indep-32/eamio.dll \
build/bin/indep-32/geninput.dll \
dist/ddr/config.bat \
dist/ddr/gamestart-12-us.bat \
dist/ddr/ddr-12-us.conf \
| $(zipdir)/
$(V)echo ... $@
$(V)zip -j $@ $^
$(zipdir)/ddr-12.zip: \ $(zipdir)/ddr-12.zip: \
build/bin/avs2_1002-32/launcher.exe \ build/bin/avs2_1002-32/launcher.exe \
build/bin/avs2_1002-32/ddrhook2.dll \ build/bin/avs2_1002-32/ddrhook2.dll \
+32
View File
@@ -0,0 +1,32 @@
# URL (e.g. http://my.eamuse.server:80/whatever) or IPV4 (e.g. 127.0.0.1:80) of the target eamuse server. The port is optional but defaults to 80.
eamuse.server=localhost:80
# PCBID
eamuse.pcbid=0101020304050607086F
# EAMID
eamuse.eamid=0101020304050607086F
# Mcode of the game to run.
security.mcode=GQJDXUAA
# Emulate P3IO COM4 and its downstream devices. Uses the Windows COM4 port when disabled.
ddrhook1.use_com4_emu=true
# SD cabinet mode
ddrhook1.standard_def=false
# Use 15 kHz monitor mode
ddrhook1.use_15khz=false
# Enable USB memory data emulation
ddrhook1.usbmem_enabled=false
# Specify path for P1 USB memory data
ddrhook1.usbmem_path_p1=usbmem_p1
# Specify path for P2 USB memory data
ddrhook1.usbmem_path_p2=usbmem_p2
# Run the game windowed
gfx.windowed=false
+2 -2
View File
@@ -2,10 +2,10 @@
cd /d %~dp0 cd /d %~dp0
if not exist conf mkdir conf
if not exist conf\nvram mkdir conf\nvram if not exist conf\nvram mkdir conf\nvram
if not exist conf\raw mkdir conf\raw if not exist conf\raw mkdir conf\raw
regsvr32 /s xactengine2_10.dll regsvr32 /s com\CLVsd.ax
regsvr32 /s com\xactengine2_10.dll
inject ddrhook1.dll DDR.exe --config ddr-11-us.conf %* inject ddrhook1.dll DDR.exe --config ddr-11-us.conf %*
+2 -2
View File
@@ -2,10 +2,10 @@
cd /d %~dp0 cd /d %~dp0
if not exist conf mkdir conf
if not exist conf\nvram mkdir conf\nvram if not exist conf\nvram mkdir conf\nvram
if not exist conf\raw mkdir conf\raw if not exist conf\raw mkdir conf\raw
regsvr32 /s xactengine2_10.dll regsvr32 /s com\CLVsd.ax
regsvr32 /s com\xactengine2_10.dll
inject ddrhook1.dll DDR.exe --config ddr-11.conf %* inject ddrhook1.dll DDR.exe --config ddr-11.conf %*
+11
View File
@@ -0,0 +1,11 @@
@echo off
cd /d %~dp0
if not exist conf\nvram mkdir conf\nvram
if not exist conf\raw mkdir conf\raw
regsvr32 /s com\CLVsd.ax
regsvr32 /s com\xactengine2_10.dll
inject ddrhook1.dll DDR.exe --config ddr-12-us.conf %*
+3
View File
@@ -79,6 +79,8 @@ static void my_avs_boot(
{ {
log_info("Called my_avs_boot"); log_info("Called my_avs_boot");
#if AVS_VERSION < 1002
// Only need to add these hooks for DDR X
char nvram_path[MAX_PATH] = {0}; char nvram_path[MAX_PATH] = {0};
char raw_path[MAX_PATH] = {0}; char raw_path[MAX_PATH] = {0};
@@ -106,6 +108,7 @@ static void my_avs_boot(
config, "/fs/nvram/device", nvram_path); config, "/fs/nvram/device", nvram_path);
avs_boot_replace_property_str( avs_boot_replace_property_str(
config, "/fs/raw/device", raw_path); config, "/fs/raw/device", raw_path);
#endif
real_avs_boot( real_avs_boot(
config, config,
+6
View File
@@ -112,6 +112,8 @@ my_GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize)
log_info(DDRHOOK1_INFO_HEADER); log_info(DDRHOOK1_INFO_HEADER);
log_info("Initializing ddrhook1..."); log_info("Initializing ddrhook1...");
ddrhook1_filesystem_hook_init();
ddrhook1_avs_boot_init(); ddrhook1_avs_boot_init();
ddrhook1_avs_boot_set_eamuse_addr(&config_eamuse.server); ddrhook1_avs_boot_set_eamuse_addr(&config_eamuse.server);
@@ -135,7 +137,11 @@ my_GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize)
&config_security.mcode, &config_security.mcode,
&config_eamuse.pcbid, &config_eamuse.pcbid,
&config_eamuse.eamid, &config_eamuse.eamid,
#if AVS_VERSION >= 1002
&security_rp_sign_key_black_ddrx2,
#else
&security_rp_sign_key_black_ddrx, &security_rp_sign_key_black_ddrx,
#endif
&security_rp_sign_key_white_eamuse); &security_rp_sign_key_white_eamuse);
extio_init(); extio_init();
usbmem_init(config_ddrhook1.usbmem_path_p1, config_ddrhook1.usbmem_path_p2, usbmem_init(config_ddrhook1.usbmem_path_p1, config_ddrhook1.usbmem_path_p2,
+128 -66
View File
@@ -11,42 +11,43 @@
#include "util/defs.h" #include "util/defs.h"
#include "util/log.h" #include "util/log.h"
#include "util/mem.h" #include "util/mem.h"
#include "util/str.h"
static BOOL STDCALL my_SetCurrentDirectoryA(LPCTSTR lpPathName); static BOOL STDCALL my_SetCurrentDirectoryA(LPCSTR lpPathName);
static HANDLE STDCALL my_FindFirstFileA( static HANDLE STDCALL my_FindFirstFileW(
LPCSTR lpFileName, LPCWSTR lpFileName,
LPWIN32_FIND_DATAA lpFindFileData); LPWIN32_FIND_DATAA lpFindFileData);
static HANDLE STDCALL my_CreateFileA( static HANDLE STDCALL my_CreateFileW(
LPCSTR lpFileName, LPCWSTR lpFileName,
DWORD dwDesiredAccess, DWORD dwDesiredAccess,
DWORD dwShareMode, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile); HANDLE hTemplateFile);
static BOOL WINAPI my_CreateDirectoryA( static BOOL WINAPI my_CreateDirectoryW(
LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
static BOOL(STDCALL *real_SetCurrentDirectoryA)(LPCTSTR lpPathName); static BOOL(STDCALL *real_SetCurrentDirectoryA)(LPCSTR lpPathName);
static HANDLE(STDCALL *real_FindFirstFileA)( static HANDLE(STDCALL *real_FindFirstFileW)(
LPCSTR lpFileName, LPCWSTR lpFileName,
LPWIN32_FIND_DATAA lpFindFileData); LPWIN32_FIND_DATAA lpFindFileData);
static HANDLE(STDCALL *real_CreateFileA)( static HANDLE(STDCALL *real_CreateFileW)(
LPCSTR lpFileName, LPCWSTR lpFileName,
DWORD dwDesiredAccess, DWORD dwDesiredAccess,
DWORD dwShareMode, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile); HANDLE hTemplateFile);
static BOOL(WINAPI *real_CreateDirectoryA)( static BOOL(WINAPI *real_CreateDirectoryW)(
LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
static const struct hook_symbol filesystem_hook_syms[] = { static const struct hook_symbol filesystem_hook_syms[] = {
{ {
.name = "CreateFileA", .name = "CreateFileW",
.patch = my_CreateFileA, .patch = my_CreateFileW,
.link = (void **) &real_CreateFileA .link = (void **) &real_CreateFileW
}, },
{ {
.name = "SetCurrentDirectoryA", .name = "SetCurrentDirectoryA",
@@ -54,14 +55,14 @@ static const struct hook_symbol filesystem_hook_syms[] = {
.link = (void **) &real_SetCurrentDirectoryA, .link = (void **) &real_SetCurrentDirectoryA,
}, },
{ {
.name = "FindFirstFileA", .name = "FindFirstFileW",
.patch = my_FindFirstFileA, .patch = my_FindFirstFileW,
.link = (void **) &real_FindFirstFileA .link = (void **) &real_FindFirstFileW
}, },
{ {
.name = "CreateDirectoryA", .name = "CreateDirectoryW",
.patch = my_CreateDirectoryA, .patch = my_CreateDirectoryW,
.link = (void **) &real_CreateDirectoryA .link = (void **) &real_CreateDirectoryW
}, },
}; };
@@ -108,7 +109,7 @@ void ddrhook1_get_launcher_path_parts(char **output_path, char **output_folderna
if (len < 0) if (len < 0)
len = 0; len = 0;
*output_foldername = (char*)xmalloc(len + 1); *output_foldername = (char*)xmalloc(len + 2);
memset(*output_foldername, 0, len + 1); memset(*output_foldername, 0, len + 1);
strncpy(*output_foldername, launcher_path + idx_folder, len); strncpy(*output_foldername, launcher_path + idx_folder, len);
} }
@@ -125,46 +126,98 @@ void ddrhook1_get_launcher_path_parts(char **output_path, char **output_folderna
} }
} }
static char *ddrhook1_filesystem_get_path(LPCTSTR path) static wchar_t *ddrhook1_filesystem_get_path(LPCWSTR path)
{ {
char *new_path = NULL; wchar_t *new_path = NULL;
// Hardcoded paths: D:/HDX, E:/conf, E:/conf/nvram, E:/conf/raw, F:/update // char *tmp;
if (stricmp(path, "D:/HDX") == 0 // wstr_narrow(path, &tmp);
|| stricmp(path, "D:\\HDX") == 0) { // log_misc("path: %s", tmp);
ddrhook1_get_launcher_path_parts(&new_path, NULL); // free(tmp);
} else if (strnicmp(path, "E:/conf", 7) == 0
|| strnicmp(path, "E:\\conf", 7) == 0) {
char *launcher_folder;
char *sub_path;
ddrhook1_get_launcher_path_parts(NULL, &launcher_folder); // Deal with hardcoded paths: D:/HDX, E:/conf, E:/conf/nvram, E:/conf/raw, F:/update, ...
sub_path = strstr(path, "conf"); if (wstr_insensitive_eq(path, L"D:/HDX") || wstr_insensitive_eq(path, L"D:\\HDX")
|| wstr_insensitive_eq(path, L"D:/JDX") || wstr_insensitive_eq(path, L"D:\\JDX")) {
char *_new_path;
ddrhook1_get_launcher_path_parts(&_new_path, NULL);
if (sub_path && launcher_folder) { if (_new_path) {
new_path = (char*)xmalloc(MAX_PATH); new_path = str_widen(_new_path);
sprintf(new_path, "%s\\%s", launcher_folder, sub_path); return new_path;
} }
} else if (stricmp(path, "F:/update") == 0 } else if (wcslen(path) >= 7 && (wcsnicmp(path, L"E:/conf", 7) == 0
|| stricmp(path, "F:\\update") == 0) { || wcsnicmp(path, L"E:\\conf", 7) == 0)) {
char *launcher_folder; char *launcher_folder;
char *sub_path; wchar_t *sub_path;
ddrhook1_get_launcher_path_parts(NULL, &launcher_folder); ddrhook1_get_launcher_path_parts(NULL, &launcher_folder);
sub_path = strstr(path, "update"); sub_path = wcsstr(path, L"conf");
if (sub_path && launcher_folder) { if (sub_path && launcher_folder) {
new_path = (char*)xmalloc(MAX_PATH); wchar_t *launcher_folder_w = str_widen(launcher_folder);
sprintf(new_path, "%s\\%s", launcher_folder, sub_path); new_path = (wchar_t*)xmalloc(MAX_PATH * sizeof(wchar_t));
swprintf(new_path, MAX_PATH, L"%s\\%s", launcher_folder_w, sub_path);
return new_path;
}
} else if (wstr_insensitive_eq(path, L"F:/update")
|| wstr_insensitive_eq(path, L"F:\\update")
|| wstr_insensitive_eq(path, L".\\F:/update")
|| wstr_insensitive_eq(path, L".\\F:\\update")) {
char *launcher_folder;
wchar_t *sub_path;
ddrhook1_get_launcher_path_parts(NULL, &launcher_folder);
sub_path = wcsstr(path, L"update");
if (sub_path && launcher_folder) {
wchar_t *launcher_folder_w = str_widen(launcher_folder);
new_path = (wchar_t*)xmalloc(MAX_PATH * sizeof(wchar_t));
swprintf(new_path, MAX_PATH, L"%s\\%s", launcher_folder_w, sub_path);
return new_path;
}
} else if (wcslen(path) >= 24 && (wcsnicmp(path, L"D:/JDX/JDX-001/contents/", 24) == 0
|| wcsnicmp(path, L"D:\\JDX\\JDX-001\\contents\\", 24) == 0)) {
char *content_path;
ddrhook1_get_launcher_path_parts(&content_path, NULL);
if (content_path) {
wchar_t *content_path_w = str_widen(content_path);
new_path = (wchar_t*)xmalloc(MAX_PATH * sizeof(wchar_t));
swprintf(new_path, MAX_PATH, L"%s\\%s", content_path_w, path + 24);
return new_path;
}
} else if (wcslen(path) >= 7 && (wcsnicmp(path, L"D:/HDX/", 7) == 0 || wcsnicmp(path, L"D:\\HDX\\", 7) == 0
|| wcsnicmp(path, L"D:/JDX/", 7) == 0 || wcsnicmp(path, L"D:\\JDX\\", 7) == 0)) {
char *content_path;
ddrhook1_get_launcher_path_parts(&content_path, NULL);
if (content_path) {
wchar_t *content_path_w = str_widen(content_path);
new_path = (wchar_t*)xmalloc(MAX_PATH * sizeof(wchar_t));
swprintf(new_path, MAX_PATH, L"%s\\%s", content_path_w, path + 7);
return new_path;
} }
} }
return new_path; return NULL;
} }
static BOOL STDCALL my_SetCurrentDirectoryA(LPCTSTR lpPathName) static BOOL STDCALL my_SetCurrentDirectoryA(LPCSTR lpPathName)
{ {
char *new_path = ddrhook1_filesystem_get_path(lpPathName); wchar_t *_lpPathName = str_widen(lpPathName);
wchar_t *_new_path = ddrhook1_filesystem_get_path(_lpPathName);
char *new_path = NULL;
if (_lpPathName != NULL) {
free(_lpPathName);
}
if (_new_path != NULL) {
wstr_narrow(_new_path, &new_path);
free(_new_path);
}
if (new_path != NULL) { if (new_path != NULL) {
bool r = real_SetCurrentDirectoryA(new_path); bool r = real_SetCurrentDirectoryA(new_path);
@@ -176,30 +229,33 @@ static BOOL STDCALL my_SetCurrentDirectoryA(LPCTSTR lpPathName)
return real_SetCurrentDirectoryA(lpPathName); return real_SetCurrentDirectoryA(lpPathName);
} }
static HANDLE STDCALL my_FindFirstFileA( static HANDLE STDCALL my_FindFirstFileW(
LPCSTR lpFileName, LPCWSTR lpFileName,
LPWIN32_FIND_DATAA lpFindFileData) LPWIN32_FIND_DATAA lpFindFileData)
{ {
char *new_path = ddrhook1_filesystem_get_path(lpFileName); wchar_t *new_path = ddrhook1_filesystem_get_path(lpFileName);
if (new_path) { if (new_path) {
HANDLE r = real_FindFirstFileA( HANDLE r = real_FindFirstFileW(
new_path, new_path,
lpFindFileData); lpFindFileData);
log_misc("FindFirstFileA remapped path: %s -> %s", lpFileName, new_path); char *tmp;
wstr_narrow(new_path, &tmp);
log_misc("FindFirstFileW remapped path: %s", tmp);
free(tmp);
free(new_path); free(new_path);
return r; return r;
} }
return real_FindFirstFileA( return real_FindFirstFileW(
lpFileName, lpFileName,
lpFindFileData); lpFindFileData);
} }
static HANDLE STDCALL my_CreateFileA( static HANDLE STDCALL my_CreateFileW(
LPCSTR lpFileName, LPCWSTR lpFileName,
DWORD dwDesiredAccess, DWORD dwDesiredAccess,
DWORD dwShareMode, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
@@ -207,10 +263,10 @@ static HANDLE STDCALL my_CreateFileA(
DWORD dwFlagsAndAttributes, DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile) HANDLE hTemplateFile)
{ {
char *new_path = ddrhook1_filesystem_get_path(lpFileName); wchar_t *new_path = ddrhook1_filesystem_get_path(lpFileName);
if (new_path) { if (new_path) {
HANDLE r = real_CreateFileA( HANDLE r = real_CreateFileW(
new_path, new_path,
dwDesiredAccess, dwDesiredAccess,
dwShareMode, dwShareMode,
@@ -219,13 +275,16 @@ static HANDLE STDCALL my_CreateFileA(
dwFlagsAndAttributes, dwFlagsAndAttributes,
hTemplateFile); hTemplateFile);
log_misc("CreateFileA remapped path %s -> %s", lpFileName, new_path); // char *tmp;
// wstr_narrow(new_path, &tmp);
// log_misc("CreateFileW remapped path %s", tmp);
// free(tmp);
free(new_path); free(new_path);
return r; return r;
} }
return real_CreateFileA( return real_CreateFileW(
new_path ? new_path : lpFileName, new_path ? new_path : lpFileName,
dwDesiredAccess, dwDesiredAccess,
dwShareMode, dwShareMode,
@@ -235,21 +294,24 @@ static HANDLE STDCALL my_CreateFileA(
hTemplateFile); hTemplateFile);
} }
BOOL WINAPI my_CreateDirectoryA( BOOL WINAPI my_CreateDirectoryW(
LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
{ {
char *new_path = ddrhook1_filesystem_get_path(lpPathName); wchar_t *new_path = ddrhook1_filesystem_get_path(lpPathName);
if (new_path) { if (new_path) {
BOOL r = real_CreateDirectoryA(new_path, lpSecurityAttributes); BOOL r = real_CreateDirectoryW(new_path, lpSecurityAttributes);
log_misc("CreateDirectoryA remapped path %s -> %s", lpPathName, new_path); char *tmp;
wstr_narrow(new_path, &tmp);
log_misc("CreateDirectoryW remapped path %s", tmp);
free(tmp);
free(new_path); free(new_path);
return r; return r;
} }
return real_CreateDirectoryA(lpPathName, lpSecurityAttributes); return real_CreateDirectoryW(lpPathName, lpSecurityAttributes);
} }
void ddrhook1_filesystem_hook_init() void ddrhook1_filesystem_hook_init()