refactor: Lazy load winscard
> still requires proper testing with hardware
This commit is contained in:
+4
-4
@@ -627,7 +627,7 @@ source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} PREFIX "Source Files" FILES ${SOUR
|
|||||||
set(RESOURCE_FILES build/manifest.manifest build/manifest.rc build/icon.rc cfg/Win32D.rc)
|
set(RESOURCE_FILES build/manifest.manifest build/manifest.rc build/icon.rc cfg/Win32D.rc)
|
||||||
add_executable(spicetools_spice ${SOURCE_FILES} ${RESOURCE_FILES})
|
add_executable(spicetools_spice ${SOURCE_FILES} ${RESOURCE_FILES})
|
||||||
target_link_libraries(spicetools_spice
|
target_link_libraries(spicetools_spice
|
||||||
PUBLIC d3d9 ws2_32 version comctl32 shlwapi iphlpapi hid secur32 setupapi psapi winmm winscard winhttp
|
PUBLIC d3d9 ws2_32 version comctl32 shlwapi iphlpapi hid secur32 setupapi psapi winmm winhttp
|
||||||
PRIVATE fmt-header-only discord-rpc imgui hash-library minhook imm32 dwmapi CpuFeatures::cpu_features)
|
PRIVATE fmt-header-only discord-rpc imgui hash-library minhook imm32 dwmapi CpuFeatures::cpu_features)
|
||||||
set_target_properties(spicetools_spice PROPERTIES PREFIX "")
|
set_target_properties(spicetools_spice PROPERTIES PREFIX "")
|
||||||
set_target_properties(spicetools_spice PROPERTIES OUTPUT_NAME "spice")
|
set_target_properties(spicetools_spice PROPERTIES OUTPUT_NAME "spice")
|
||||||
@@ -642,7 +642,7 @@ endif()
|
|||||||
set(RESOURCE_FILES build/manifest.manifest build/manifest.rc build/icon.rc cfg/Win32D.rc)
|
set(RESOURCE_FILES build/manifest.manifest build/manifest.rc build/icon.rc cfg/Win32D.rc)
|
||||||
add_executable(spicetools_spice_laa ${SOURCE_FILES} ${RESOURCE_FILES})
|
add_executable(spicetools_spice_laa ${SOURCE_FILES} ${RESOURCE_FILES})
|
||||||
target_link_libraries(spicetools_spice_laa
|
target_link_libraries(spicetools_spice_laa
|
||||||
PUBLIC d3d9 ws2_32 version comctl32 shlwapi iphlpapi hid secur32 setupapi psapi winmm winscard winhttp
|
PUBLIC d3d9 ws2_32 version comctl32 shlwapi iphlpapi hid secur32 setupapi psapi winmm winhttp
|
||||||
PRIVATE fmt-header-only discord-rpc imgui hash-library minhook imm32 dwmapi CpuFeatures::cpu_features)
|
PRIVATE fmt-header-only discord-rpc imgui hash-library minhook imm32 dwmapi CpuFeatures::cpu_features)
|
||||||
set_target_properties(spicetools_spice_laa PROPERTIES PREFIX "")
|
set_target_properties(spicetools_spice_laa PROPERTIES PREFIX "")
|
||||||
set_target_properties(spicetools_spice_laa PROPERTIES OUTPUT_NAME "spice_laa")
|
set_target_properties(spicetools_spice_laa PROPERTIES OUTPUT_NAME "spice_laa")
|
||||||
@@ -660,7 +660,7 @@ add_executable(spicetools_spice64 ${SOURCE_FILES} ${RESOURCE_FILES})
|
|||||||
|
|
||||||
# do NOT link against: mf, mfplat, mfreadwrite; otherwise unity games will break
|
# do NOT link against: mf, mfplat, mfreadwrite; otherwise unity games will break
|
||||||
target_link_libraries(spicetools_spice64
|
target_link_libraries(spicetools_spice64
|
||||||
PUBLIC d3d9 ws2_32 version comctl32 shlwapi iphlpapi hid secur32 setupapi psapi winmm winscard winhttp mfuuid strmiids dxva2
|
PUBLIC d3d9 ws2_32 version comctl32 shlwapi iphlpapi hid secur32 setupapi psapi winmm winhttp mfuuid strmiids dxva2
|
||||||
PRIVATE fmt-header-only discord-rpc imgui hash-library minhook imm32 dwmapi CpuFeatures::cpu_features)
|
PRIVATE fmt-header-only discord-rpc imgui hash-library minhook imm32 dwmapi CpuFeatures::cpu_features)
|
||||||
|
|
||||||
set_target_properties(spicetools_spice64 PROPERTIES PREFIX "")
|
set_target_properties(spicetools_spice64 PROPERTIES PREFIX "")
|
||||||
@@ -678,7 +678,7 @@ set(SOURCE_FILES ${SOURCE_FILES} launcher/options.h launcher/options.cpp)
|
|||||||
set(RESOURCE_FILES cfg/manifest.manifest cfg/manifest.rc cfg/icon.rc cfg/Win32D.rc)
|
set(RESOURCE_FILES cfg/manifest.manifest cfg/manifest.rc cfg/icon.rc cfg/Win32D.rc)
|
||||||
add_executable(spicetools_cfg WIN32 ${SOURCE_FILES} ${RESOURCE_FILES})
|
add_executable(spicetools_cfg WIN32 ${SOURCE_FILES} ${RESOURCE_FILES})
|
||||||
target_link_libraries(spicetools_cfg
|
target_link_libraries(spicetools_cfg
|
||||||
PUBLIC ws2_32 version comctl32 shlwapi iphlpapi hid secur32 setupapi psapi winmm winscard winhttp strmiids
|
PUBLIC ws2_32 version comctl32 shlwapi iphlpapi hid secur32 setupapi psapi winmm winhttp strmiids
|
||||||
PRIVATE fmt-header-only discord-rpc imgui hash-library minhook imm32 dwmapi CpuFeatures::cpu_features)
|
PRIVATE fmt-header-only discord-rpc imgui hash-library minhook imm32 dwmapi CpuFeatures::cpu_features)
|
||||||
set_target_properties(spicetools_cfg PROPERTIES PREFIX "")
|
set_target_properties(spicetools_cfg PROPERTIES PREFIX "")
|
||||||
set_target_properties(spicetools_cfg PROPERTIES OUTPUT_NAME "spicecfg")
|
set_target_properties(spicetools_cfg PROPERTIES OUTPUT_NAME "spicecfg")
|
||||||
|
|||||||
Vendored
+62
@@ -30,8 +30,65 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
#include "util/utils.h"
|
#include "util/utils.h"
|
||||||
#include "util/logging.h"
|
#include "util/logging.h"
|
||||||
|
#include "util/libutils.h"
|
||||||
#include "hooks/sleephook.h"
|
#include "hooks/sleephook.h"
|
||||||
|
|
||||||
|
//_INFO: Lazy load winscard, not tested on actual hardware
|
||||||
|
struct Winscard
|
||||||
|
{
|
||||||
|
|
||||||
|
decltype(&::SCardEstablishContext) SCardEstablishContext;
|
||||||
|
decltype(&::SCardListReadersA) SCardListReadersA;
|
||||||
|
decltype(&::SCardFreeMemory) SCardFreeMemory;
|
||||||
|
decltype(&::SCardGetStatusChangeA) SCardGetStatusChangeA;
|
||||||
|
decltype(&::SCardConnectA) SCardConnectA;
|
||||||
|
decltype(&::SCardTransmit) SCardTransmit;
|
||||||
|
decltype(&::SCardStatusA) SCardStatusA;
|
||||||
|
decltype(&::SCardDisconnect) SCardDisconnect;
|
||||||
|
decltype(::g_rgSCardT0Pci)* g_rgSCardT0Pci;
|
||||||
|
decltype(::g_rgSCardT1Pci)* g_rgSCardT1Pci;
|
||||||
|
inline static Winscard *instance = nullptr;
|
||||||
|
|
||||||
|
static HMODULE attach()
|
||||||
|
{
|
||||||
|
if (instance) return instance->lib_;
|
||||||
|
instance = new Winscard();
|
||||||
|
return instance->lib_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
HMODULE lib_;
|
||||||
|
|
||||||
|
Winscard()
|
||||||
|
{
|
||||||
|
#define GETPROC(name) (name) = reinterpret_cast<decltype(name)>(GetProcAddress(lib_, #name))
|
||||||
|
if ((lib_ = libutils::try_library("winscard.dll")))
|
||||||
|
{
|
||||||
|
GETPROC(SCardEstablishContext);
|
||||||
|
GETPROC(SCardListReadersA);
|
||||||
|
GETPROC(SCardFreeMemory);
|
||||||
|
GETPROC(SCardGetStatusChangeA);
|
||||||
|
GETPROC(SCardConnectA);
|
||||||
|
GETPROC(SCardTransmit);
|
||||||
|
GETPROC(SCardStatusA);
|
||||||
|
GETPROC(SCardDisconnect);
|
||||||
|
GETPROC(g_rgSCardT0Pci);
|
||||||
|
GETPROC(g_rgSCardT1Pci);
|
||||||
|
}
|
||||||
|
#undef GETPROC
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#define SCardEstablishContext Winscard::instance->SCardEstablishContext
|
||||||
|
#define SCardListReadersA Winscard::instance->SCardListReadersA
|
||||||
|
#define SCardFreeMemory Winscard::instance->SCardFreeMemory
|
||||||
|
#define SCardGetStatusChangeA Winscard::instance->SCardGetStatusChangeA
|
||||||
|
#define SCardConnectA Winscard::instance->SCardConnectA
|
||||||
|
#define SCardTransmit Winscard::instance->SCardTransmit
|
||||||
|
#define SCardStatusA Winscard::instance->SCardStatusA
|
||||||
|
#define SCardDisconnect Winscard::instance->SCardDisconnect
|
||||||
|
#define g_rgSCardT0Pci (*Winscard::instance->g_rgSCardT0Pci)
|
||||||
|
#define g_rgSCardT1Pci (*Winscard::instance->g_rgSCardT1Pci)
|
||||||
|
|
||||||
#define MAX_APDU_SIZE 255
|
#define MAX_APDU_SIZE 255
|
||||||
#define SCARD_POLL_INTERVAL_MS 100
|
#define SCARD_POLL_INTERVAL_MS 100
|
||||||
|
|
||||||
@@ -402,6 +459,11 @@ int scard_threadmain() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void scard_threadstart() {
|
void scard_threadstart() {
|
||||||
|
if(!Winscard::attach())
|
||||||
|
{
|
||||||
|
log_warning("scard", "Support disabled due to missing winscard.dll");
|
||||||
|
return;
|
||||||
|
}
|
||||||
std::thread t(scard_threadmain);
|
std::thread t(scard_threadmain);
|
||||||
t.detach();
|
t.detach();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user