Sync with KoalaBox

This commit is contained in:
acidicoala
2025-09-19 02:14:17 +05:00
parent 3544436df7
commit a7b95fc907
16 changed files with 366 additions and 556 deletions

4
.idea/cmake.xml generated
View File

@@ -2,8 +2,8 @@
<project version="4"> <project version="4">
<component name="CMakeSharedSettings"> <component name="CMakeSharedSettings">
<configurations> <configurations>
<configuration PROFILE_NAME="Debug [32] (Template: copy and set the 32-bit toolchain)" ENABLED="false" GENERATION_DIR="build/32" CONFIG_NAME="Debug" GENERATION_OPTIONS="-G &quot;Visual Studio 17 2022&quot; -A Win32" /> <configuration PROFILE_NAME="Debug [32] (Template: copy and set the 32-bit toolchain)" ENABLED="false" GENERATION_DIR="build/32-debug" CONFIG_NAME="Debug" GENERATION_OPTIONS="-G &quot;Visual Studio 17 2022&quot; -A Win32 -DCMAKE_BUILD_TYPE=Debug" />
<configuration PROFILE_NAME="Debug [64] (Template: copy and set the 64-bit toolchain)" ENABLED="false" GENERATION_DIR="build/64" CONFIG_NAME="Debug" GENERATION_OPTIONS="-G &quot;Visual Studio 17 2022&quot; -A x64" /> <configuration PROFILE_NAME="Debug [64] (Template: copy and set the 64-bit toolchain)" ENABLED="false" GENERATION_DIR="build/64-debug" CONFIG_NAME="Debug" GENERATION_OPTIONS="-G &quot;Visual Studio 17 2022&quot; -A x64 -DCMAKE_BUILD_TYPE=Debug" />
</configurations> </configurations>
</component> </component>
</project> </project>

View File

@@ -54,7 +54,6 @@
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_DEREF_IN_TRAILING_RETURN_TYPES/@EntryValue" value="ON_SINGLE_LINE" type="string" /> <option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_DEREF_IN_TRAILING_RETURN_TYPES/@EntryValue" value="ON_SINGLE_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_BEFORE_FUNCTION_TRY_BLOCK/@EntryValue" value="LINE_BREAK" type="string" /> <option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_BEFORE_FUNCTION_TRY_BLOCK/@EntryValue" value="LINE_BREAK" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COMMA_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="true" type="bool" /> <option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COMMA_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_LIMIT/@EntryValue" value="100" type="long" /> <option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_LIMIT/@EntryValue" value="100" type="long" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BRACED_INIT_LIST_STYLE/@EntryValue" value="CHOP_IF_LONG" type="string" /> <option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BRACED_INIT_LIST_STYLE/@EntryValue" value="CHOP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BASE_CLAUSE_STYLE/@EntryValue" value="CHOP_IF_LONG" type="string" /> <option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BASE_CLAUSE_STYLE/@EntryValue" value="CHOP_IF_LONG" type="string" />
@@ -75,7 +74,6 @@
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" /> <option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_ENUM_INITIALIZERS/@EntryValue" value="true" type="bool" /> <option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_ENUM_INITIALIZERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_BITFIELD_SIZES/@EntryValue" value="true" type="bool" /> <option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_BITFIELD_SIZES/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" />
</RiderCodeStyleSettings> </RiderCodeStyleSettings>
<editorconfig> <editorconfig>
<option name="ENABLED" value="false" /> <option name="ENABLED" value="false" />

View File

@@ -1,5 +1,5 @@
<component name="ProjectCodeStyleConfiguration"> <component name="ProjectCodeStyleConfiguration">
<state> <state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" /> <option name="PREFERRED_PROJECT_CODE_STYLE" value="acidicoala" />
</state> </state>
</component> </component>

View File

@@ -0,0 +1,7 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="acidicoala" />
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

View File

@@ -1,5 +1,5 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="exports_generator [64]" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="FALSE steam_api64_o $ProjectFileDir$/res/steamworks/*/binaries/steam_api64.dll $ProjectFileDir$/build/64/linker_exports.h $ProjectFileDir$/src/game_mode/exports" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SmokeAPI" TARGET_NAME="exports_generator" CONFIG_NAME="Debug [32]" RUN_TARGET_PROJECT_NAME="SmokeAPI" RUN_TARGET_NAME="exports_generator"> <configuration default="false" name="exports_generator [64]" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="FALSE steam_api64_o $ProjectFileDir$/res/steamworks/*/binaries/steam_api64.dll $CMakeCurrentGenerationDir$/generated/linker_exports_for_steam_api.h" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SmokeAPI" TARGET_NAME="exports_generator" CONFIG_NAME="Debug [32]" RUN_TARGET_PROJECT_NAME="SmokeAPI" RUN_TARGET_NAME="exports_generator">
<method v="2"> <method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method> </method>

View File

@@ -3,7 +3,9 @@ cmake_minimum_required(VERSION 3.24)
project(SmokeAPI VERSION 3.1.3) project(SmokeAPI VERSION 3.1.3)
include(KoalaBox/cmake/KoalaBox.cmake) include(KoalaBox/cmake/KoalaBox.cmake)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
add_definitions(-DKB_DEBUG)
endif()
add_subdirectory(KoalaBox) add_subdirectory(KoalaBox)
add_subdirectory(tools) add_subdirectory(tools)

View File

@@ -18,6 +18,22 @@
"SetGameType": 12, "SetGameType": 12,
"BGetUserAchievementStatus": 13 "BGetUserAchievementStatus": 13
}, },
"SteamMasterServerUpdater001": {
"SetActive": 0,
"SetHeartbeatInterval": 1,
"HandleIncomingPacket": 2,
"GetNextOutgoingPacket": 3,
"SetBasicServerData": 4,
"ClearAllKeyValues": 5,
"SetKeyValue": 6,
"NotifyShutdown": 7,
"WasRestartRequested": 8,
"ForceHeartbeat": 9,
"AddMasterServer": 10,
"RemoveMasterServer": 11,
"GetNumMasterServers": 12,
"GetMasterServerAddress": 13
},
"SteamFriends003": { "SteamFriends003": {
"GetPersonaName": 0, "GetPersonaName": 0,
"SetPersonaName": 1, "SetPersonaName": 1,
@@ -64,22 +80,6 @@
"SetWarningMessageHook": 20, "SetWarningMessageHook": 20,
"GetISteamRemoteStorage": 21 "GetISteamRemoteStorage": 21
}, },
"SteamMasterServerUpdater001": {
"SetActive": 0,
"SetHeartbeatInterval": 1,
"HandleIncomingPacket": 2,
"GetNextOutgoingPacket": 3,
"SetBasicServerData": 4,
"ClearAllKeyValues": 5,
"SetKeyValue": 6,
"NotifyShutdown": 7,
"WasRestartRequested": 8,
"ForceHeartbeat": 9,
"AddMasterServer": 10,
"RemoveMasterServer": 11,
"GetNumMasterServers": 12,
"GetMasterServerAddress": 13
},
"SteamNetworking001": { "SteamNetworking001": {
"CreateListenSocket": 0, "CreateListenSocket": 0,
"CreateP2PConnectionSocket": 1, "CreateP2PConnectionSocket": 1,
@@ -261,6 +261,25 @@
"GetCompressedVoice": 9, "GetCompressedVoice": 9,
"DecompressVoice": 10 "DecompressVoice": 10
}, },
"SteamGameServer008": {
"LogOn": 0,
"LogOff": 1,
"BLoggedOn": 2,
"BSecure": 3,
"GetSteamID": 4,
"SendUserConnectAndAuthenticate": 5,
"CreateUnauthenticatedUserConnection": 6,
"SendUserDisconnect": 7,
"BUpdateUserData": 8,
"BSetServerType": 9,
"UpdateServerStatus": 10,
"UpdateSpectatorPort": 11,
"SetGameType": 12,
"BGetUserAchievementStatus": 13,
"GetGameplayStats": 14,
"RequestUserGroupStatus": 15,
"GetPublicIP": 16
},
"SteamFriends005": { "SteamFriends005": {
"GetPersonaName": 0, "GetPersonaName": 0,
"SetPersonaName": 1, "SetPersonaName": 1,
@@ -287,24 +306,14 @@
"ActivateGameOverlayToStore": 22, "ActivateGameOverlayToStore": 22,
"SetPlayedWith": 23 "SetPlayedWith": 23
}, },
"SteamGameServer008": { "STEAMREMOTESTORAGE_INTERFACE_VERSION002": {
"LogOn": 0, "FileWrite": 0,
"LogOff": 1, "GetFileSize": 1,
"BLoggedOn": 2, "FileRead": 2,
"BSecure": 3, "FileExists": 3,
"GetSteamID": 4, "GetFileCount": 4,
"SendUserConnectAndAuthenticate": 5, "GetFileNameAndSize": 5,
"CreateUnauthenticatedUserConnection": 6, "GetQuota": 6
"SendUserDisconnect": 7,
"BUpdateUserData": 8,
"BSetServerType": 9,
"UpdateServerStatus": 10,
"UpdateSpectatorPort": 11,
"SetGameType": 12,
"BGetUserAchievementStatus": 13,
"GetGameplayStats": 14,
"RequestUserGroupStatus": 15,
"GetPublicIP": 16
}, },
"SteamNetworking002": { "SteamNetworking002": {
"CreateListenSocket": 0, "CreateListenSocket": 0,
@@ -322,15 +331,6 @@
"GetSocketConnectionType": 12, "GetSocketConnectionType": 12,
"GetMaxPacketSize": 13 "GetMaxPacketSize": 13
}, },
"STEAMREMOTESTORAGE_INTERFACE_VERSION002": {
"FileWrite": 0,
"GetFileSize": 1,
"FileRead": 2,
"FileExists": 3,
"GetFileCount": 4,
"GetFileNameAndSize": 5,
"GetQuota": 6
},
"STEAMUSERSTATS_INTERFACE_VERSION004": { "STEAMUSERSTATS_INTERFACE_VERSION004": {
"RequestCurrentStats": 0, "RequestCurrentStats": 0,
"GetStat": 2, "GetStat": 2,
@@ -653,31 +653,6 @@
"GetIPCCallCount": 20, "GetIPCCallCount": 20,
"SetWarningMessageHook": 21 "SetWarningMessageHook": 21
}, },
"SteamGameStats001": {
"GetNewSession": 0,
"EndSession": 1,
"AddSessionAttributeInt": 2,
"AddSessionAttributeString": 3,
"AddSessionAttributeFloat": 4,
"AddNewRow": 5,
"CommitRow": 6,
"CommitOutstandingRows": 7,
"AddRowAttributeInt": 8,
"AddRowAtributeString": 9,
"AddRowAttributeFloat": 10,
"AddSessionAttributeInt64": 11,
"AddRowAttributeInt64": 12
},
"SteamGameServerStats001": {
"RequestUserStats": 0,
"GetUserStat": 2,
"GetUserAchievement": 3,
"SetUserStat": 5,
"UpdateUserAvgRateStat": 6,
"SetUserAchievement": 7,
"ClearUserAchievement": 8,
"StoreUserStats": 9
},
"SteamGameServer010": { "SteamGameServer010": {
"LogOn": 0, "LogOn": 0,
"LogOff": 1, "LogOff": 1,
@@ -703,6 +678,31 @@
"EndAuthSession": 21, "EndAuthSession": 21,
"CancelAuthTicket": 22 "CancelAuthTicket": 22
}, },
"SteamGameServerStats001": {
"RequestUserStats": 0,
"GetUserStat": 2,
"GetUserAchievement": 3,
"SetUserStat": 5,
"UpdateUserAvgRateStat": 6,
"SetUserAchievement": 7,
"ClearUserAchievement": 8,
"StoreUserStats": 9
},
"SteamGameStats001": {
"GetNewSession": 0,
"EndSession": 1,
"AddSessionAttributeInt": 2,
"AddSessionAttributeString": 3,
"AddSessionAttributeFloat": 4,
"AddNewRow": 5,
"CommitRow": 6,
"CommitOutstandingRows": 7,
"AddRowAttributeInt": 8,
"AddRowAtributeString": 9,
"AddRowAttributeFloat": 10,
"AddSessionAttributeInt64": 11,
"AddRowAttributeInt64": 12
},
"STEAMUSERSTATS_INTERFACE_VERSION007": { "STEAMUSERSTATS_INTERFACE_VERSION007": {
"RequestCurrentStats": 0, "RequestCurrentStats": 0,
"GetStat": 2, "GetStat": 2,
@@ -1746,37 +1746,6 @@
"LogOnAndCreateNewSteamAccountIfNeeded": 26, "LogOnAndCreateNewSteamAccountIfNeeded": 26,
"GetConsoleSteamID": 27 "GetConsoleSteamID": 27
}, },
"SteamUtils006": {
"GetSecondsSinceAppActive": 0,
"GetSecondsSinceComputerActive": 1,
"GetConnectedUniverse": 2,
"GetServerRealTime": 3,
"GetIPCountry": 4,
"GetImageSize": 5,
"GetImageRGBA": 6,
"GetCSERIPPort": 7,
"GetCurrentBatteryPower": 8,
"GetAppID": 9,
"SetOverlayNotificationPosition": 10,
"IsAPICallCompleted": 11,
"GetAPICallFailureReason": 12,
"GetAPICallResult": 13,
"RunFrame": 14,
"GetIPCCallCount": 15,
"SetWarningMessageHook": 16,
"IsOverlayEnabled": 17,
"BOverlayNeedsPresent": 18,
"ShowGamepadTextInput": 19,
"GetEnteredGamepadTextLength": 20,
"GetEnteredGamepadTextInput": 21,
"GetSteamUILanguage": 22,
"IsSteamRunningInVR": 23,
"CheckFileSignature": 24,
"PostPS3SysutilCallback": 25,
"BIsReadyToShutdown": 26,
"BIsPSNOnline": 27,
"SetPSNGameBootInviteStrings": 28
},
"STEAMREMOTESTORAGE_INTERFACE_VERSION011": { "STEAMREMOTESTORAGE_INTERFACE_VERSION011": {
"FileWrite": 0, "FileWrite": 0,
"FileRead": 1, "FileRead": 1,
@@ -1836,6 +1805,37 @@
"SynchronizeToServer": 55, "SynchronizeToServer": 55,
"ResetFileRequestState": 56 "ResetFileRequestState": 56
}, },
"SteamUtils006": {
"GetSecondsSinceAppActive": 0,
"GetSecondsSinceComputerActive": 1,
"GetConnectedUniverse": 2,
"GetServerRealTime": 3,
"GetIPCountry": 4,
"GetImageSize": 5,
"GetImageRGBA": 6,
"GetCSERIPPort": 7,
"GetCurrentBatteryPower": 8,
"GetAppID": 9,
"SetOverlayNotificationPosition": 10,
"IsAPICallCompleted": 11,
"GetAPICallFailureReason": 12,
"GetAPICallResult": 13,
"RunFrame": 14,
"GetIPCCallCount": 15,
"SetWarningMessageHook": 16,
"IsOverlayEnabled": 17,
"BOverlayNeedsPresent": 18,
"ShowGamepadTextInput": 19,
"GetEnteredGamepadTextLength": 20,
"GetEnteredGamepadTextInput": 21,
"GetSteamUILanguage": 22,
"IsSteamRunningInVR": 23,
"CheckFileSignature": 24,
"PostPS3SysutilCallback": 25,
"BIsReadyToShutdown": 26,
"BIsPSNOnline": 27,
"SetPSNGameBootInviteStrings": 28
},
"STEAMAPPS_INTERFACE_VERSION006": { "STEAMAPPS_INTERFACE_VERSION006": {
"BIsSubscribed": 0, "BIsSubscribed": 0,
"BIsLowViolence": 1, "BIsLowViolence": 1,
@@ -2263,6 +2263,39 @@
"Set_SteamAPI_CCheckCallbackRegisteredInProcess": 33, "Set_SteamAPI_CCheckCallbackRegisteredInProcess": 33,
"GetISteamPS3OverlayRender": 34 "GetISteamPS3OverlayRender": 34
}, },
"STEAMUGC_INTERFACE_VERSION003": {
"CreateQueryUserUGCRequest": 0,
"CreateQueryAllUGCRequest": 1,
"SendQueryUGCRequest": 2,
"GetQueryUGCResult": 3,
"ReleaseQueryUGCRequest": 4,
"AddRequiredTag": 5,
"AddExcludedTag": 6,
"SetReturnLongDescription": 7,
"SetReturnTotalOnly": 8,
"SetAllowCachedResponse": 9,
"SetCloudFileNameFilter": 10,
"SetMatchAnyTag": 11,
"SetSearchText": 12,
"SetRankedByTrendDays": 13,
"RequestUGCDetails": 14,
"CreateItem": 15,
"StartItemUpdate": 16,
"SetItemTitle": 17,
"SetItemDescription": 18,
"SetItemVisibility": 19,
"SetItemTags": 20,
"SetItemContent": 21,
"SetItemPreview": 22,
"SubmitItemUpdate": 23,
"GetItemUpdateProgress": 24,
"SubscribeItem": 25,
"UnsubscribeItem": 26,
"GetNumSubscribedItems": 27,
"GetSubscribedItems": 28,
"GetItemInstallInfo": 29,
"GetItemUpdateInfo": 30
},
"STEAMHTMLSURFACE_INTERFACE_VERSION_002": { "STEAMHTMLSURFACE_INTERFACE_VERSION_002": {
"Init": 0, "Init": 0,
"Shutdown": 1, "Shutdown": 1,
@@ -2299,39 +2332,6 @@
"JSDialogResponse": 32, "JSDialogResponse": 32,
"FileLoadDialogResponse": 33 "FileLoadDialogResponse": 33
}, },
"STEAMUGC_INTERFACE_VERSION003": {
"CreateQueryUserUGCRequest": 0,
"CreateQueryAllUGCRequest": 1,
"SendQueryUGCRequest": 2,
"GetQueryUGCResult": 3,
"ReleaseQueryUGCRequest": 4,
"AddRequiredTag": 5,
"AddExcludedTag": 6,
"SetReturnLongDescription": 7,
"SetReturnTotalOnly": 8,
"SetAllowCachedResponse": 9,
"SetCloudFileNameFilter": 10,
"SetMatchAnyTag": 11,
"SetSearchText": 12,
"SetRankedByTrendDays": 13,
"RequestUGCDetails": 14,
"CreateItem": 15,
"StartItemUpdate": 16,
"SetItemTitle": 17,
"SetItemDescription": 18,
"SetItemVisibility": 19,
"SetItemTags": 20,
"SetItemContent": 21,
"SetItemPreview": 22,
"SubmitItemUpdate": 23,
"GetItemUpdateProgress": 24,
"SubscribeItem": 25,
"UnsubscribeItem": 26,
"GetNumSubscribedItems": 27,
"GetSubscribedItems": 28,
"GetItemInstallInfo": 29,
"GetItemUpdateInfo": 30
},
"STEAMAPPS_INTERFACE_VERSION007": { "STEAMAPPS_INTERFACE_VERSION007": {
"BIsSubscribed": 0, "BIsSubscribed": 0,
"BIsLowViolence": 1, "BIsLowViolence": 1,
@@ -2954,6 +2954,68 @@
"IsScreenshotsHooked": 7, "IsScreenshotsHooked": 7,
"AddVRScreenshotToLibrary": 8 "AddVRScreenshotToLibrary": 8
}, },
"STEAMREMOTESTORAGE_INTERFACE_VERSION014": {
"FileWrite": 0,
"FileRead": 1,
"FileWriteAsync": 2,
"FileReadAsync": 3,
"FileReadAsyncComplete": 4,
"FileForget": 5,
"FileDelete": 6,
"FileShare": 7,
"SetSyncPlatforms": 8,
"FileWriteStreamOpen": 9,
"FileWriteStreamWriteChunk": 10,
"FileWriteStreamClose": 11,
"FileWriteStreamCancel": 12,
"FileExists": 13,
"FilePersisted": 14,
"GetFileSize": 15,
"GetFileTimestamp": 16,
"GetSyncPlatforms": 17,
"GetFileCount": 18,
"GetFileNameAndSize": 19,
"GetQuota": 20,
"IsCloudEnabledForAccount": 21,
"IsCloudEnabledForApp": 22,
"SetCloudEnabledForApp": 23,
"UGCDownload": 24,
"GetUGCDownloadProgress": 25,
"GetUGCDetails": 26,
"UGCRead": 27,
"GetCachedUGCCount": 28,
"PublishWorkshopFile": 29,
"CreatePublishedFileUpdateRequest": 30,
"UpdatePublishedFileFile": 31,
"UpdatePublishedFilePreviewFile": 32,
"UpdatePublishedFileTitle": 33,
"UpdatePublishedFileDescription": 34,
"UpdatePublishedFileVisibility": 35,
"UpdatePublishedFileTags": 36,
"CommitPublishedFileUpdate": 37,
"GetPublishedFileDetails": 38,
"DeletePublishedFile": 39,
"EnumerateUserPublishedFiles": 40,
"SubscribePublishedFile": 41,
"EnumerateUserSubscribedFiles": 42,
"UnsubscribePublishedFile": 43,
"UpdatePublishedFileSetChangeDescription": 44,
"GetPublishedItemVoteDetails": 45,
"UpdateUserPublishedItemVote": 46,
"GetUserPublishedItemVoteDetails": 47,
"EnumerateUserSharedWorkshopFiles": 48,
"PublishVideo": 49,
"SetUserPublishedFileAction": 50,
"EnumeratePublishedFilesByUserAction": 51,
"EnumeratePublishedWorkshopFiles": 52,
"UGCDownloadToLocation": 53,
"GetFileListFromServer": 54,
"FileFetch": 55,
"FilePersist": 56,
"SynchronizeToClient": 57,
"SynchronizeToServer": 58,
"ResetFileRequestState": 59
},
"STEAMUGC_INTERFACE_VERSION009": { "STEAMUGC_INTERFACE_VERSION009": {
"CreateQueryUserUGCRequest": 0, "CreateQueryUserUGCRequest": 0,
"CreateQueryAllUGCRequest": 1, "CreateQueryAllUGCRequest": 1,
@@ -3023,68 +3085,6 @@
"StopPlaytimeTracking": 65, "StopPlaytimeTracking": 65,
"StopPlaytimeTrackingForAllItems": 66 "StopPlaytimeTrackingForAllItems": 66
}, },
"STEAMREMOTESTORAGE_INTERFACE_VERSION014": {
"FileWrite": 0,
"FileRead": 1,
"FileWriteAsync": 2,
"FileReadAsync": 3,
"FileReadAsyncComplete": 4,
"FileForget": 5,
"FileDelete": 6,
"FileShare": 7,
"SetSyncPlatforms": 8,
"FileWriteStreamOpen": 9,
"FileWriteStreamWriteChunk": 10,
"FileWriteStreamClose": 11,
"FileWriteStreamCancel": 12,
"FileExists": 13,
"FilePersisted": 14,
"GetFileSize": 15,
"GetFileTimestamp": 16,
"GetSyncPlatforms": 17,
"GetFileCount": 18,
"GetFileNameAndSize": 19,
"GetQuota": 20,
"IsCloudEnabledForAccount": 21,
"IsCloudEnabledForApp": 22,
"SetCloudEnabledForApp": 23,
"UGCDownload": 24,
"GetUGCDownloadProgress": 25,
"GetUGCDetails": 26,
"UGCRead": 27,
"GetCachedUGCCount": 28,
"PublishWorkshopFile": 29,
"CreatePublishedFileUpdateRequest": 30,
"UpdatePublishedFileFile": 31,
"UpdatePublishedFilePreviewFile": 32,
"UpdatePublishedFileTitle": 33,
"UpdatePublishedFileDescription": 34,
"UpdatePublishedFileVisibility": 35,
"UpdatePublishedFileTags": 36,
"CommitPublishedFileUpdate": 37,
"GetPublishedFileDetails": 38,
"DeletePublishedFile": 39,
"EnumerateUserPublishedFiles": 40,
"SubscribePublishedFile": 41,
"EnumerateUserSubscribedFiles": 42,
"UnsubscribePublishedFile": 43,
"UpdatePublishedFileSetChangeDescription": 44,
"GetPublishedItemVoteDetails": 45,
"UpdateUserPublishedItemVote": 46,
"GetUserPublishedItemVoteDetails": 47,
"EnumerateUserSharedWorkshopFiles": 48,
"PublishVideo": 49,
"SetUserPublishedFileAction": 50,
"EnumeratePublishedFilesByUserAction": 51,
"EnumeratePublishedWorkshopFiles": 52,
"UGCDownloadToLocation": 53,
"GetFileListFromServer": 54,
"FileFetch": 55,
"FilePersist": 56,
"SynchronizeToClient": 57,
"SynchronizeToServer": 58,
"ResetFileRequestState": 59
},
"SteamController005": { "SteamController005": {
"Init": 0, "Init": 0,
"Shutdown": 1, "Shutdown": 1,
@@ -3225,12 +3225,6 @@
"GetAppDependencies": 72, "GetAppDependencies": 72,
"DeleteItem": 73 "DeleteItem": 73
}, },
"STEAMVIDEO_INTERFACE_V002": {
"GetVideoURL": 0,
"IsBroadcasting": 1,
"GetOPFSettings": 2,
"GetOPFStringForApp": 3
},
"SteamUtils009": { "SteamUtils009": {
"GetSecondsSinceAppActive": 0, "GetSecondsSinceAppActive": 0,
"GetSecondsSinceComputerActive": 1, "GetSecondsSinceComputerActive": 1,
@@ -3267,6 +3261,12 @@
"FilterText": 32, "FilterText": 32,
"GetIPv6ConnectivityState": 33 "GetIPv6ConnectivityState": 33
}, },
"STEAMVIDEO_INTERFACE_V002": {
"GetVideoURL": 0,
"IsBroadcasting": 1,
"GetOPFSettings": 2,
"GetOPFStringForApp": 3
},
"STEAMHTMLSURFACE_INTERFACE_VERSION_004": { "STEAMHTMLSURFACE_INTERFACE_VERSION_004": {
"Init": 0, "Init": 0,
"Shutdown": 1, "Shutdown": 1,
@@ -3346,6 +3346,48 @@
"GetGlyphForActionOrigin": 29, "GetGlyphForActionOrigin": 29,
"GetInputTypeForHandle": 30 "GetInputTypeForHandle": 30
}, },
"SteamClient018": {
"CreateSteamPipe": 0,
"BReleaseSteamPipe": 1,
"ConnectToGlobalUser": 2,
"CreateLocalUser": 3,
"ReleaseUser": 4,
"GetISteamUser": 5,
"GetISteamGameServer": 6,
"SetLocalIPBinding": 7,
"GetISteamFriends": 8,
"GetISteamUtils": 9,
"GetISteamMatchmaking": 10,
"GetISteamMatchmakingServers": 11,
"GetISteamGenericInterface": 12,
"GetISteamUserStats": 13,
"GetISteamGameServerStats": 14,
"GetISteamApps": 15,
"GetISteamNetworking": 16,
"GetISteamRemoteStorage": 17,
"GetISteamScreenshots": 18,
"GetISteamGameSearch": 19,
"RunFrame": 20,
"GetIPCCallCount": 21,
"SetWarningMessageHook": 22,
"BShutdownIfAllPipesClosed": 23,
"GetISteamHTTP": 24,
"DEPRECATED_GetISteamUnifiedMessages": 25,
"GetISteamController": 26,
"GetISteamUGC": 27,
"GetISteamAppList": 28,
"GetISteamMusic": 29,
"GetISteamMusicRemote": 30,
"GetISteamHTMLSurface": 31,
"DEPRECATED_Set_SteamAPI_CPostAPIResultInProcess": 32,
"DEPRECATED_Remove_SteamAPI_CPostAPIResultInProcess": 33,
"Set_SteamAPI_CCheckCallbackRegisteredInProcess": 34,
"GetISteamInventory": 35,
"GetISteamVideo": 36,
"GetISteamParentalSettings": 37,
"GetISteamInput": 38,
"GetISteamParties": 39
},
"SteamController007": { "SteamController007": {
"Init": 0, "Init": 0,
"Shutdown": 1, "Shutdown": 1,
@@ -3464,48 +3506,6 @@
"GetProfileItemPropertyString": 78, "GetProfileItemPropertyString": 78,
"GetProfileItemPropertyUint": 79 "GetProfileItemPropertyUint": 79
}, },
"SteamClient018": {
"CreateSteamPipe": 0,
"BReleaseSteamPipe": 1,
"ConnectToGlobalUser": 2,
"CreateLocalUser": 3,
"ReleaseUser": 4,
"GetISteamUser": 5,
"GetISteamGameServer": 6,
"SetLocalIPBinding": 7,
"GetISteamFriends": 8,
"GetISteamUtils": 9,
"GetISteamMatchmaking": 10,
"GetISteamMatchmakingServers": 11,
"GetISteamGenericInterface": 12,
"GetISteamUserStats": 13,
"GetISteamGameServerStats": 14,
"GetISteamApps": 15,
"GetISteamNetworking": 16,
"GetISteamRemoteStorage": 17,
"GetISteamScreenshots": 18,
"GetISteamGameSearch": 19,
"RunFrame": 20,
"GetIPCCallCount": 21,
"SetWarningMessageHook": 22,
"BShutdownIfAllPipesClosed": 23,
"GetISteamHTTP": 24,
"DEPRECATED_GetISteamUnifiedMessages": 25,
"GetISteamController": 26,
"GetISteamUGC": 27,
"GetISteamAppList": 28,
"GetISteamMusic": 29,
"GetISteamMusicRemote": 30,
"GetISteamHTMLSurface": 31,
"DEPRECATED_Set_SteamAPI_CPostAPIResultInProcess": 32,
"DEPRECATED_Remove_SteamAPI_CPostAPIResultInProcess": 33,
"Set_SteamAPI_CCheckCallbackRegisteredInProcess": 34,
"GetISteamInventory": 35,
"GetISteamVideo": 36,
"GetISteamParentalSettings": 37,
"GetISteamInput": 38,
"GetISteamParties": 39
},
"STEAMHTTP_INTERFACE_VERSION003": { "STEAMHTTP_INTERFACE_VERSION003": {
"CreateHTTPRequest": 0, "CreateHTTPRequest": 0,
"SetHTTPRequestContextValue": 1, "SetHTTPRequestContextValue": 1,
@@ -3756,6 +3756,29 @@
"GetAppDependencies": 74, "GetAppDependencies": 74,
"DeleteItem": 75 "DeleteItem": 75
}, },
"SteamNetworkingUtils001": {
"GetLocalTimestamp": 0,
"SetDebugOutputFunction": 1,
"SetConfigValue": 2,
"GetConfigValue": 3,
"GetConfigValueInfo": 4,
"GetFirstConfigValue": 5,
"SteamNetworkingIPAddr_ToString": 6,
"SteamNetworkingIPAddr_ParseString": 7,
"SteamNetworkingIdentity_ToString": 8,
"SteamNetworkingIdentity_ParseString": 9,
"GetLocalPingLocation": 10,
"EstimatePingTimeBetweenTwoLocations": 11,
"EstimatePingTimeFromLocalHost": 12,
"ConvertPingLocationToString": 13,
"ParsePingLocationString": 14,
"CheckPingDataUpToDate": 15,
"IsPingMeasurementInProgress": 16,
"GetPingToDataCenter": 17,
"GetDirectPingToPOP": 18,
"GetPOPCount": 19,
"GetPOPList": 20
},
"SteamNetworkingSockets002": { "SteamNetworkingSockets002": {
"CreateListenSocketIP": 0, "CreateListenSocketIP": 0,
"ConnectByIPAddress": 1, "ConnectByIPAddress": 1,
@@ -3787,7 +3810,7 @@
"CreateHostedDedicatedServerListenSocket": 27, "CreateHostedDedicatedServerListenSocket": 27,
"RunCallbacks": 28 "RunCallbacks": 28
}, },
"SteamNetworkingUtils001": { "SteamNetworkingUtils002": {
"GetLocalTimestamp": 0, "GetLocalTimestamp": 0,
"SetDebugOutputFunction": 1, "SetDebugOutputFunction": 1,
"SetConfigValue": 2, "SetConfigValue": 2,
@@ -3798,13 +3821,13 @@
"SteamNetworkingIPAddr_ParseString": 7, "SteamNetworkingIPAddr_ParseString": 7,
"SteamNetworkingIdentity_ToString": 8, "SteamNetworkingIdentity_ToString": 8,
"SteamNetworkingIdentity_ParseString": 9, "SteamNetworkingIdentity_ParseString": 9,
"GetLocalPingLocation": 10, "GetRelayNetworkStatus": 10,
"EstimatePingTimeBetweenTwoLocations": 11, "GetLocalPingLocation": 11,
"EstimatePingTimeFromLocalHost": 12, "EstimatePingTimeBetweenTwoLocations": 12,
"ConvertPingLocationToString": 13, "EstimatePingTimeFromLocalHost": 13,
"ParsePingLocationString": 14, "ConvertPingLocationToString": 14,
"CheckPingDataUpToDate": 15, "ParsePingLocationString": 15,
"IsPingMeasurementInProgress": 16, "CheckPingDataUpToDate": 16,
"GetPingToDataCenter": 17, "GetPingToDataCenter": 17,
"GetDirectPingToPOP": 18, "GetDirectPingToPOP": 18,
"GetPOPCount": 19, "GetPOPCount": 19,
@@ -3846,29 +3869,6 @@
"GetGameCoordinatorServerLogin": 32, "GetGameCoordinatorServerLogin": 32,
"RunCallbacks": 33 "RunCallbacks": 33
}, },
"SteamNetworkingUtils002": {
"GetLocalTimestamp": 0,
"SetDebugOutputFunction": 1,
"SetConfigValue": 2,
"GetConfigValue": 3,
"GetConfigValueInfo": 4,
"GetFirstConfigValue": 5,
"SteamNetworkingIPAddr_ToString": 6,
"SteamNetworkingIPAddr_ParseString": 7,
"SteamNetworkingIdentity_ToString": 8,
"SteamNetworkingIdentity_ParseString": 9,
"GetRelayNetworkStatus": 10,
"GetLocalPingLocation": 11,
"EstimatePingTimeBetweenTwoLocations": 12,
"EstimatePingTimeFromLocalHost": 13,
"ConvertPingLocationToString": 14,
"ParsePingLocationString": 15,
"CheckPingDataUpToDate": 16,
"GetPingToDataCenter": 17,
"GetDirectPingToPOP": 18,
"GetPOPCount": 19,
"GetPOPList": 20
},
"STEAMUGC_INTERFACE_VERSION013": { "STEAMUGC_INTERFACE_VERSION013": {
"CreateQueryUserUGCRequest": 0, "CreateQueryUserUGCRequest": 0,
"CreateQueryAllUGCRequest": 2, "CreateQueryAllUGCRequest": 2,
@@ -3990,6 +3990,15 @@
"GetISteamParties": 39, "GetISteamParties": 39,
"GetISteamRemotePlay": 40 "GetISteamRemotePlay": 40
}, },
"STEAMREMOTEPLAY_INTERFACE_VERSION001": {
"GetSessionCount": 0,
"GetSessionID": 1,
"GetSessionSteamID": 2,
"GetSessionClientName": 3,
"GetSessionClientFormFactor": 4,
"BGetSessionClientResolution": 5,
"BSendRemotePlayTogetherInvite": 6
},
"SteamNetworkingSockets004": { "SteamNetworkingSockets004": {
"CreateListenSocketIP": 0, "CreateListenSocketIP": 0,
"ConnectByIPAddress": 1, "ConnectByIPAddress": 1,
@@ -4026,15 +4035,6 @@
"GetGameCoordinatorServerLogin": 32, "GetGameCoordinatorServerLogin": 32,
"RunCallbacks": 33 "RunCallbacks": 33
}, },
"STEAMREMOTEPLAY_INTERFACE_VERSION001": {
"GetSessionCount": 0,
"GetSessionID": 1,
"GetSessionSteamID": 2,
"GetSessionClientName": 3,
"GetSessionClientFormFactor": 4,
"BGetSessionClientResolution": 5,
"BSendRemotePlayTogetherInvite": 6
},
"SteamClient020": { "SteamClient020": {
"CreateSteamPipe": 0, "CreateSteamPipe": 0,
"BReleaseSteamPipe": 1, "BReleaseSteamPipe": 1,
@@ -4334,6 +4334,7 @@
"GetLobbyOwner": 35, "GetLobbyOwner": 35,
"SetLobbyOwner": 36, "SetLobbyOwner": 36,
"SetLinkedLobby": 37, "SetLinkedLobby": 37,
"CheckForPSNGameBootInvite": 38,
"ServerResponded": 0, "ServerResponded": 0,
"ServerFailedToRespond": 1, "ServerFailedToRespond": 1,
"RefreshComplete": 2, "RefreshComplete": 2,
@@ -5634,198 +5635,5 @@
"GetGlobalStat": 39, "GetGlobalStat": 39,
"GetGlobalStatHistory": 41, "GetGlobalStatHistory": 41,
"GetAchievementProgressLimits": 43 "GetAchievementProgressLimits": 43
},
"SteamFriends018": {
"GetPersonaName": 0,
"GetPersonaState": 1,
"GetFriendCount": 2,
"GetFriendByIndex": 3,
"GetFriendRelationship": 4,
"GetFriendPersonaState": 5,
"GetFriendPersonaName": 6,
"GetFriendGamePlayed": 7,
"GetFriendPersonaNameHistory": 8,
"GetFriendSteamLevel": 9,
"GetPlayerNickname": 10,
"GetFriendsGroupCount": 11,
"GetFriendsGroupIDByIndex": 12,
"GetFriendsGroupName": 13,
"GetFriendsGroupMembersCount": 14,
"GetFriendsGroupMembersList": 15,
"HasFriend": 16,
"GetClanCount": 17,
"GetClanByIndex": 18,
"GetClanName": 19,
"GetClanTag": 20,
"GetClanActivityCounts": 21,
"DownloadClanActivityCounts": 22,
"GetFriendCountFromSource": 23,
"GetFriendFromSourceByIndex": 24,
"IsUserInSource": 25,
"SetInGameVoiceSpeaking": 26,
"ActivateGameOverlay": 27,
"ActivateGameOverlayToUser": 28,
"ActivateGameOverlayToWebPage": 29,
"ActivateGameOverlayToStore": 30,
"SetPlayedWith": 31,
"ActivateGameOverlayInviteDialog": 32,
"GetSmallFriendAvatar": 33,
"GetMediumFriendAvatar": 34,
"GetLargeFriendAvatar": 35,
"RequestUserInformation": 36,
"RequestClanOfficerList": 37,
"GetClanOwner": 38,
"GetClanOfficerCount": 39,
"GetClanOfficerByIndex": 40,
"SetRichPresence": 41,
"ClearRichPresence": 42,
"GetFriendRichPresence": 43,
"GetFriendRichPresenceKeyCount": 44,
"GetFriendRichPresenceKeyByIndex": 45,
"RequestFriendRichPresence": 46,
"InviteUserToGame": 47,
"GetCoplayFriendCount": 48,
"GetCoplayFriend": 49,
"GetFriendCoplayTime": 50,
"GetFriendCoplayGame": 51,
"JoinClanChatRoom": 52,
"LeaveClanChatRoom": 53,
"GetClanChatMemberCount": 54,
"GetChatMemberByIndex": 55,
"SendClanChatMessage": 56,
"GetClanChatMessage": 57,
"IsClanChatAdmin": 58,
"IsClanChatWindowOpenInSteam": 59,
"OpenClanChatWindowInSteam": 60,
"CloseClanChatWindowInSteam": 61,
"SetListenForFriendsMessages": 62,
"ReplyToFriendMessage": 63,
"GetFriendMessage": 64,
"GetFollowerCount": 65,
"IsFollowing": 66,
"EnumerateFollowingList": 67,
"IsClanPublic": 68,
"IsClanOfficialGameGroup": 69,
"GetNumChatsWithUnreadPriorityMessages": 70,
"ActivateGameOverlayRemotePlayTogetherInviteDialog": 71,
"RegisterProtocolInOverlayBrowser": 72,
"ActivateGameOverlayInviteDialogConnectString": 73,
"RequestEquippedProfileItems": 74,
"BHasEquippedProfileItem": 75,
"GetProfileItemPropertyString": 76,
"GetProfileItemPropertyUint": 77
},
"STEAMREMOTEPLAY_INTERFACE_VERSION003": {
"GetSessionCount": 0,
"GetSessionID": 1,
"GetSessionSteamID": 2,
"GetSessionClientName": 3,
"GetSessionClientFormFactor": 4,
"BGetSessionClientResolution": 5,
"ShowRemotePlayTogetherUI": 6,
"BSendRemotePlayTogetherInvite": 7,
"BEnableRemotePlayTogetherDirectInput": 8,
"DisableRemotePlayTogetherDirectInput": 9,
"GetInput": 10,
"SetMouseVisibility": 11,
"SetMousePosition": 12,
"CreateMouseCursor": 13,
"SetMouseCursor": 14
},
"STEAMUGC_INTERFACE_VERSION021": {
"CreateQueryUserUGCRequest": 0,
"CreateQueryAllUGCRequest": 2,
"CreateQueryUGCDetailsRequest": 3,
"SendQueryUGCRequest": 4,
"GetQueryUGCResult": 5,
"GetQueryUGCNumTags": 6,
"GetQueryUGCTag": 7,
"GetQueryUGCTagDisplayName": 8,
"GetQueryUGCPreviewURL": 9,
"GetQueryUGCMetadata": 10,
"GetQueryUGCChildren": 11,
"GetQueryUGCStatistic": 12,
"GetQueryUGCNumAdditionalPreviews": 13,
"GetQueryUGCAdditionalPreview": 14,
"GetQueryUGCNumKeyValueTags": 15,
"GetQueryUGCKeyValueTag": 17,
"GetNumSupportedGameVersions": 18,
"GetSupportedGameVersionData": 19,
"GetQueryUGCContentDescriptors": 20,
"ReleaseQueryUGCRequest": 21,
"AddRequiredTag": 22,
"AddRequiredTagGroup": 23,
"AddExcludedTag": 24,
"SetReturnOnlyIDs": 25,
"SetReturnKeyValueTags": 26,
"SetReturnLongDescription": 27,
"SetReturnMetadata": 28,
"SetReturnChildren": 29,
"SetReturnAdditionalPreviews": 30,
"SetReturnTotalOnly": 31,
"SetReturnPlaytimeStats": 32,
"SetLanguage": 33,
"SetAllowCachedResponse": 34,
"SetAdminQuery": 35,
"SetCloudFileNameFilter": 36,
"SetMatchAnyTag": 37,
"SetSearchText": 38,
"SetRankedByTrendDays": 39,
"SetTimeCreatedDateRange": 40,
"SetTimeUpdatedDateRange": 41,
"AddRequiredKeyValueTag": 42,
"RequestUGCDetails": 43,
"CreateItem": 44,
"StartItemUpdate": 45,
"SetItemTitle": 46,
"SetItemDescription": 47,
"SetItemUpdateLanguage": 48,
"SetItemMetadata": 49,
"SetItemVisibility": 50,
"SetItemTags": 51,
"SetItemContent": 52,
"SetItemPreview": 53,
"SetAllowLegacyUpload": 54,
"RemoveAllItemKeyValueTags": 55,
"RemoveItemKeyValueTags": 56,
"AddItemKeyValueTag": 57,
"AddItemPreviewFile": 58,
"AddItemPreviewVideo": 59,
"UpdateItemPreviewFile": 60,
"UpdateItemPreviewVideo": 61,
"RemoveItemPreview": 62,
"AddContentDescriptor": 63,
"RemoveContentDescriptor": 64,
"SetRequiredGameVersions": 65,
"SubmitItemUpdate": 66,
"GetItemUpdateProgress": 67,
"SetUserItemVote": 68,
"GetUserItemVote": 69,
"AddItemToFavorites": 70,
"RemoveItemFromFavorites": 71,
"SubscribeItem": 72,
"UnsubscribeItem": 73,
"GetNumSubscribedItems": 74,
"GetSubscribedItems": 75,
"GetItemState": 76,
"GetItemInstallInfo": 77,
"GetItemDownloadInfo": 78,
"DownloadItem": 79,
"BInitWorkshopForGameServer": 80,
"SuspendDownloads": 81,
"StartPlaytimeTracking": 82,
"StopPlaytimeTracking": 83,
"StopPlaytimeTrackingForAllItems": 84,
"AddDependency": 85,
"RemoveDependency": 86,
"AddAppDependency": 87,
"RemoveAppDependency": 88,
"GetAppDependencies": 89,
"DeleteItem": 90,
"ShowWorkshopEULA": 91,
"GetWorkshopEULAStatus": 92,
"GetUserContentDescriptorPreferences": 93,
"SetItemsDisabledLocally": 94,
"SetSubscriptionsLoadOrder": 95
} }
} }

View File

@@ -2,12 +2,11 @@
#include <set> #include <set>
#include <koalabox/config.hpp> #include <koalabox/config.hpp>
#include <koalabox/dll_monitor.hpp> #include <koalabox/lib_monitor.hpp>
#include <koalabox/globals.hpp> #include <koalabox/globals.hpp>
#include <koalabox/hook.hpp> #include <koalabox/hook.hpp>
#include <koalabox/loader.hpp>
#include <koalabox/logger.hpp> #include <koalabox/logger.hpp>
#include <koalabox/module.hpp> #include <koalabox/lib.hpp>
#include <koalabox/path.hpp> #include <koalabox/path.hpp>
#include <koalabox/paths.hpp> #include <koalabox/paths.hpp>
#include <koalabox/util.hpp> #include <koalabox/util.hpp>
@@ -41,17 +40,16 @@
namespace { namespace {
namespace kb = koalabox; namespace kb = koalabox;
void* steamapi_handle = nullptr; void* original_steamapi_handle = nullptr;
const kb::dll_monitor::callback_context_t* dll_monitor_context = nullptr;
std::set<std::string> find_steamclient_versions() { std::set<std::string> find_steamclient_versions(void* steamapi_handle) {
if(!steamapi_handle) { if(!steamapi_handle) {
kb::util::panic("Invalid state. steamapi_handle is null."); kb::util::panic("Invalid state. steamapi_handle is null.");
} }
std::set<std::string> versions; std::set<std::string> versions;
const auto rdata_section = kb::module::get_section_or_throw(steamapi_handle, kb::module::CONST_STR_SECTION); const auto rdata_section = kb::lib::get_section_or_throw(steamapi_handle, kb::lib::CONST_STR_SECTION);
const auto rdata = rdata_section.to_string(); const auto rdata = rdata_section.to_string();
const std::regex pattern(R"(SteamClient\d{3})"); const std::regex pattern(R"(SteamClient\d{3})");
@@ -65,17 +63,12 @@ namespace {
return versions; return versions;
} }
bool on_steamclient_loaded(const HMODULE steamclient_handle) { void warn_if_late_injection(const std::string& steamclient_version) {
static const auto CreateInterface$ = KB_MOD_GET_FUNC(steamclient_handle, CreateInterface);
if(steamapi_handle) {
// SteamAPI might have been initialized.
// Hence, we need to query SteamClient interfaces and hook them if needed.
const auto steamclient_versions = find_steamclient_versions();
for(const auto& steamclient_version : steamclient_versions) {
if(CreateInterface$(steamclient_version.c_str(), nullptr)) {
#ifdef KB_WIN #ifdef KB_WIN
if(!kb::util::is_wine_env()) { if(kb::util::is_wine_env()) {
return;
}
LOG_WARN( LOG_WARN(
"'{}' was already initialized. SmokeAPI might not work as expected.", steamclient_version "'{}' was already initialized. SmokeAPI might not work as expected.", steamclient_version
); );
@@ -83,8 +76,23 @@ namespace {
"Probable cause: SmokeAPI was injected too late. If possible, try injecting it earlier." "Probable cause: SmokeAPI was injected too late. If possible, try injecting it earlier."
); );
LOG_WARN("NOTE: You can safely ignore this warning if running under Proton or native Linux"); LOG_WARN("NOTE: You can safely ignore this warning if running under Proton or native Linux");
}
#endif #endif
}
bool on_steamclient_loaded(void* steamclient_handle) {
static const auto CreateInterface$ = KB_MOD_GET_FUNC(steamclient_handle, CreateInterface);
auto* steamapi_handle = original_steamapi_handle
? original_steamapi_handle
: kb::lib::get_library_handle(STEAM_API_MODULE);
if(steamapi_handle) {
// SteamAPI might have been initialized.
// Hence, we need to query SteamClient interfaces and hook them if needed.
const auto steamclient_versions = find_steamclient_versions(steamapi_handle);
for(const auto& steamclient_version : steamclient_versions) {
if(CreateInterface$(steamclient_version.c_str(), nullptr)) {
warn_if_late_injection(steamclient_version);
steam_interfaces::hook_steamclient_interface(steamclient_handle, steamclient_version); steam_interfaces::hook_steamclient_interface(steamclient_handle, steamclient_version);
} else { } else {
LOG_INFO("'{}' has not been initialized. Waiting for initialization.", steamclient_version); LOG_INFO("'{}' has not been initialized. Waiting for initialization.", steamclient_version);
@@ -94,16 +102,11 @@ namespace {
KB_HOOK_DETOUR_MODULE(CreateInterface, steamclient_handle); KB_HOOK_DETOUR_MODULE(CreateInterface, steamclient_handle);
// TODO: There is an implicit lifetime dependency here and potential for leaks.
// This mechanism requires rework.
// DLL monitor will have destroyed it.
dll_monitor_context = nullptr;
return true; return true;
} }
void start_dll_listener() { void init_lib_monitor() {
dll_monitor_context = kb::dll_monitor::init_listener( kb::lib_monitor::init_listener(
{{STEAMCLIENT_DLL, on_steamclient_loaded}} {{STEAMCLIENT_DLL, on_steamclient_loaded}}
); );
} }
@@ -123,7 +126,7 @@ namespace smoke_api {
LOG_INFO("{} v{} | Built at '{}'", PROJECT_NAME, PROJECT_VERSION, __TIMESTAMP__); LOG_INFO("{} v{} | Built at '{}'", PROJECT_NAME, PROJECT_VERSION, __TIMESTAMP__);
LOG_DEBUG("Parsed config:\n{}", nlohmann::ordered_json(config::instance).dump(2)); LOG_DEBUG("Parsed config:\n{}", nlohmann::ordered_json(config::instance).dump(2));
const auto exe_path = kb::module::get_fs_path(nullptr); const auto exe_path = kb::lib::get_fs_path(nullptr);
const auto exe_name = kb::path::to_str(exe_path.filename()); const auto exe_name = kb::path::to_str(exe_path.filename());
LOG_DEBUG("Process name: '{}' [{}-bit]", exe_name, kb::util::BITNESS); LOG_DEBUG("Process name: '{}' [{}-bit]", exe_name, kb::util::BITNESS);
@@ -135,14 +138,14 @@ namespace smoke_api {
if(kb::hook::is_hook_mode(module_handle, STEAM_API_MODULE)) { if(kb::hook::is_hook_mode(module_handle, STEAM_API_MODULE)) {
LOG_INFO("Detected hook mode"); LOG_INFO("Detected hook mode");
start_dll_listener(); init_lib_monitor();
} else { } else {
LOG_INFO("Detected proxy mode"); LOG_INFO("Detected proxy mode");
start_dll_listener(); init_lib_monitor();
const auto self_path = kb::paths::get_self_dir(); const auto self_path = kb::paths::get_self_dir();
steamapi_handle = kb::loader::load_original_library( original_steamapi_handle = kb::lib::load_original_library(
self_path, self_path,
STEAM_API_MODULE STEAM_API_MODULE
); );
@@ -156,12 +159,14 @@ namespace smoke_api {
void shutdown() { void shutdown() {
try { try {
if(steamapi_handle != nullptr) { if(original_steamapi_handle != nullptr) {
kb::module::unload_library(steamapi_handle); kb::lib::unload_library(original_steamapi_handle);
steamapi_handle = nullptr; original_steamapi_handle = nullptr;
} }
kb::dll_monitor::shutdown_listener(dll_monitor_context); if(kb::lib_monitor::is_initialized()) {
kb::lib_monitor::shutdown_listener();
}
// TODO: Unhook everything // TODO: Unhook everything

View File

@@ -6,15 +6,17 @@
namespace steam_client { namespace steam_client {
void* GetGenericInterface( void* GetGenericInterface(
const std::string& function_name, const std::string& function_name,
const std::string& interface_version, const char* interface_version, // This can be null
const std::function<void*()>& original_function const std::function<void*()>& original_function
) noexcept { ) noexcept {
try { try {
auto* const interface = original_function(); auto* const interface = original_function();
if(interface_version) {
LOG_DEBUG("{} -> '{}' @ {}", function_name, interface_version, interface); LOG_DEBUG("{} -> '{}' @ {}", function_name, interface_version, interface);
steam_interfaces::hook_virtuals(interface, interface_version); steam_interfaces::hook_virtuals(interface, interface_version);
}
return interface; return interface;
} catch(const std::exception& e) { } catch(const std::exception& e) {

View File

@@ -5,7 +5,7 @@
namespace steam_client { namespace steam_client {
void* GetGenericInterface( void* GetGenericInterface(
const std::string& function_name, const std::string& function_name,
const std::string& interface_version, const char* interface_version,
const std::function<void*()>& original_function const std::function<void*()>& original_function
) noexcept; ) noexcept;
} }

View File

@@ -7,7 +7,7 @@
#include "steam_api/steam_interfaces.hpp" #include "steam_api/steam_interfaces.hpp"
#include "koalabox/module.hpp" #include "koalabox/lib.hpp"
#include "smoke_api/smoke_api.hpp" #include "smoke_api/smoke_api.hpp"
#include "smoke_api/steamclient/steamclient.hpp" #include "smoke_api/steamclient/steamclient.hpp"
#include "virtuals/steam_api_virtuals.hpp" #include "virtuals/steam_api_virtuals.hpp"
@@ -196,7 +196,7 @@ namespace steam_interfaces {
} }
void hook_steamclient_interface( void hook_steamclient_interface(
const HMODULE steamclient_handle, void* steamclient_handle,
const std::string& steam_client_interface_version const std::string& steam_client_interface_version
) noexcept { ) noexcept {
try { try {
@@ -209,7 +209,6 @@ namespace steam_interfaces {
// Map virtual hook map to a set of keys // Map virtual hook map to a set of keys
const auto prefixes = std::views::keys(virtual_hook_map) | std::ranges::to<std::set>(); const auto prefixes = std::views::keys(virtual_hook_map) | std::ranges::to<std::set>();
const auto CreateInterface$ = KB_MOD_GET_FUNC(steamclient_handle, CreateInterface); const auto CreateInterface$ = KB_MOD_GET_FUNC(steamclient_handle, CreateInterface);
const auto* const THIS = CreateInterface$(steam_client_interface_version.c_str(), nullptr); const auto* const THIS = CreateInterface$(steam_client_interface_version.c_str(), nullptr);
hook_virtuals(THIS, steam_client_interface_version); hook_virtuals(THIS, steam_client_interface_version);

View File

@@ -12,7 +12,7 @@ namespace steam_interfaces {
* such as in the case of late injection. * such as in the case of late injection.
*/ */
void hook_steamclient_interface( void hook_steamclient_interface(
HMODULE steamclient_handle, void* steamclient_handle,
const std::string& steam_client_interface_version const std::string& steam_client_interface_version
) noexcept; ) noexcept;
} }

View File

@@ -1,11 +1,8 @@
#pragma once #pragma once
#include <cstdint>
#include <map>
#include <string>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#include <koalabox/core.hpp>
#include <koalabox/hook.hpp> #include <koalabox/hook.hpp>
#define VIRTUAL(TYPE) __declspec(noinline) TYPE __fastcall // NOLINT(*-macro-parentheses) #define VIRTUAL(TYPE) __declspec(noinline) TYPE __fastcall // NOLINT(*-macro-parentheses)

View File

@@ -1,8 +1,5 @@
#include <filesystem>
#include <iostream>
#include <random> #include <random>
#include <regex> #include <regex>
#include <string>
#include <koalabox/http_client.hpp> #include <koalabox/http_client.hpp>
#include <koalabox/logger.hpp> #include <koalabox/logger.hpp>
@@ -33,12 +30,13 @@ namespace {
} }
void print_help() { void print_help() {
std::cout << "Steamworks SDK downloader for SmokeAPI v1.0" << std::endl LOG_INFO(
<< "Usage: steamworks_downloader version1 version2 ... versionN" << std::endl "Steamworks SDK downloader for SmokeAPI v1.0\n"
<< "Example: steamworks_downloader 100 158a 162" << std::endl "Usage: steamworks_downloader version1 version2 ... versionN\n"
<< "Alternative usage: steamworks_downloader C:/path/to/downloaded_sdk/" "Example: steamworks_downloader 100 158a 162\n"
<< "SDK version list available at: " "Alternative usage: steamworks_downloader C:/path/to/downloaded_sdk/\n"
<< "https://partner.steamgames.com/downloads/list" << std::endl; "SDK version list available at: https://partner.steamgames.com/downloads/list"
);
} }
void unzip_sdk(const fs::path& zip_file_path, const fs::path& unzip_dir) { void unzip_sdk(const fs::path& zip_file_path, const fs::path& unzip_dir) {
@@ -85,7 +83,7 @@ namespace {
const auto unzip_dir = steamworks_dir / version; const auto unzip_dir = steamworks_dir / version;
unzip_sdk(zip_file_path, unzip_dir); unzip_sdk(zip_file_path, unzip_dir);
} catch(std::exception& e) { } catch(std::exception& e) {
std::cerr << "Unzip error: " << e.what() << std::endl; LOG_ERROR("Unzip error: {}", e.what());
} }
fs::remove(zip_file_path); fs::remove(zip_file_path);
@@ -97,6 +95,8 @@ namespace {
* for further processing by other tools. * for further processing by other tools.
*/ */
int MAIN(const int argc, const TCHAR* argv[]) { // NOLINT(*-use-internal-linkage) int MAIN(const int argc, const TCHAR* argv[]) { // NOLINT(*-use-internal-linkage)
kb::logger::init_console_logger();
if(argc == 1) { if(argc == 1) {
print_help(); print_help();
return 0; return 0;

View File

@@ -1,8 +1,5 @@
#include <chrono> #include <chrono>
#include <deque>
#include <filesystem>
#include <fstream> #include <fstream>
#include <functional>
#include <set> #include <set>
#include <BS_thread_pool.hpp> #include <BS_thread_pool.hpp>
@@ -131,7 +128,7 @@ namespace {
/** /**
* Certain Steam macros break C++ AST parser, if left unprocessed. * Certain Steam macros break C++ AST parser, if left unprocessed.
* This function does that in a very naive manner. Stupid, but works. * This function preprocesses them in a very naive manner. Stupid, but works.
*/ */
std::string manually_preprocess_header(const fs::path& header_path) { std::string manually_preprocess_header(const fs::path& header_path) {
const auto header_contents = kb::io::read_file(header_path); const auto header_contents = kb::io::read_file(header_path);
@@ -143,11 +140,7 @@ namespace {
return processed_contents; return processed_contents;
} }
void parse_sdk( void parse_sdk(const fs::path& sdk_path, nlohmann::ordered_json& lookup, BS::thread_pool<>& pool) {
const fs::path& sdk_path,
nlohmann::ordered_json& lookup,
BS::thread_pool<>& pool
) {
const auto headers_dir = sdk_path / "headers\\steam"; const auto headers_dir = sdk_path / "headers\\steam";
const auto headers_dir_str = kb::path::to_str(headers_dir); const auto headers_dir_str = kb::path::to_str(headers_dir);
@@ -161,7 +154,8 @@ namespace {
// Go over each file in headers directory // Go over each file in headers directory
for(const auto& entry : fs::directory_iterator(headers_dir)) { for(const auto& entry : fs::directory_iterator(headers_dir)) {
if(const auto& header_path = entry.path(); header_path.extension() == ".h") { if(const auto& header_path = entry.path(); header_path.extension() == ".h") {
const auto task = pool.submit_task( // NOLINT(*-unused-local-non-trivial-variable) const auto task = pool.submit_task(
// NOLINT(*-unused-local-non-trivial-variable)
[&, header_path] { [&, header_path] {
try { try {
LOG_DEBUG("Parsing header: {}", kb::path::to_str(header_path)); LOG_DEBUG("Parsing header: {}", kb::path::to_str(header_path));
@@ -178,11 +172,9 @@ namespace {
} }
} }
void generate_lookup_json( void generate_lookup_json(const fs::path& steamworks_dir, const std::set<std::string>& sdk_filter) {
const fs::path& steamworks_dir, // Ideally the top level lookup should be unordered json (i.e. keys sorted alphabetically).
// // But the library doesn't support inserting ordered_json instances as values in json objects.
const std::set<std::string>& sdk_filter
) {
nlohmann::ordered_json lookup; nlohmann::ordered_json lookup;
// The thread pool noticeably speeds up the overall parsing. // The thread pool noticeably speeds up the overall parsing.