mirror of
https://github.com/Detanup01/gbe_fork.git
synced 2026-02-04 05:21:16 +01:00
add updated code + readme
This commit is contained in:
@@ -1,14 +1,29 @@
|
||||
## What is this ?
|
||||
This is an old Windows-only library equivalent to `steam_api.dll` that's still used by some old games.
|
||||
|
||||
## How to use ?
|
||||
You have some options to choose from:
|
||||
- Copy & paste it beside the game's `.exe` file
|
||||
- Or, inject it via `ColdClientLoader` (check its dedicated readme)
|
||||
- Or, inject it using any other loader/injector you prefer
|
||||
|
||||
## Purpose ?
|
||||
Bypass initial/basic checks in old games protected with old version of Stub drm.
|
||||
Bypass initial/basic checks in old games.
|
||||
|
||||
## Note
|
||||
Note that it doesn't emulate any Steam functionality at the moment.
|
||||
Note that it doesn't emulate all the required functionality at the moment, some functions are still missing.
|
||||
|
||||
## How to use ?
|
||||
|
||||
### Option 1:
|
||||
- Copy & paste this dll beside the game's `.exe` file
|
||||
- Copy `steam_api.dll` and `steamclient.dll` from the experimental build beside the game's `.exe` file
|
||||
- Generate the `steam_interfaces.txt` file
|
||||
- Run the game
|
||||
|
||||
### Option 2:
|
||||
- Copy & paste this dll inside the folder `steam_settings/load_dlls/`
|
||||
- Copy `steam_api.dll` and `steamclient.dll` from the experimental build beside the game's `.exe` file
|
||||
- Generate the `steam_interfaces.txt` file
|
||||
- Run the game
|
||||
|
||||
### Option 3:
|
||||
- Copy the dll to a separate folder, ex: `extra_dlls`
|
||||
- In `ColdClientLoader.ini` set the options:
|
||||
* `ForceInjectSteamClient=1`
|
||||
* `DllsToInjectFolder=extra_dlls`
|
||||
- Run `ColdClientLoader`
|
||||
|
||||
12
premake5.lua
12
premake5.lua
@@ -1379,6 +1379,7 @@ project "lib_steam_old"
|
||||
files {
|
||||
"steam_old_lib/**",
|
||||
"helpers/common_helpers.cpp", "helpers/common_helpers/**",
|
||||
"helpers/dbg_log.cpp", "helpers/dbg_log/**",
|
||||
'libs/utfcpp/**',
|
||||
-- detours
|
||||
detours_files,
|
||||
@@ -1388,7 +1389,16 @@ project "lib_steam_old"
|
||||
}
|
||||
-- x32 common source files
|
||||
files {
|
||||
"resources/win/client/32/resources.rc"
|
||||
"resources/win/api/32/resources.rc"
|
||||
}
|
||||
|
||||
|
||||
-- libs to link
|
||||
---------
|
||||
-- Windows libs to link
|
||||
filter {} -- reset the filter and remove all active keywords
|
||||
links {
|
||||
'Ws2_32',
|
||||
}
|
||||
-- End lib_steam_old
|
||||
|
||||
|
||||
4
steam_old_lib/README.md
Normal file
4
steam_old_lib/README.md
Normal file
@@ -0,0 +1,4 @@
|
||||
## Credits
|
||||
* https://github.com/SteamRE/open-steamworks/
|
||||
* https://gitlab.com/KittenPopo/csgo-2018-source/
|
||||
* Valve
|
||||
@@ -1,31 +1,302 @@
|
||||
#include "steam_old_lib.hpp"
|
||||
// if you're wondering, sold = steam old
|
||||
|
||||
#include "steam_old_lib/steam_old_lib.hpp"
|
||||
|
||||
#include "common_helpers/common_helpers.hpp"
|
||||
#include "dll/common_includes.h"
|
||||
|
||||
#include "detours/detours.h"
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <string_view>
|
||||
#include <cstdint>
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <Windows.h>
|
||||
|
||||
#include <Softpub.h> // WinVerifyTrust
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
#include "dbg_log/dbg_log.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
dbg_log dbg_logger(
|
||||
[]{
|
||||
static wchar_t dll_path[8192]{};
|
||||
auto chars = GetModuleFileNameW((HINSTANCE)&__ImageBase, dll_path, sizeof(dll_path) / sizeof(dll_path[0]));
|
||||
auto wpath = std::wstring_view(dll_path, chars);
|
||||
return common_helpers::to_str(wpath.substr(0, wpath.find_last_of(L"\\/"))) + PATH_SEPARATOR
|
||||
+ "STEAM_OLD_LOG_" + std::to_string(common_helpers::rand_number(UINT32_MAX)) + ".log";
|
||||
}()
|
||||
);
|
||||
#endif
|
||||
|
||||
|
||||
static bool dll_loaded = false;
|
||||
static HMODULE my_hModule = nullptr;
|
||||
|
||||
static HMODULE wintrust_dll = nullptr;
|
||||
static std::wstring wintrust_lib_path = L"";
|
||||
|
||||
static bool WinVerifyTrust_hooked = false;
|
||||
static bool LoadLibraryA_hooked = false;
|
||||
static bool LoadLibraryExA_hooked = false;
|
||||
static bool LoadLibraryW_hooked = false;
|
||||
static bool LoadLibraryExW_hooked = false;
|
||||
|
||||
static HMODULE hmod_steamclient = nullptr;
|
||||
static void *ptr_CreateInterface = nullptr;
|
||||
|
||||
|
||||
static inline bool is_steam_lib_A(const char *str) {
|
||||
return str && str[0] && (
|
||||
common_helpers::ends_with_i(str, "Steam.dll") ||
|
||||
common_helpers::ends_with_i(str, "Steam")
|
||||
);
|
||||
}
|
||||
|
||||
static inline bool is_steam_lib_W(const wchar_t *str) {
|
||||
return str && str[0] && (
|
||||
common_helpers::ends_with_i(str, L"Steam.dll") ||
|
||||
common_helpers::ends_with_i(str, L"Steam")
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
static decltype(WinVerifyTrust) *actual_WinVerifyTrust = nullptr;
|
||||
__declspec(noinline)
|
||||
static LONG WINAPI WinVerifyTrust_hook(HWND hwnd, GUID *pgActionID, LPVOID pWVTData) {
|
||||
if (WinVerifyTrust_hooked) {
|
||||
PRINT_DEBUG_ENTRY();
|
||||
SetLastError(ERROR_SUCCESS);
|
||||
return 0; // success
|
||||
}
|
||||
|
||||
if (actual_WinVerifyTrust) {
|
||||
return actual_WinVerifyTrust(hwnd, pgActionID, pWVTData);
|
||||
}
|
||||
|
||||
SetLastError(ERROR_SUCCESS);
|
||||
return 0; // success
|
||||
}
|
||||
|
||||
static decltype(LoadLibraryA) *actual_LoadLibraryA = LoadLibraryA;
|
||||
__declspec(noinline)
|
||||
static HMODULE WINAPI LoadLibraryA_hook(LPCSTR lpLibFileName)
|
||||
{
|
||||
if (LoadLibraryA_hooked && is_steam_lib_A(lpLibFileName)) {
|
||||
PRINT_DEBUG_ENTRY();
|
||||
SetLastError(ERROR_SUCCESS);
|
||||
return my_hModule;
|
||||
}
|
||||
|
||||
return actual_LoadLibraryA(lpLibFileName);
|
||||
}
|
||||
|
||||
static decltype(LoadLibraryExA) *actual_LoadLibraryExA = LoadLibraryExA;
|
||||
__declspec(noinline)
|
||||
static HMODULE WINAPI LoadLibraryExA_hook(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
|
||||
{
|
||||
if (LoadLibraryExA_hooked && is_steam_lib_A(lpLibFileName)) {
|
||||
PRINT_DEBUG_ENTRY();
|
||||
SetLastError(ERROR_SUCCESS);
|
||||
return my_hModule;
|
||||
}
|
||||
|
||||
return actual_LoadLibraryExA(lpLibFileName, hFile, dwFlags);
|
||||
}
|
||||
|
||||
static decltype(LoadLibraryW) *actual_LoadLibraryW = LoadLibraryW;
|
||||
__declspec(noinline)
|
||||
static HMODULE WINAPI LoadLibraryW_hook(LPCWSTR lpLibFileName)
|
||||
{
|
||||
if (LoadLibraryW_hooked && is_steam_lib_W(lpLibFileName)) {
|
||||
PRINT_DEBUG_ENTRY();
|
||||
SetLastError(ERROR_SUCCESS);
|
||||
return my_hModule;
|
||||
}
|
||||
|
||||
return actual_LoadLibraryW(lpLibFileName);
|
||||
}
|
||||
|
||||
static decltype(LoadLibraryExW) *actual_LoadLibraryExW = LoadLibraryExW;
|
||||
__declspec(noinline)
|
||||
static HMODULE WINAPI LoadLibraryExW_hook(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
|
||||
{
|
||||
if (LoadLibraryExW_hooked && is_steam_lib_W(lpLibFileName)) {
|
||||
PRINT_DEBUG_ENTRY();
|
||||
SetLastError(ERROR_SUCCESS);
|
||||
return my_hModule;
|
||||
}
|
||||
|
||||
return actual_LoadLibraryExW(lpLibFileName, hFile, dwFlags);
|
||||
}
|
||||
|
||||
|
||||
static bool redirect_win32_apis()
|
||||
{
|
||||
PRINT_DEBUG_ENTRY();
|
||||
try {
|
||||
wintrust_dll = LoadLibraryExW(wintrust_lib_path.c_str(), NULL, 0);
|
||||
if (!wintrust_dll) throw std::runtime_error("");
|
||||
|
||||
actual_WinVerifyTrust = (decltype(actual_WinVerifyTrust))GetProcAddress(wintrust_dll, "WinVerifyTrust");
|
||||
if (!actual_WinVerifyTrust) throw std::runtime_error("");
|
||||
|
||||
if (DetourTransactionBegin() != NO_ERROR) throw std::runtime_error("");
|
||||
if (DetourUpdateThread(GetCurrentThread()) != NO_ERROR) throw std::runtime_error("");
|
||||
|
||||
if (DetourAttach((PVOID *)&actual_WinVerifyTrust, (PVOID)WinVerifyTrust_hook) != NO_ERROR) throw std::runtime_error("");
|
||||
if (DetourAttach((PVOID *)&actual_LoadLibraryA, (PVOID)LoadLibraryA_hook) != NO_ERROR) throw std::runtime_error("");
|
||||
if (DetourAttach((PVOID *)&actual_LoadLibraryExA, (PVOID)LoadLibraryExA_hook) != NO_ERROR) throw std::runtime_error("");
|
||||
if (DetourAttach((PVOID *)&actual_LoadLibraryW, (PVOID)LoadLibraryW_hook) != NO_ERROR) throw std::runtime_error("");
|
||||
if (DetourAttach((PVOID *)&actual_LoadLibraryExW, (PVOID)LoadLibraryExW_hook) != NO_ERROR) throw std::runtime_error("");
|
||||
if (DetourTransactionCommit() != NO_ERROR) throw std::runtime_error("");
|
||||
|
||||
WinVerifyTrust_hooked = true;
|
||||
LoadLibraryA_hooked = true;
|
||||
LoadLibraryExA_hooked = true;
|
||||
LoadLibraryW_hooked = true;
|
||||
LoadLibraryExW_hooked = true;
|
||||
|
||||
return true;
|
||||
} catch (...) {
|
||||
|
||||
}
|
||||
|
||||
if (wintrust_dll) {
|
||||
FreeLibrary(wintrust_dll);
|
||||
wintrust_dll = nullptr;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool restore_win32_apis()
|
||||
{
|
||||
PRINT_DEBUG_ENTRY();
|
||||
WinVerifyTrust_hooked = false;
|
||||
LoadLibraryA_hooked = false;
|
||||
LoadLibraryExA_hooked = false;
|
||||
LoadLibraryW_hooked = false;
|
||||
LoadLibraryExW_hooked = false;
|
||||
|
||||
bool ret = false;
|
||||
|
||||
try {
|
||||
if (DetourTransactionBegin() != NO_ERROR) throw std::runtime_error("");
|
||||
if (DetourUpdateThread(GetCurrentThread()) != NO_ERROR) throw std::runtime_error("");
|
||||
|
||||
if (actual_WinVerifyTrust) {
|
||||
DetourDetach((PVOID *)&actual_WinVerifyTrust, (PVOID)WinVerifyTrust_hook);
|
||||
}
|
||||
|
||||
DetourDetach((PVOID *)&actual_LoadLibraryA, (PVOID)LoadLibraryA_hook);
|
||||
DetourDetach((PVOID *)&actual_LoadLibraryExA, (PVOID)LoadLibraryExA_hook);
|
||||
DetourDetach((PVOID *)&actual_LoadLibraryW, (PVOID)LoadLibraryW_hook);
|
||||
DetourDetach((PVOID *)&actual_LoadLibraryExW, (PVOID)LoadLibraryExW_hook);
|
||||
if (DetourTransactionCommit() != NO_ERROR) throw std::runtime_error("");
|
||||
|
||||
ret = true;
|
||||
} catch (...) {
|
||||
|
||||
}
|
||||
|
||||
if (wintrust_dll) {
|
||||
FreeLibrary(wintrust_dll);
|
||||
wintrust_dll = nullptr;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void* steamclient_loader(bool load)
|
||||
{
|
||||
if (load) {
|
||||
if (!ptr_CreateInterface) {
|
||||
PRINT_DEBUG("loading steamclient");
|
||||
if (!hmod_steamclient) {
|
||||
hmod_steamclient = LoadLibraryExW(L"steamclient.dll", NULL, 0);
|
||||
}
|
||||
|
||||
if (hmod_steamclient) {
|
||||
ptr_CreateInterface = GetProcAddress(hmod_steamclient, "CreateInterface");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (hmod_steamclient) {
|
||||
PRINT_DEBUG("unloading steamclient");
|
||||
FreeLibrary(hmod_steamclient);
|
||||
hmod_steamclient = nullptr;
|
||||
ptr_CreateInterface = nullptr;
|
||||
}
|
||||
}
|
||||
return ptr_CreateInterface;
|
||||
}
|
||||
|
||||
static bool patch()
|
||||
{
|
||||
PRINT_DEBUG_ENTRY();
|
||||
if (wintrust_lib_path.empty()) {
|
||||
auto size = GetSystemDirectoryW(&wintrust_lib_path[0], 0);
|
||||
if (size <= 0) return false;
|
||||
|
||||
wintrust_lib_path.resize(size);
|
||||
size = GetSystemDirectoryW(&wintrust_lib_path[0], (unsigned)wintrust_lib_path.size());
|
||||
if (size >= (unsigned)wintrust_lib_path.size()) {
|
||||
wintrust_lib_path.clear();
|
||||
return false;
|
||||
}
|
||||
|
||||
wintrust_lib_path.pop_back(); // remove null
|
||||
wintrust_lib_path += L"\\Wintrust.dll";
|
||||
}
|
||||
|
||||
return redirect_win32_apis();
|
||||
}
|
||||
|
||||
static void deinit()
|
||||
{
|
||||
PRINT_DEBUG_ENTRY();
|
||||
steamclient_loader(false);
|
||||
sold::set_steamclient_loader(nullptr);
|
||||
sold::set_tid(0);
|
||||
if (dll_loaded) {
|
||||
restore_win32_apis();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
|
||||
{
|
||||
switch (reason) {
|
||||
case DLL_PROCESS_ATTACH: {
|
||||
if (!soldlib::patch((void*)hModule)) {
|
||||
|
||||
#ifdef SOLD_EXTRA_DEBUG
|
||||
MessageBoxA(nullptr, "Failed to initialize", "Main", MB_OK | MB_ICONERROR);
|
||||
#endif
|
||||
|
||||
PRINT_DEBUG("DLL_PROCESS_ATTACH");
|
||||
my_hModule = hModule;
|
||||
auto my_tid = GetCurrentThreadId();
|
||||
if (!steamclient_loader(true)) {
|
||||
PRINT_DEBUG("[X] failed to load steamclient.dll");
|
||||
// https://learn.microsoft.com/en-us/windows/win32/dlls/dllmain
|
||||
// "The system immediately calls your entry-point function with DLL_PROCESS_DETACH and unloads the DLL"
|
||||
return FALSE;
|
||||
}
|
||||
if (!patch()) {
|
||||
PRINT_DEBUG("[X] failed to patch");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sold::set_steamclient_loader(steamclient_loader);
|
||||
sold::set_tid(my_tid);
|
||||
dll_loaded = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case DLL_PROCESS_DETACH: {
|
||||
if (dll_loaded) {
|
||||
soldlib::restore();
|
||||
}
|
||||
PRINT_DEBUG("DLL_PROCESS_DETACH");
|
||||
deinit();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,122 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <Windows.h>
|
||||
|
||||
|
||||
#if !defined(SOLD_EXTRA_DEBUG)
|
||||
#if defined(DEBUG) || defined(_DEBUG)
|
||||
#define SOLD_EXTRA_DEBUG
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
namespace soldlib {
|
||||
|
||||
// https://github.com/SteamRE/open-steamworks/blob/master/Open%20Steamworks/SteamTypes.h
|
||||
#define STEAM_MAX_PATH 255
|
||||
|
||||
// https://github.com/SteamRE/open-steamworks/blob/master/Open%20Steamworks/ESteamError.h
|
||||
typedef enum ESteamError
|
||||
{
|
||||
eSteamErrorNone = 0,
|
||||
eSteamErrorUnknown = 1,
|
||||
eSteamErrorLibraryNotInitialized = 2,
|
||||
eSteamErrorLibraryAlreadyInitialized = 3,
|
||||
eSteamErrorConfig = 4,
|
||||
eSteamErrorContentServerConnect = 5,
|
||||
eSteamErrorBadHandle = 6,
|
||||
eSteamErrorHandlesExhausted = 7,
|
||||
eSteamErrorBadArg = 8,
|
||||
eSteamErrorNotFound = 9,
|
||||
eSteamErrorRead = 10,
|
||||
eSteamErrorEOF = 11,
|
||||
eSteamErrorSeek = 12,
|
||||
eSteamErrorCannotWriteNonUserConfigFile = 13,
|
||||
eSteamErrorCacheOpen = 14,
|
||||
eSteamErrorCacheRead = 15,
|
||||
eSteamErrorCacheCorrupted = 16,
|
||||
eSteamErrorCacheWrite = 17,
|
||||
eSteamErrorCacheSession = 18,
|
||||
eSteamErrorCacheInternal = 19,
|
||||
eSteamErrorCacheBadApp = 20,
|
||||
eSteamErrorCacheVersion = 21,
|
||||
eSteamErrorCacheBadFingerPrint = 22,
|
||||
|
||||
eSteamErrorNotFinishedProcessing = 23,
|
||||
eSteamErrorNothingToDo = 24,
|
||||
eSteamErrorCorruptEncryptedUserIDTicket = 25,
|
||||
eSteamErrorSocketLibraryNotInitialized = 26,
|
||||
eSteamErrorFailedToConnectToUserIDTicketValidationServer = 27,
|
||||
eSteamErrorBadProtocolVersion = 28,
|
||||
eSteamErrorReplayedUserIDTicketFromClient = 29,
|
||||
eSteamErrorReceiveResultBufferTooSmall = 30,
|
||||
eSteamErrorSendFailed = 31,
|
||||
eSteamErrorReceiveFailed = 32,
|
||||
eSteamErrorReplayedReplyFromUserIDTicketValidationServer = 33,
|
||||
eSteamErrorBadSignatureFromUserIDTicketValidationServer = 34,
|
||||
eSteamErrorValidationStalledSoAborted = 35,
|
||||
eSteamErrorInvalidUserIDTicket = 36,
|
||||
eSteamErrorClientLoginRateTooHigh = 37,
|
||||
eSteamErrorClientWasNeverValidated = 38,
|
||||
eSteamErrorInternalSendBufferTooSmall = 39,
|
||||
eSteamErrorInternalReceiveBufferTooSmall = 40,
|
||||
eSteamErrorUserTicketExpired = 41,
|
||||
eSteamErrorCDKeyAlreadyInUseOnAnotherClient = 42,
|
||||
|
||||
eSteamErrorNotLoggedIn = 101,
|
||||
eSteamErrorAlreadyExists = 102,
|
||||
eSteamErrorAlreadySubscribed = 103,
|
||||
eSteamErrorNotSubscribed = 104,
|
||||
eSteamErrorAccessDenied = 105,
|
||||
eSteamErrorFailedToCreateCacheFile = 106,
|
||||
eSteamErrorCallStalledSoAborted = 107,
|
||||
eSteamErrorEngineNotRunning = 108,
|
||||
eSteamErrorEngineConnectionLost = 109,
|
||||
eSteamErrorLoginFailed = 110,
|
||||
eSteamErrorAccountPending = 111,
|
||||
eSteamErrorCacheWasMissingRetry = 112,
|
||||
eSteamErrorLocalTimeIncorrect = 113,
|
||||
eSteamErrorCacheNeedsDecryption = 114,
|
||||
eSteamErrorAccountDisabled = 115,
|
||||
eSteamErrorCacheNeedsRepair = 116,
|
||||
eSteamErrorRebootRequired = 117,
|
||||
|
||||
eSteamErrorNetwork = 200,
|
||||
|
||||
eSteamErrorOffline = 201,
|
||||
} ESteamError;
|
||||
|
||||
// https://github.com/SteamRE/open-steamworks/blob/master/Open%20Steamworks/TSteamError.h
|
||||
typedef enum EDetailedPlatformErrorType
|
||||
{
|
||||
eNoDetailedErrorAvailable,
|
||||
eStandardCerrno,
|
||||
eWin32LastError,
|
||||
eWinSockLastError,
|
||||
eDetailedPlatformErrorCount
|
||||
} EDetailedPlatformErrorType;
|
||||
|
||||
typedef struct TSteamError
|
||||
{
|
||||
ESteamError eSteamError;
|
||||
EDetailedPlatformErrorType eDetailedErrorType;
|
||||
int nDetailedErrorCode;
|
||||
char szDesc[STEAM_MAX_PATH];
|
||||
} TSteamError;
|
||||
|
||||
// https://gitlab.com/KittenPopo/csgo-2018-source/-/blob/main/common/SteamCommon.h
|
||||
// https://github.com/ValveSoftware/source-sdk-2013/blob/master/src/common/steamcommon.h
|
||||
typedef enum
|
||||
{
|
||||
eSteamAccountStatusDefault = 0x00000000,
|
||||
eSteamAccountStatusEmailVerified = 0x00000001,
|
||||
/* Note: Mask value 0x2 is reserved for future use. (Some, but not all, public accounts already have this set.) */
|
||||
eSteamAccountDisabled = 0x00000004
|
||||
} ESteamAccountStatusBitFields;
|
||||
|
||||
|
||||
bool patch(void *lib_hModule);
|
||||
bool restore();
|
||||
|
||||
}
|
||||
665
steam_old_lib/steam_old_lib/SteamCommon.h
Normal file
665
steam_old_lib/steam_old_lib/SteamCommon.h
Normal file
@@ -0,0 +1,665 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
#define STEAM_API extern "C" __declspec(dllexport)
|
||||
#define STEAM_CALL __cdecl
|
||||
|
||||
typedef void (STEAM_CALL *KeyValueIteratorCallback_t )(const char *Key, const char *Val, void *pvParam);
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
**
|
||||
** Exported macros and constants
|
||||
**
|
||||
******************************************************************************/
|
||||
|
||||
/* DEPRECATED -- these are ignored now, all API access is granted on SteamStartup */
|
||||
#define STEAM_USING_FILESYSTEM (0x00000001)
|
||||
#define STEAM_USING_LOGGING (0x00000002)
|
||||
#define STEAM_USING_USERID (0x00000004)
|
||||
#define STEAM_USING_ACCOUNT (0x00000008)
|
||||
#define STEAM_USING_ALL (0x0000000f)
|
||||
/* END DEPRECATED */
|
||||
|
||||
#define STEAM_MAX_PATH (255)
|
||||
#define STEAM_QUESTION_MAXLEN (255)
|
||||
#define STEAM_SALT_SIZE (8)
|
||||
#define STEAM_PROGRESS_PERCENT_SCALE (0x00001000)
|
||||
|
||||
/* These are maximum significant string lengths, excluding nul-terminator. */
|
||||
#define STEAM_CARD_NUMBER_SIZE (17)
|
||||
#define STEAM_CARD_HOLDERNAME_SIZE (100)
|
||||
#define STEAM_CARD_EXPYEAR_SIZE (4)
|
||||
#define STEAM_CARD_EXPMONTH_SIZE (2)
|
||||
#define STEAM_CARD_CVV2_SIZE (5)
|
||||
#define STEAM_BILLING_ADDRESS1_SIZE (128)
|
||||
#define STEAM_BILLING_ADDRESS2_SIZE (128)
|
||||
#define STEAM_BILLING_CITY_SIZE (50)
|
||||
#define STEAM_BILLING_ZIP_SIZE (16)
|
||||
#define STEAM_BILLING_STATE_SIZE (32)
|
||||
#define STEAM_BILLING_COUNTRY_SIZE (32)
|
||||
#define STEAM_BILLING_PHONE_SIZE (20)
|
||||
#define STEAM_BILLING_EMAIL_ADDRESS_SIZE (100)
|
||||
#define STEAM_TYPE_OF_PROOF_OF_PURCHASE_SIZE (20)
|
||||
#define STEAM_PROOF_OF_PURCHASE_TOKEN_SIZE (200)
|
||||
#define STEAM_EXTERNAL_ACCOUNTNAME_SIZE (100)
|
||||
#define STEAM_EXTERNAL_ACCOUNTPASSWORD_SIZE (80)
|
||||
#define STEAM_BILLING_CONFIRMATION_CODE_SIZE (22)
|
||||
#define STEAM_BILLING_CARD_APPROVAL_CODE_SIZE (100)
|
||||
#define STEAM_BILLING_TRANS_DATE_SIZE (9) // mm/dd/yy
|
||||
#define STEAM_BILLING_TRANS_TIME_SIZE (9) // hh:mm:ss
|
||||
|
||||
// other stuff based on reversing
|
||||
#define VPK_FILE_HANDLE_FLAG 0x40000000
|
||||
|
||||
/******************************************************************************
|
||||
**
|
||||
** Scalar type and enumerated type definitions.
|
||||
**
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
typedef unsigned int SteamHandle_t;
|
||||
|
||||
typedef void * SteamUserIDTicketValidationHandle_t;
|
||||
|
||||
typedef unsigned int SteamCallHandle_t;
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
typedef __int64 SteamSigned64_t;
|
||||
typedef unsigned __int64 SteamUnsigned64_t;
|
||||
#else
|
||||
typedef long long SteamSigned64_t;
|
||||
typedef unsigned long long SteamUnsigned64_t;
|
||||
#endif
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eSteamSeekMethodSet = 0,
|
||||
eSteamSeekMethodCur = 1,
|
||||
eSteamSeekMethodEnd = 2
|
||||
} ESteamSeekMethod;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eSteamBufferMethodFBF = 0,
|
||||
eSteamBufferMethodNBF = 1
|
||||
} ESteamBufferMethod;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eSteamErrorNone = 0,
|
||||
eSteamErrorUnknown = 1,
|
||||
eSteamErrorLibraryNotInitialized = 2,
|
||||
eSteamErrorLibraryAlreadyInitialized = 3,
|
||||
eSteamErrorConfig = 4,
|
||||
eSteamErrorContentServerConnect = 5,
|
||||
eSteamErrorBadHandle = 6,
|
||||
eSteamErrorHandlesExhausted = 7,
|
||||
eSteamErrorBadArg = 8,
|
||||
eSteamErrorNotFound = 9,
|
||||
eSteamErrorRead = 10,
|
||||
eSteamErrorEOF = 11,
|
||||
eSteamErrorSeek = 12,
|
||||
eSteamErrorCannotWriteNonUserConfigFile = 13,
|
||||
eSteamErrorCacheOpen = 14,
|
||||
eSteamErrorCacheRead = 15,
|
||||
eSteamErrorCacheCorrupted = 16,
|
||||
eSteamErrorCacheWrite = 17,
|
||||
eSteamErrorCacheSession = 18,
|
||||
eSteamErrorCacheInternal = 19,
|
||||
eSteamErrorCacheBadApp = 20,
|
||||
eSteamErrorCacheVersion = 21,
|
||||
eSteamErrorCacheBadFingerPrint = 22,
|
||||
|
||||
eSteamErrorNotFinishedProcessing = 23,
|
||||
eSteamErrorNothingToDo = 24,
|
||||
eSteamErrorCorruptEncryptedUserIDTicket = 25,
|
||||
eSteamErrorSocketLibraryNotInitialized = 26,
|
||||
eSteamErrorFailedToConnectToUserIDTicketValidationServer = 27,
|
||||
eSteamErrorBadProtocolVersion = 28,
|
||||
eSteamErrorReplayedUserIDTicketFromClient = 29,
|
||||
eSteamErrorReceiveResultBufferTooSmall = 30,
|
||||
eSteamErrorSendFailed = 31,
|
||||
eSteamErrorReceiveFailed = 32,
|
||||
eSteamErrorReplayedReplyFromUserIDTicketValidationServer = 33,
|
||||
eSteamErrorBadSignatureFromUserIDTicketValidationServer = 34,
|
||||
eSteamErrorValidationStalledSoAborted = 35,
|
||||
eSteamErrorInvalidUserIDTicket = 36,
|
||||
eSteamErrorClientLoginRateTooHigh = 37,
|
||||
eSteamErrorClientWasNeverValidated = 38,
|
||||
eSteamErrorInternalSendBufferTooSmall = 39,
|
||||
eSteamErrorInternalReceiveBufferTooSmall = 40,
|
||||
eSteamErrorUserTicketExpired = 41,
|
||||
eSteamErrorCDKeyAlreadyInUseOnAnotherClient = 42,
|
||||
|
||||
eSteamErrorNotLoggedIn = 101,
|
||||
eSteamErrorAlreadyExists = 102,
|
||||
eSteamErrorAlreadySubscribed = 103,
|
||||
eSteamErrorNotSubscribed = 104,
|
||||
eSteamErrorAccessDenied = 105,
|
||||
eSteamErrorFailedToCreateCacheFile = 106,
|
||||
eSteamErrorCallStalledSoAborted = 107,
|
||||
eSteamErrorEngineNotRunning = 108,
|
||||
eSteamErrorEngineConnectionLost = 109,
|
||||
eSteamErrorLoginFailed = 110,
|
||||
eSteamErrorAccountPending = 111,
|
||||
eSteamErrorCacheWasMissingRetry = 112,
|
||||
eSteamErrorLocalTimeIncorrect = 113,
|
||||
eSteamErrorCacheNeedsDecryption = 114,
|
||||
eSteamErrorAccountDisabled = 115,
|
||||
eSteamErrorCacheNeedsRepair = 116,
|
||||
eSteamErrorRebootRequired = 117,
|
||||
|
||||
eSteamErrorNetwork = 200,
|
||||
eSteamErrorOffline = 201
|
||||
|
||||
|
||||
} ESteamError;
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eNoDetailedErrorAvailable,
|
||||
eStandardCerrno,
|
||||
eWin32LastError,
|
||||
eWinSockLastError,
|
||||
eDetailedPlatformErrorCount
|
||||
} EDetailedPlatformErrorType;
|
||||
|
||||
typedef enum /* Filter elements returned by SteamFind{First,Next} */
|
||||
{
|
||||
eSteamFindLocalOnly, /* limit search to local filesystem */
|
||||
eSteamFindRemoteOnly, /* limit search to remote repository */
|
||||
eSteamFindAll /* do not limit search (duplicates allowed) */
|
||||
} ESteamFindFilter;
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
**
|
||||
** Exported structure and complex type definitions.
|
||||
**
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ESteamError eSteamError;
|
||||
EDetailedPlatformErrorType eDetailedErrorType;
|
||||
int nDetailedErrorCode;
|
||||
char szDesc[STEAM_MAX_PATH];
|
||||
} TSteamError;
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int bIsDir; /* If non-zero, element is a directory; if zero, element is a file */
|
||||
unsigned int uSizeOrCount; /* If element is a file, this contains size of file in bytes */
|
||||
int bIsLocal; /* If non-zero, reported item is a standalone element on local filesystem */
|
||||
char cszName[STEAM_MAX_PATH]; /* Base element name (no path) */
|
||||
long lLastAccessTime; /* Seconds since 1/1/1970 (like time_t) when element was last accessed */
|
||||
long lLastModificationTime; /* Seconds since 1/1/1970 (like time_t) when element was last modified */
|
||||
long lCreationTime; /* Seconds since 1/1/1970 (like time_t) when element was created */
|
||||
} TSteamElemInfo;
|
||||
|
||||
|
||||
// https://github.com/SteamRE/open-steamworks/blob/master/Open%20Steamworks/TSteamElemInfo.h
|
||||
typedef struct TSteamElemInfo64
|
||||
{
|
||||
int bIsDir; /* If non-zero, element is a directory; if zero, element is a file */
|
||||
unsigned long long ullSizeOrCount; /* If element is a file, this contains size of file in bytes */
|
||||
int bIsLocal; /* If non-zero, reported item is a standalone element on local filesystem */
|
||||
char cszName[STEAM_MAX_PATH]; /* Base element name (no path) */
|
||||
long long llLastAccessTime; /* Seconds since 1/1/1970 (like time_t) when element was last accessed */
|
||||
long long llLastModificationTime; /* Seconds since 1/1/1970 (like time_t) when element was last modified */
|
||||
long long llCreationTime; /* Seconds since 1/1/1970 (like time_t) when element was created */
|
||||
} TSteamElemInfo64;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int uNumSubscriptions;
|
||||
unsigned int uMaxNameChars;
|
||||
unsigned int uMaxApps;
|
||||
|
||||
} TSteamSubscriptionStats;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int uNumApps;
|
||||
unsigned int uMaxNameChars;
|
||||
unsigned int uMaxInstallDirNameChars;
|
||||
unsigned int uMaxVersionLabelChars;
|
||||
unsigned int uMaxLaunchOptions;
|
||||
unsigned int uMaxLaunchOptionDescChars;
|
||||
unsigned int uMaxLaunchOptionCmdLineChars;
|
||||
unsigned int uMaxNumIcons;
|
||||
unsigned int uMaxIconSize;
|
||||
unsigned int uMaxDependencies;
|
||||
|
||||
} TSteamAppStats;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *szLabel;
|
||||
unsigned int uMaxLabelChars;
|
||||
unsigned int uVersionId;
|
||||
int bIsNotAvailable;
|
||||
} TSteamAppVersion;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *szDesc;
|
||||
unsigned int uMaxDescChars;
|
||||
char *szCmdLine;
|
||||
unsigned int uMaxCmdLineChars;
|
||||
unsigned int uIndex;
|
||||
unsigned int uIconIndex;
|
||||
int bNoDesktopShortcut;
|
||||
int bNoStartMenuShortcut;
|
||||
int bIsLongRunningUnattended;
|
||||
|
||||
} TSteamAppLaunchOption;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *szName;
|
||||
unsigned int uMaxNameChars;
|
||||
char *szLatestVersionLabel;
|
||||
unsigned int uMaxLatestVersionLabelChars;
|
||||
char *szCurrentVersionLabel;
|
||||
unsigned int uMaxCurrentVersionLabelChars;
|
||||
char *szInstallDirName;
|
||||
unsigned int uMaxInstallDirNameChars;
|
||||
unsigned int uId;
|
||||
unsigned int uLatestVersionId;
|
||||
unsigned int uCurrentVersionId;
|
||||
unsigned int uMinCacheFileSizeMB;
|
||||
unsigned int uMaxCacheFileSizeMB;
|
||||
unsigned int uNumLaunchOptions;
|
||||
unsigned int uNumIcons;
|
||||
unsigned int uNumVersions;
|
||||
unsigned int uNumDependencies;
|
||||
|
||||
} TSteamApp;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eNoCost = 0,
|
||||
eBillOnceOnly = 1,
|
||||
eBillMonthly = 2,
|
||||
eProofOfPrepurchaseOnly = 3,
|
||||
eGuestPass = 4,
|
||||
eHardwarePromo = 5,
|
||||
eNumBillingTypes,
|
||||
} EBillingType;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *szName;
|
||||
unsigned int uMaxNameChars;
|
||||
unsigned int *puAppIds;
|
||||
unsigned int uMaxAppIds;
|
||||
unsigned int uId;
|
||||
unsigned int uNumApps;
|
||||
EBillingType eBillingType;
|
||||
unsigned int uCostInCents;
|
||||
unsigned int uNumDiscounts;
|
||||
int bIsPreorder;
|
||||
int bRequiresShippingAddress;
|
||||
unsigned int uDomesticShippingCostInCents;
|
||||
unsigned int uInternationalShippingCostInCents;
|
||||
bool bIsCyberCafeSubscription;
|
||||
unsigned int uGameCode;
|
||||
char szGameCodeDesc[STEAM_MAX_PATH];
|
||||
bool bIsDisabled;
|
||||
bool bRequiresCD;
|
||||
unsigned int uTerritoryCode;
|
||||
bool bIsSteam3Subscription;
|
||||
|
||||
} TSteamSubscription;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char szName[STEAM_MAX_PATH];
|
||||
unsigned int uDiscountInCents;
|
||||
unsigned int uNumQualifiers;
|
||||
|
||||
} TSteamSubscriptionDiscount;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char szName[STEAM_MAX_PATH];
|
||||
unsigned int uRequiredSubscription;
|
||||
int bIsDisqualifier;
|
||||
|
||||
} TSteamDiscountQualifier;
|
||||
|
||||
typedef struct TSteamProgress
|
||||
{
|
||||
int bValid; /* non-zero if call provides progress info */
|
||||
unsigned int uPercentDone; /* 0 to 100 * STEAM_PROGRESS_PERCENT_SCALE if bValid */
|
||||
char szProgress[STEAM_MAX_PATH]; /* additional progress info */
|
||||
} TSteamProgress;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eSteamNotifyTicketsWillExpire,
|
||||
eSteamNotifyAccountInfoChanged,
|
||||
eSteamNotifyContentDescriptionChanged,
|
||||
eSteamNotifyPleaseShutdown,
|
||||
eSteamNotifyNewContentServer,
|
||||
eSteamNotifySubscriptionStatusChanged,
|
||||
eSteamNotifyContentServerConnectionLost,
|
||||
eSteamNotifyCacheLoadingCompleted,
|
||||
eSteamNotifyCacheNeedsDecryption,
|
||||
eSteamNotifyCacheNeedsRepair
|
||||
} ESteamNotificationCallbackEvent;
|
||||
|
||||
|
||||
typedef void(*SteamNotificationCallback_t)(ESteamNotificationCallbackEvent eEvent, unsigned int nData);
|
||||
|
||||
|
||||
typedef char SteamPersonalQuestion_t[ STEAM_QUESTION_MAXLEN + 1 ];
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char uchSalt[STEAM_SALT_SIZE];
|
||||
} SteamSalt_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eVisa = 1,
|
||||
eMaster = 2,
|
||||
eAmericanExpress = 3,
|
||||
eDiscover = 4,
|
||||
eDinnersClub = 5,
|
||||
eJCB = 6
|
||||
} ESteamPaymentCardType;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ESteamPaymentCardType eCardType;
|
||||
char szCardNumber[ STEAM_CARD_NUMBER_SIZE +1 ];
|
||||
char szCardHolderName[ STEAM_CARD_HOLDERNAME_SIZE + 1];
|
||||
char szCardExpYear[ STEAM_CARD_EXPYEAR_SIZE + 1 ];
|
||||
char szCardExpMonth[ STEAM_CARD_EXPMONTH_SIZE+ 1 ];
|
||||
char szCardCVV2[ STEAM_CARD_CVV2_SIZE + 1 ];
|
||||
char szBillingAddress1[ STEAM_BILLING_ADDRESS1_SIZE + 1 ];
|
||||
char szBillingAddress2[ STEAM_BILLING_ADDRESS2_SIZE + 1 ];
|
||||
char szBillingCity[ STEAM_BILLING_CITY_SIZE + 1 ];
|
||||
char szBillingZip[ STEAM_BILLING_ZIP_SIZE + 1 ];
|
||||
char szBillingState[ STEAM_BILLING_STATE_SIZE + 1 ];
|
||||
char szBillingCountry[ STEAM_BILLING_COUNTRY_SIZE + 1 ];
|
||||
char szBillingPhone[ STEAM_BILLING_PHONE_SIZE + 1 ];
|
||||
char szBillingEmailAddress[ STEAM_BILLING_EMAIL_ADDRESS_SIZE + 1 ];
|
||||
unsigned int uExpectedCostInCents;
|
||||
unsigned int uExpectedTaxInCents;
|
||||
/* If the TSteamSubscription says that shipping info is required, */
|
||||
/* then the following fields must be filled out. */
|
||||
/* If szShippingName is empty, then assumes so are the rest. */
|
||||
char szShippingName[ STEAM_CARD_HOLDERNAME_SIZE + 1];
|
||||
char szShippingAddress1[ STEAM_BILLING_ADDRESS1_SIZE + 1 ];
|
||||
char szShippingAddress2[ STEAM_BILLING_ADDRESS2_SIZE + 1 ];
|
||||
char szShippingCity[ STEAM_BILLING_CITY_SIZE + 1 ];
|
||||
char szShippingZip[ STEAM_BILLING_ZIP_SIZE + 1 ];
|
||||
char szShippingState[ STEAM_BILLING_STATE_SIZE + 1 ];
|
||||
char szShippingCountry[ STEAM_BILLING_COUNTRY_SIZE + 1 ];
|
||||
char szShippingPhone[ STEAM_BILLING_PHONE_SIZE + 1 ];
|
||||
unsigned int uExpectedShippingCostInCents;
|
||||
|
||||
} TSteamPaymentCardInfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char szTypeOfProofOfPurchase[ STEAM_TYPE_OF_PROOF_OF_PURCHASE_SIZE + 1 ];
|
||||
|
||||
/* A ProofOfPurchase token is not necessarily a nul-terminated string; it may be binary data
|
||||
(perhaps encrypted). Hence we need a length and an array of bytes. */
|
||||
unsigned int uLengthOfBinaryProofOfPurchaseToken;
|
||||
char cBinaryProofOfPurchaseToken[ STEAM_PROOF_OF_PURCHASE_TOKEN_SIZE + 1 ];
|
||||
} TSteamPrepurchaseInfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char szAccountName[ STEAM_EXTERNAL_ACCOUNTNAME_SIZE + 1 ];
|
||||
char szPassword[ STEAM_EXTERNAL_ACCOUNTPASSWORD_SIZE + 1 ];
|
||||
} TSteamExternalBillingInfo;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ePaymentCardInfo = 1,
|
||||
ePrepurchasedInfo = 2,
|
||||
eAccountBillingInfo = 3,
|
||||
eExternalBillingInfo = 4, /* indirect billing via ISP etc (not supported yet) */
|
||||
ePaymentCardReceipt = 5,
|
||||
ePrepurchaseReceipt = 6,
|
||||
eEmptyReceipt = 7
|
||||
} ESteamSubscriptionBillingInfoType;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ESteamSubscriptionBillingInfoType eBillingInfoType;
|
||||
union {
|
||||
TSteamPaymentCardInfo PaymentCardInfo;
|
||||
TSteamPrepurchaseInfo PrepurchaseInfo;
|
||||
TSteamExternalBillingInfo ExternalBillingInfo;
|
||||
char bUseAccountBillingInfo;
|
||||
};
|
||||
|
||||
} TSteamSubscriptionBillingInfo;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
/* Subscribed */
|
||||
eSteamSubscriptionOK = 0, /* Subscribed */
|
||||
eSteamSubscriptionPending = 1, /* Awaiting transaction completion */
|
||||
eSteamSubscriptionPreorder = 2, /* Is currently a pre-order */
|
||||
eSteamSubscriptionPrepurchaseTransferred = 3, /* hop to this account */
|
||||
/* Unusbscribed */
|
||||
eSteamSubscriptionPrepurchaseInvalid = 4, /* Invalid cd-key */
|
||||
eSteamSubscriptionPrepurchaseRejected = 5, /* hopped out / banned / etc */
|
||||
eSteamSubscriptionPrepurchaseRevoked = 6, /* hop away from this account */
|
||||
eSteamSubscriptionPaymentCardDeclined = 7, /* CC txn declined */
|
||||
eSteamSubscriptionCancelledByUser = 8, /* Cancelled by client */
|
||||
eSteamSubscriptionCancelledByVendor = 9, /* Cancelled by us */
|
||||
eSteamSubscriptionPaymentCardUseLimit = 10, /* Card used too many times, potential fraud */
|
||||
eSteamSubscriptionPaymentCardAlert = 11, /* Got a "pick up card" or the like from bank */
|
||||
eSteamSubscriptionFailed = 12, /* Other Error in subscription data or transaction failed/lost */
|
||||
eSteamSubscriptionPaymentCardAVSFailure = 13, /* Card failed Address Verification check */
|
||||
eSteamSubscriptionPaymentCardInsufficientFunds = 14, /* Card failed due to insufficient funds */
|
||||
eSteamSubscriptionRestrictedCountry = 15 /* The subscription is not available in the user's country */
|
||||
|
||||
} ESteamSubscriptionStatus;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ESteamPaymentCardType eCardType;
|
||||
char szCardLastFourDigits[ 4 + 1 ];
|
||||
char szCardHolderName[ STEAM_CARD_HOLDERNAME_SIZE + 1];
|
||||
char szBillingAddress1[ STEAM_BILLING_ADDRESS1_SIZE + 1 ];
|
||||
char szBillingAddress2[ STEAM_BILLING_ADDRESS2_SIZE + 1 ];
|
||||
char szBillingCity[ STEAM_BILLING_CITY_SIZE + 1 ];
|
||||
char szBillingZip[ STEAM_BILLING_ZIP_SIZE + 1 ];
|
||||
char szBillingState[ STEAM_BILLING_STATE_SIZE + 1 ];
|
||||
char szBillingCountry[ STEAM_BILLING_COUNTRY_SIZE + 1 ];
|
||||
|
||||
// The following are only available after the subscription leaves "pending" status
|
||||
char szCardApprovalCode[ STEAM_BILLING_CARD_APPROVAL_CODE_SIZE + 1];
|
||||
char szTransDate[ STEAM_BILLING_TRANS_DATE_SIZE + 1]; /* mm/dd/yy */
|
||||
char szTransTime[ STEAM_BILLING_TRANS_TIME_SIZE + 1]; /* hh:mm:ss */
|
||||
unsigned int uPriceWithoutTax;
|
||||
unsigned int uTaxAmount;
|
||||
unsigned int uShippingCost;
|
||||
|
||||
} TSteamPaymentCardReceiptInfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char szTypeOfProofOfPurchase[ STEAM_TYPE_OF_PROOF_OF_PURCHASE_SIZE + 1 ];
|
||||
} TSteamPrepurchaseReceiptInfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ESteamSubscriptionStatus eStatus;
|
||||
ESteamSubscriptionStatus ePreviousStatus;
|
||||
ESteamSubscriptionBillingInfoType eReceiptInfoType;
|
||||
char szConfirmationCode[ STEAM_BILLING_CONFIRMATION_CODE_SIZE + 1];
|
||||
union {
|
||||
TSteamPaymentCardReceiptInfo PaymentCardReceiptInfo;
|
||||
TSteamPrepurchaseReceiptInfo PrepurchaseReceiptInfo;
|
||||
};
|
||||
|
||||
} TSteamSubscriptionReceipt;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ePhysicalBytesReceivedThisSession = 1,
|
||||
eAppReadyToLaunchStatus = 2,
|
||||
eAppPreloadStatus = 3,
|
||||
eAppEntireDepot = 4,
|
||||
eCacheBytesPresent = 5
|
||||
} ESteamAppUpdateStatsQueryType;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
SteamUnsigned64_t uBytesTotal;
|
||||
SteamUnsigned64_t uBytesPresent;
|
||||
} TSteamUpdateStats;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eSteamUserAdministrator = 0x00000001, /* May subscribe, unsubscribe, etc */
|
||||
eSteamUserDeveloper = 0x00000002, /* Steam or App developer */
|
||||
eSteamUserCyberCafe = 0x00000004 /* CyberCafe, school, etc -- UI should ask for password */
|
||||
/* before allowing logout, unsubscribe, etc */
|
||||
} ESteamUserTypeFlags;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eSteamAccountStatusDefault = 0x00000000,
|
||||
eSteamAccountStatusEmailVerified = 0x00000001,
|
||||
/* Note: Mask value 0x2 is reserved for future use. (Some, but not all, public accounts already have this set.) */
|
||||
eSteamAccountDisabled = 0x00000004
|
||||
} ESteamAccountStatusBitFields ;
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eSteamBootstrapperError = -1,
|
||||
eSteamBootstrapperDontCheckForUpdate = 0,
|
||||
eSteamBootstrapperCheckForUpdateAndRerun = 7
|
||||
|
||||
} ESteamBootStrapperClientAppResult;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eSteamOnline = 0,
|
||||
eSteamOffline = 1,
|
||||
eSteamNoAuthMode = 2,
|
||||
eSteamBillingOffline = 3
|
||||
} eSteamOfflineStatus;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int eOfflineNow;
|
||||
int eOfflineNextSession;
|
||||
} TSteamOfflineStatus;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int uAppId;
|
||||
int bIsSystemDefined;
|
||||
char szMountPath[STEAM_MAX_PATH];
|
||||
} TSteamAppDependencyInfo;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eSteamOpenFileRegular = 0x0,
|
||||
eSteamOpenFileIgnoreLocal = 0x1,
|
||||
eSteamOpenFileChecksumReads = 0x2
|
||||
} ESteamOpenFileFlags;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eSteamValveCDKeyValidationServer = 0,
|
||||
eSteamHalfLifeMasterServer = 1,
|
||||
eSteamFriendsServer = 2,
|
||||
eSteamCSERServer = 3,
|
||||
eSteamHalfLife2MasterServer = 4,
|
||||
eSteamRDKFMasterServer = 5,
|
||||
eMaxServerTypes = 6
|
||||
} ESteamServerType;
|
||||
|
||||
/******************************************************************************
|
||||
**
|
||||
** More exported constants
|
||||
**
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
const SteamHandle_t STEAM_INVALID_HANDLE = 0;
|
||||
const SteamCallHandle_t STEAM_INVALID_CALL_HANDLE = 0;
|
||||
const SteamUserIDTicketValidationHandle_t STEAM_INACTIVE_USERIDTICKET_VALIDATION_HANDLE = 0;
|
||||
const unsigned int STEAM_USE_LATEST_VERSION = 0xFFFFFFFF;
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
** Each Steam instance (licensed Steam Service Provider) has a unique SteamInstanceID_t.
|
||||
**
|
||||
** Each Steam instance as its own DB of users.
|
||||
** Each user in the DB has a unique SteamLocalUserID_t (a serial number, with possible
|
||||
** rare gaps in the sequence).
|
||||
**
|
||||
******************************************************************************/
|
||||
|
||||
typedef unsigned short SteamInstanceID_t; // MUST be 16 bits
|
||||
|
||||
|
||||
#if defined ( _WIN32 )
|
||||
typedef unsigned __int64 SteamLocalUserID_t; // MUST be 64 bits
|
||||
#else
|
||||
typedef unsigned long long SteamLocalUserID_t; // MUST be 64 bits
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
**
|
||||
** Applications need to be able to authenticate Steam users from ANY instance.
|
||||
** So a SteamIDTicket contains SteamGlobalUserID, which is a unique combination of
|
||||
** instance and user id.
|
||||
**
|
||||
** SteamLocalUserID is an unsigned 64-bit integer.
|
||||
** For platforms without 64-bit int support, we provide access via a union that splits it into
|
||||
** high and low unsigned 32-bit ints. Such platforms will only need to compare LocalUserIDs
|
||||
** for equivalence anyway - not perform arithmetic with them.
|
||||
**
|
||||
********************************************************************************/
|
||||
typedef struct
|
||||
{
|
||||
unsigned int Low32bits;
|
||||
unsigned int High32bits;
|
||||
} TSteamSplitLocalUserID;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
SteamInstanceID_t m_SteamInstanceID;
|
||||
|
||||
union
|
||||
{
|
||||
SteamLocalUserID_t As64bits;
|
||||
TSteamSplitLocalUserID Split;
|
||||
} m_SteamLocalUserID;
|
||||
|
||||
} TSteamGlobalUserID;
|
||||
|
||||
|
||||
// other stuff based on reversing
|
||||
typedef struct
|
||||
{
|
||||
unsigned int uAppId;
|
||||
const char szAppName[64];
|
||||
|
||||
} TSteamAppInfo;
|
||||
11
steam_old_lib/steam_old_lib/steam_old_lib.hpp
Normal file
11
steam_old_lib/steam_old_lib/steam_old_lib.hpp
Normal file
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
namespace sold {
|
||||
|
||||
using steamclient_loader_t = void* (bool load);
|
||||
|
||||
void set_steamclient_loader(steamclient_loader_t *loader);
|
||||
void set_tid(unsigned long tid);
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user