Move chusan init out of dllmain

This commit is contained in:
akiroz 2022-03-29 09:22:31 +08:00
parent b0c1480673
commit 836ee62c93
No known key found for this signature in database
GPG Key ID: 8A5957C4A2F68ACC

View File

@ -82,6 +82,27 @@ pub fn main() !void {
fn tasoller_init() !void {
if(cfg.?.chusan == 1) {
std.log.info("[chuniio] Initializing mode: chusan", .{});
const szName = W("Global\\ChuniioTasoller");
const hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, null, PAGE_READWRITE, 0, 0x24, szName) orelse {
std.log.err("[chuniio] CreateFileMapping: {any}", .{GetLastError()});
return error.AccessError;
};
const pBuf = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0x24) orelse {
std.log.err("[chuniio] MapViewOfFile: {any}", .{GetLastError()});
return error.AccessError;
};
usb_in = @ptrCast([*]u8, pBuf)[0..0x24];
if(builtin.cpu.arch == .x86_64) return;
} else {
std.log.info("[chuniio] Initializing mode: chuni", .{});
usb_in = gpa.allocator().alloc(u8, 0x24) catch |err| {
std.log.err("[chuniio] alloc: {any}", .{err});
return error.AccessError;
};
}
const hDevInfo = SetupDiGetClassDevsW(&GUID_DEVINTERFACE_USB_DEVICE, null, null, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if(hDevInfo == INVALID_HANDLE_VALUE) {
std.log.err("[chuniio] SetupDiGetClassDevs: {any}", .{GetLastError()});
@ -194,43 +215,13 @@ pub export fn DllMain(hDllHandle: HANDLE, dwReason: DWORD, lpreserved: LPVOID) B
.coin_key = @intCast(i32, GetPrivateProfileIntA("io3", "coin", 0x33, cfg_file)),
.chusan = @intCast(i32, GetPrivateProfileIntA("chuniio", "chusan", 0, cfg_file)),
};
// Chuni mode must not init at DllMain
if(cfg.?.chusan == 0) return win32.zig.TRUE;
std.log.info("[chuniio] Initializing mode: chusan", .{});
const szName = W("Global\\ChuniioTasoller");
const hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, null, PAGE_READWRITE, 0, 0x24, szName) orelse {
std.log.err("[chuniio] CreateFileMapping: {any}", .{GetLastError()});
return win32.zig.FALSE;
};
const pBuf = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0x24) orelse {
std.log.err("[chuniio] MapViewOfFile: {any}", .{GetLastError()});
return win32.zig.FALSE;
};
usb_in = @ptrCast([*]u8, pBuf)[0..0x24];
if(builtin.cpu.arch == .i386) {
tasoller_init() catch {
return win32.zig.FALSE;
};
}
return win32.zig.TRUE;
}
export fn chuni_io_jvs_init() HRESULT {
if(cfg.?.chusan == 1) return S_OK;
std.log.info("[chuniio] Initializing mode: chuni", .{});
usb_in = gpa.allocator().alloc(u8, 0x24) catch |err| {
std.log.err("[chuniio] alloc: {any}", .{err});
return E_FAIL;
};
tasoller_init() catch {
return E_FAIL;
};
if(cfg.?.chusan == 1 and builtin.cpu.arch != .x86_64) return S_OK;
tasoller_init() catch return E_FAIL;
return S_OK;
}
@ -255,6 +246,8 @@ export fn chuni_io_jvs_read_coin_counter(total: ?*c_ushort) void {
}
export fn chuni_io_slider_init() HRESULT {
if(cfg.?.chusan == 0) return S_OK;
tasoller_init() catch return E_FAIL;
return S_OK;
}