refactor: Lazy load winscard
> still requires proper testing with hardware
This commit is contained in:
Vendored
+62
@@ -30,8 +30,65 @@
|
||||
#include <thread>
|
||||
#include "util/utils.h"
|
||||
#include "util/logging.h"
|
||||
#include "util/libutils.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 SCARD_POLL_INTERVAL_MS 100
|
||||
|
||||
@@ -402,6 +459,11 @@ int scard_threadmain() {
|
||||
}
|
||||
|
||||
void scard_threadstart() {
|
||||
if(!Winscard::attach())
|
||||
{
|
||||
log_warning("scard", "Support disabled due to missing winscard.dll");
|
||||
return;
|
||||
}
|
||||
std::thread t(scard_threadmain);
|
||||
t.detach();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user