Somehow I managed to make a vtable correctly
This commit is contained in:
parent
ca5ff139ac
commit
164d6409db
46
Cargo.lock
generated
46
Cargo.lock
generated
|
@ -65,6 +65,16 @@ version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
|
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ctor"
|
||||||
|
version = "0.2.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f"
|
||||||
|
dependencies = [
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "env_filter"
|
name = "env_filter"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -106,6 +116,24 @@ version = "2.7.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
|
checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.81"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.36"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "1.10.4"
|
version = "1.10.4"
|
||||||
|
@ -135,6 +163,23 @@ version = "0.8.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
|
checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "2.0.60"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ident"
|
||||||
|
version = "1.0.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "utf8parse"
|
name = "utf8parse"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
|
@ -145,6 +190,7 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
|
||||||
name = "vapore-client"
|
name = "vapore-client"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"ctor",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"log",
|
"log",
|
||||||
]
|
]
|
||||||
|
|
|
@ -6,5 +6,6 @@ edition = "2021"
|
||||||
crate-type = ["cdylib"]
|
crate-type = ["cdylib"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.4"
|
ctor = "0.2"
|
||||||
env_logger = "0.11"
|
env_logger = "0.11"
|
||||||
|
log = "0.4"
|
||||||
|
|
23
client/src/abi/mod.rs
Normal file
23
client/src/abi/mod.rs
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
pub mod steam_client;
|
||||||
|
pub use steam_client::*;
|
||||||
|
pub mod steam_utils;
|
||||||
|
pub use steam_utils::*;
|
||||||
|
|
||||||
|
pub type SteamPipe = i32;
|
||||||
|
pub type SteamUser = i32;
|
||||||
|
|
||||||
|
#[repr(u32)]
|
||||||
|
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||||
|
pub enum AccountType {
|
||||||
|
Invalid = 0,
|
||||||
|
Individual = 1,
|
||||||
|
Multiseat = 2,
|
||||||
|
GameServer = 3,
|
||||||
|
AnonGameServer = 4,
|
||||||
|
Pending = 5,
|
||||||
|
ContentServer = 6,
|
||||||
|
Clan = 7,
|
||||||
|
Chat = 8,
|
||||||
|
ConsoleUser = 9,
|
||||||
|
AnonUser = 10,
|
||||||
|
}
|
276
client/src/abi/steam_client.rs
Normal file
276
client/src/abi/steam_client.rs
Normal file
|
@ -0,0 +1,276 @@
|
||||||
|
#![allow(non_snake_case)]
|
||||||
|
use std::ffi::{c_char, c_void, CStr};
|
||||||
|
use std::ptr;
|
||||||
|
|
||||||
|
use log::warn;
|
||||||
|
|
||||||
|
use super::{AccountType, ISteamUtils, SteamPipe, SteamUser};
|
||||||
|
|
||||||
|
/// The initial steam interface from CreateInterface
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct ISteamClient {
|
||||||
|
pub vtbl: ISteamClientVtbl,
|
||||||
|
pub version: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ISteamClient {
|
||||||
|
pub fn new(version: &CStr) -> Option<Box<Self>> {
|
||||||
|
let (vtbl, version) = match version.to_bytes() {
|
||||||
|
b"SteamClient017" => (
|
||||||
|
ISteamClientVtbl {
|
||||||
|
ver017: &STEAM_CLIENT_017_VTBL_DEFAULT as *const ISteamClient017Vtbl,
|
||||||
|
},
|
||||||
|
17,
|
||||||
|
),
|
||||||
|
b"SteamClient020" => (
|
||||||
|
ISteamClientVtbl {
|
||||||
|
ver020: &STEAM_CLIENT_020_VTBL_DEFAULT as *const ISteamClient020Vtbl,
|
||||||
|
},
|
||||||
|
20,
|
||||||
|
),
|
||||||
|
_ => return None,
|
||||||
|
};
|
||||||
|
|
||||||
|
Some(Box::new(Self { vtbl, version }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Vtable for any version of steam client
|
||||||
|
#[repr(C)]
|
||||||
|
pub union ISteamClientVtbl {
|
||||||
|
pub ver017: *const ISteamClient017Vtbl,
|
||||||
|
pub ver020: *const ISteamClient020Vtbl,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Vtable for SteamClient017
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct ISteamClient017Vtbl {
|
||||||
|
pub CreateSteamPipe: extern "C" fn(self_ptr: *mut ISteamClient) -> SteamPipe,
|
||||||
|
pub BReleaseSteamPipe: extern "C" fn(self_ptr: *mut ISteamClient, pipe: SteamPipe) -> bool,
|
||||||
|
pub ConnectToGlobalUser:
|
||||||
|
extern "C" fn(self_ptr: *mut ISteamClient, pipe: SteamPipe) -> SteamUser,
|
||||||
|
pub CreateLocalUser: extern "C" fn(
|
||||||
|
self_ptr: *mut ISteamClient,
|
||||||
|
pipe: *const SteamPipe,
|
||||||
|
account_type: AccountType,
|
||||||
|
) -> SteamUser,
|
||||||
|
pub ReleaseUser: *const c_void,
|
||||||
|
pub GetISteamUser: *const c_void,
|
||||||
|
pub GetISteamGameServer: *const c_void,
|
||||||
|
pub SetLocalIPBinding: *const c_void,
|
||||||
|
pub GetISteamFriends: *const c_void,
|
||||||
|
pub GetISteamUtils: extern "C" fn(
|
||||||
|
self_ptr: *mut ISteamClient,
|
||||||
|
pipe: SteamPipe,
|
||||||
|
version: *const c_char,
|
||||||
|
) -> *const ISteamUtils,
|
||||||
|
pub GetISteamMatchmaking: *const c_void,
|
||||||
|
pub GetISteamMatchmakingServers: *const c_void,
|
||||||
|
pub GetISteamGenericInterface: *const c_void,
|
||||||
|
pub GetISteamUserStats: *const c_void,
|
||||||
|
pub GetISteamGameServerStats: *const c_void,
|
||||||
|
pub GetISteamApps: *const c_void,
|
||||||
|
pub GetISteamNetworking: *const c_void,
|
||||||
|
pub GetISteamRemoteStorage: *const c_void,
|
||||||
|
pub GetISteamScreenshots: *const c_void,
|
||||||
|
pub RunFrame: *const c_void,
|
||||||
|
pub GetIPCCallCount: *const c_void,
|
||||||
|
pub SetWarningMessageHook: *const c_void,
|
||||||
|
pub BShutdownIfAllPipesClosed: *const c_void,
|
||||||
|
pub GetISteamHTTP: *const c_void,
|
||||||
|
pub DEPRECATED_GetISteamUnifiedMessages: *const c_void,
|
||||||
|
pub GetISteamController: *const c_void,
|
||||||
|
pub GetISteamUGC: *const c_void,
|
||||||
|
pub GetISteamAppList: *const c_void,
|
||||||
|
pub GetISteamMusic: *const c_void,
|
||||||
|
pub GetISteamMusicRemote: *const c_void,
|
||||||
|
pub GetISteamHTMLSurface: *const c_void,
|
||||||
|
pub DEPRECATED_Set_SteamAPI_CPostAPIResultInProcess: *const c_void,
|
||||||
|
pub DEPRECATED_Remove_SteamAPI_CPostAPIResultInProcess: *const c_void,
|
||||||
|
pub Set_SteamAPI_CCheckCallbackRegisteredInProcess: *const c_void,
|
||||||
|
pub GetISteamInventory: *const c_void,
|
||||||
|
pub GetISteamVideo: *const c_void,
|
||||||
|
pub GetISteamParentalSettings: *const c_void,
|
||||||
|
}
|
||||||
|
|
||||||
|
const STEAM_CLIENT_017_VTBL_DEFAULT: ISteamClient017Vtbl = ISteamClient017Vtbl {
|
||||||
|
CreateSteamPipe,
|
||||||
|
BReleaseSteamPipe,
|
||||||
|
ConnectToGlobalUser,
|
||||||
|
CreateLocalUser,
|
||||||
|
ReleaseUser: ptr::null(),
|
||||||
|
GetISteamUser: ptr::null(),
|
||||||
|
GetISteamGameServer: ptr::null(),
|
||||||
|
SetLocalIPBinding: ptr::null(),
|
||||||
|
GetISteamFriends: ptr::null(),
|
||||||
|
GetISteamUtils,
|
||||||
|
GetISteamMatchmaking: ptr::null(),
|
||||||
|
GetISteamMatchmakingServers: ptr::null(),
|
||||||
|
GetISteamGenericInterface: ptr::null(),
|
||||||
|
GetISteamUserStats: ptr::null(),
|
||||||
|
GetISteamGameServerStats: ptr::null(),
|
||||||
|
GetISteamApps: ptr::null(),
|
||||||
|
GetISteamNetworking: ptr::null(),
|
||||||
|
GetISteamRemoteStorage: ptr::null(),
|
||||||
|
GetISteamScreenshots: ptr::null(),
|
||||||
|
RunFrame: ptr::null(),
|
||||||
|
GetIPCCallCount: ptr::null(),
|
||||||
|
SetWarningMessageHook: ptr::null(),
|
||||||
|
BShutdownIfAllPipesClosed: ptr::null(),
|
||||||
|
GetISteamHTTP: ptr::null(),
|
||||||
|
DEPRECATED_GetISteamUnifiedMessages: ptr::null(),
|
||||||
|
GetISteamController: ptr::null(),
|
||||||
|
GetISteamUGC: ptr::null(),
|
||||||
|
GetISteamAppList: ptr::null(),
|
||||||
|
GetISteamMusic: ptr::null(),
|
||||||
|
GetISteamMusicRemote: ptr::null(),
|
||||||
|
GetISteamHTMLSurface: ptr::null(),
|
||||||
|
DEPRECATED_Set_SteamAPI_CPostAPIResultInProcess: ptr::null(),
|
||||||
|
DEPRECATED_Remove_SteamAPI_CPostAPIResultInProcess: ptr::null(),
|
||||||
|
Set_SteamAPI_CCheckCallbackRegisteredInProcess: ptr::null(),
|
||||||
|
GetISteamInventory: ptr::null(),
|
||||||
|
GetISteamVideo: ptr::null(),
|
||||||
|
GetISteamParentalSettings: ptr::null(),
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Vtable for SteamClient020
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct ISteamClient020Vtbl {
|
||||||
|
pub CreateSteamPipe: extern "C" fn(self_ptr: *mut ISteamClient) -> SteamPipe,
|
||||||
|
pub BReleaseSteamPipe: extern "C" fn(self_ptr: *mut ISteamClient, pipe: SteamPipe) -> bool,
|
||||||
|
pub ConnectToGlobalUser:
|
||||||
|
extern "C" fn(self_ptr: *mut ISteamClient, pipe: SteamPipe) -> SteamUser,
|
||||||
|
pub CreateLocalUser: extern "C" fn(
|
||||||
|
self_ptr: *mut ISteamClient,
|
||||||
|
pipe: *const SteamPipe,
|
||||||
|
account_type: AccountType,
|
||||||
|
) -> SteamUser,
|
||||||
|
pub ReleaseUser: *const c_void,
|
||||||
|
pub GetISteamUser: *const c_void,
|
||||||
|
pub GetISteamGameServer: *const c_void,
|
||||||
|
pub SetLocalIPBinding: *const c_void,
|
||||||
|
pub GetISteamFriends: *const c_void,
|
||||||
|
pub GetISteamUtils: extern "C" fn(
|
||||||
|
self_ptr: *mut ISteamClient,
|
||||||
|
pipe: SteamPipe,
|
||||||
|
version: *const c_char,
|
||||||
|
) -> *const ISteamUtils,
|
||||||
|
pub GetISteamMatchmaking: *const c_void,
|
||||||
|
pub GetISteamMatchmakingServers: *const c_void,
|
||||||
|
pub GetISteamGenericInterface: *const c_void,
|
||||||
|
pub GetISteamUserStats: *const c_void,
|
||||||
|
pub GetISteamGameServerStats: *const c_void,
|
||||||
|
pub GetISteamApps: *const c_void,
|
||||||
|
pub GetISteamNetworking: *const c_void,
|
||||||
|
pub GetISteamRemoteStorage: *const c_void,
|
||||||
|
pub GetISteamScreenshots: *const c_void,
|
||||||
|
pub GetISteamGameSearch: *const c_void,
|
||||||
|
pub RunFrame: *const c_void,
|
||||||
|
pub GetIPCCallCount: *const c_void,
|
||||||
|
pub SetWarningMessageHook: *const c_void,
|
||||||
|
pub BShutdownIfAllPipesClosed: *const c_void,
|
||||||
|
pub GetISteamHTTP: *const c_void,
|
||||||
|
pub DEPRECATED_GetISteamUnifiedMessages: *const c_void,
|
||||||
|
pub GetISteamController: *const c_void,
|
||||||
|
pub GetISteamUGC: *const c_void,
|
||||||
|
pub GetISteamAppList: *const c_void,
|
||||||
|
pub GetISteamMusic: *const c_void,
|
||||||
|
pub GetISteamMusicRemote: *const c_void,
|
||||||
|
pub GetISteamHTMLSurface: *const c_void,
|
||||||
|
pub DEPRECATED_Set_SteamAPI_CPostAPIResultInProcess: *const c_void,
|
||||||
|
pub DEPRECATED_Remove_SteamAPI_CPostAPIResultInProcess: *const c_void,
|
||||||
|
pub Set_SteamAPI_CCheckCallbackRegisteredInProcess: *const c_void,
|
||||||
|
pub GetISteamInventory: *const c_void,
|
||||||
|
pub GetISteamVideo: *const c_void,
|
||||||
|
pub GetISteamParentalSettings: *const c_void,
|
||||||
|
pub GetISteamInput: *const c_void,
|
||||||
|
pub GetISteamParties: *const c_void,
|
||||||
|
pub GetISteamRemotePlay: *const c_void,
|
||||||
|
pub DestroyAllInterfaces: *const c_void,
|
||||||
|
}
|
||||||
|
|
||||||
|
const STEAM_CLIENT_020_VTBL_DEFAULT: ISteamClient020Vtbl = ISteamClient020Vtbl {
|
||||||
|
CreateSteamPipe,
|
||||||
|
BReleaseSteamPipe,
|
||||||
|
ConnectToGlobalUser,
|
||||||
|
CreateLocalUser,
|
||||||
|
ReleaseUser: ptr::null(),
|
||||||
|
GetISteamUser: ptr::null(),
|
||||||
|
GetISteamGameServer: ptr::null(),
|
||||||
|
SetLocalIPBinding: ptr::null(),
|
||||||
|
GetISteamFriends: ptr::null(),
|
||||||
|
GetISteamUtils,
|
||||||
|
GetISteamMatchmaking: ptr::null(),
|
||||||
|
GetISteamMatchmakingServers: ptr::null(),
|
||||||
|
GetISteamGenericInterface: ptr::null(),
|
||||||
|
GetISteamUserStats: ptr::null(),
|
||||||
|
GetISteamGameServerStats: ptr::null(),
|
||||||
|
GetISteamApps: ptr::null(),
|
||||||
|
GetISteamNetworking: ptr::null(),
|
||||||
|
GetISteamRemoteStorage: ptr::null(),
|
||||||
|
GetISteamScreenshots: ptr::null(),
|
||||||
|
GetISteamGameSearch: ptr::null(),
|
||||||
|
RunFrame: ptr::null(),
|
||||||
|
GetIPCCallCount: ptr::null(),
|
||||||
|
SetWarningMessageHook: ptr::null(),
|
||||||
|
BShutdownIfAllPipesClosed: ptr::null(),
|
||||||
|
GetISteamHTTP: ptr::null(),
|
||||||
|
DEPRECATED_GetISteamUnifiedMessages: ptr::null(),
|
||||||
|
GetISteamController: ptr::null(),
|
||||||
|
GetISteamUGC: ptr::null(),
|
||||||
|
GetISteamAppList: ptr::null(),
|
||||||
|
GetISteamMusic: ptr::null(),
|
||||||
|
GetISteamMusicRemote: ptr::null(),
|
||||||
|
GetISteamHTMLSurface: ptr::null(),
|
||||||
|
DEPRECATED_Set_SteamAPI_CPostAPIResultInProcess: ptr::null(),
|
||||||
|
DEPRECATED_Remove_SteamAPI_CPostAPIResultInProcess: ptr::null(),
|
||||||
|
Set_SteamAPI_CCheckCallbackRegisteredInProcess: ptr::null(),
|
||||||
|
GetISteamInventory: ptr::null(),
|
||||||
|
GetISteamVideo: ptr::null(),
|
||||||
|
GetISteamParentalSettings: ptr::null(),
|
||||||
|
GetISteamInput: ptr::null(),
|
||||||
|
GetISteamParties: ptr::null(),
|
||||||
|
GetISteamRemotePlay: ptr::null(),
|
||||||
|
DestroyAllInterfaces: ptr::null(),
|
||||||
|
};
|
||||||
|
|
||||||
|
extern "C" fn CreateSteamPipe(self_ptr: *mut ISteamClient) -> SteamPipe {
|
||||||
|
warn!("STUB: ISteamClient::CreateSteamPipe({:?})", self_ptr);
|
||||||
|
0
|
||||||
|
}
|
||||||
|
extern "C" fn BReleaseSteamPipe(self_ptr: *mut ISteamClient, pipe: SteamPipe) -> bool {
|
||||||
|
warn!(
|
||||||
|
"STUB: ISteamClient::BReleaseSteamPipe({:?}, {})",
|
||||||
|
self_ptr, pipe
|
||||||
|
);
|
||||||
|
false
|
||||||
|
}
|
||||||
|
extern "C" fn ConnectToGlobalUser(self_ptr: *mut ISteamClient, pipe: SteamPipe) -> SteamUser {
|
||||||
|
warn!(
|
||||||
|
"STUB: ISteamClient::ConnectToGlobalUser({:?}, {})",
|
||||||
|
self_ptr, pipe
|
||||||
|
);
|
||||||
|
0
|
||||||
|
}
|
||||||
|
extern "C" fn CreateLocalUser(
|
||||||
|
self_ptr: *mut ISteamClient,
|
||||||
|
pipe: *const SteamPipe,
|
||||||
|
account_type: AccountType,
|
||||||
|
) -> SteamUser {
|
||||||
|
warn!(
|
||||||
|
"STUB: ISteamClient::CreateLocalUser({:?}, {:?}, {:?})",
|
||||||
|
self_ptr, pipe, account_type
|
||||||
|
);
|
||||||
|
0
|
||||||
|
}
|
||||||
|
extern "C" fn GetISteamUtils(
|
||||||
|
self_ptr: *mut ISteamClient,
|
||||||
|
pipe: SteamPipe,
|
||||||
|
version: *const c_char,
|
||||||
|
) -> *const ISteamUtils {
|
||||||
|
warn!(
|
||||||
|
"STUB: ISteamClient::GetISteamUtils({:?}, {}, {:?})",
|
||||||
|
self_ptr, pipe, version
|
||||||
|
);
|
||||||
|
ptr::null()
|
||||||
|
}
|
59
client/src/abi/steam_utils.rs
Normal file
59
client/src/abi/steam_utils.rs
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
#![allow(non_snake_case)]
|
||||||
|
use std::ffi::c_void;
|
||||||
|
|
||||||
|
/// Various weird steam utility functions
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct ISteamUtils {
|
||||||
|
pub vtbl: ISteamUtilsVtbl,
|
||||||
|
pub version: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Vtable for any version of SteamUtils
|
||||||
|
#[repr(C)]
|
||||||
|
pub union ISteamUtilsVtbl {
|
||||||
|
pub ver017: *const ISteamUtils010Vtbl,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Vtable for ISteamUtils010
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct ISteamUtils010Vtbl {
|
||||||
|
pub GetSecondsSinceAppActive: *const c_void,
|
||||||
|
pub GetSecondsSinceComputerActive: *const c_void,
|
||||||
|
pub GetConnectedUniverse: *const c_void,
|
||||||
|
pub GetServerRealTime: *const c_void,
|
||||||
|
pub GetIPCountry: *const c_void,
|
||||||
|
pub GetImageSize: *const c_void,
|
||||||
|
pub GetImageRGBA: *const c_void,
|
||||||
|
pub GetCSERIPPort: *const c_void,
|
||||||
|
pub GetCurrentBatteryPower: *const c_void,
|
||||||
|
pub GetAppID: *const c_void,
|
||||||
|
pub SetOverlayNotificationPosition: *const c_void,
|
||||||
|
pub IsAPICallCompleted: *const c_void,
|
||||||
|
pub GetAPICallFailureReason: *const c_void,
|
||||||
|
pub GetAPICallResult: *const c_void,
|
||||||
|
pub RunFrame: *const c_void,
|
||||||
|
pub GetIPCCallCount: *const c_void,
|
||||||
|
pub SetWarningMessageHook: *const c_void,
|
||||||
|
pub IsOverlayEnabled: *const c_void,
|
||||||
|
pub BOverlayNeedsPresent: *const c_void,
|
||||||
|
pub CheckFileSignature: *const c_void,
|
||||||
|
pub ShowGamepadTextInput: *const c_void,
|
||||||
|
pub GetEnteredGamepadTextLength: *const c_void,
|
||||||
|
pub GetEnteredGamepadTextInput: *const c_void,
|
||||||
|
pub GetSteamUILanguage: *const c_void,
|
||||||
|
pub IsSteamRunningInVR: *const c_void,
|
||||||
|
pub SetOverlayNotificationInset: *const c_void,
|
||||||
|
pub IsSteamInBigPictureMode: *const c_void,
|
||||||
|
pub StartVRDashboard: *const c_void,
|
||||||
|
pub IsVRHeadsetStreamingEnabled: *const c_void,
|
||||||
|
pub SetVRHeadsetStreamingEnabled: *const c_void,
|
||||||
|
pub IsSteamChinaLauncher: *const c_void,
|
||||||
|
pub InitFilterText: *const c_void,
|
||||||
|
pub FilterText: *const c_void,
|
||||||
|
pub GetIPv6ConnectivityState: *const c_void,
|
||||||
|
pub IsSteamRunningOnSteamDeck: *const c_void,
|
||||||
|
pub ShowFloatingGamepadTextInput: *const c_void,
|
||||||
|
pub SetGameLauncherMode: *const c_void,
|
||||||
|
pub DismissFloatingGamepadTextInput: *const c_void,
|
||||||
|
pub DismissGamepadTextInput: *const c_void,
|
||||||
|
}
|
|
@ -1,14 +1,7 @@
|
||||||
pub fn add(left: usize, right: usize) -> usize {
|
pub mod abi;
|
||||||
left + right
|
pub mod loader;
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[ctor::ctor]
|
||||||
mod tests {
|
fn init() {
|
||||||
use super::*;
|
env_logger::init();
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn it_works() {
|
|
||||||
let result = add(2, 2);
|
|
||||||
assert_eq!(result, 4);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
28
client/src/loader.rs
Normal file
28
client/src/loader.rs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
use std::{
|
||||||
|
ffi::{c_char, CStr},
|
||||||
|
ptr,
|
||||||
|
};
|
||||||
|
|
||||||
|
use log::trace;
|
||||||
|
|
||||||
|
use crate::abi::ISteamClient;
|
||||||
|
|
||||||
|
/// Lookup a new interface, should be the first function called
|
||||||
|
/// # Safety
|
||||||
|
/// version_ptr must be null or a null-terminated string
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn CreateInterface(version_ptr: *const c_char) -> *const ISteamClient {
|
||||||
|
if version_ptr.is_null() {
|
||||||
|
trace!("CreateInterface(nullptr)");
|
||||||
|
return ptr::null();
|
||||||
|
}
|
||||||
|
// SAFETY: We already know it's not null, there's not much else we can do
|
||||||
|
let version = unsafe { CStr::from_ptr(version_ptr) };
|
||||||
|
trace!("CreateInterface({:?})", version);
|
||||||
|
|
||||||
|
match ISteamClient::new(version) {
|
||||||
|
// TODO: figure out how the hell to deallocate this
|
||||||
|
Some(bx) => Box::leak(bx),
|
||||||
|
None => ptr::null(),
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue