Skip to content

Instantly share code, notes, and snippets.

@typelogic
Created May 7, 2021 17:27
Show Gist options
  • Save typelogic/9af3c6d23627fbe2d787124a1561494f to your computer and use it in GitHub Desktop.
Save typelogic/9af3c6d23627fbe2d787124a1561494f to your computer and use it in GitHub Desktop.
#include <winscard.h>
#pragma comment(lib, "winscard.lib")
#include <iostream>
#include <map>
#include <vector>
#include <codecvt>
#include <algorithm>
std::string reader = "Identiv uTrust 4701 F CL Reader 0";
std::string wcs2s(const wchar_t* str)
{
const char *buf = (const char*)str;
std::string retstr;
int len = wcslen(str);
int acc = 0;
std::vector<int> indexes(len);
std::generate_n(indexes.data(), len,
[&acc,&retstr,&buf]() {
int curr = acc;
acc += 2;
//retstr.push_back(buf[q]); // also possible here
return curr;
}
);
for (auto i : indexes) retstr.push_back(buf[i]);
/*
std::for_each(indexes.begin(), indexes.end(),
[&retstr,&buf](int i) {
retstr.push_back(buf[i]);
}
);
std::string out;
std::transform(indexes.begin(), indexes.end(), std::back_inserter(out),
[&](int i) {
return buf[i]; // order is not guaranteed !?
}
);
std::string out2;
std::copy_n(indexes.begin(), n, std::back_inserter(out2));
*/
return retstr;
}
void madafaka()
{
const wchar_t *xxx = L"abcdef";
int len = wcslen(xxx);
len = strlen((const char*)xxx);
}
int main(int argc, char *argv[])
{
std::vector<LPTSTR> readers;
LPTSTR pmszReaders = NULL;
DWORD dwReaders;
SCARD_IO_REQUEST IO_Request;
SCARDCONTEXT ContextHandle; // Context
SCARDHANDLE CardHandle; // Handle of Reader
DWORD ActiveProtocol;
DWORD ret = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &ContextHandle);
dwReaders = SCARD_AUTOALLOCATE;
ret = SCardListReaders(ContextHandle, 0, (LPTSTR)&pmszReaders, &dwReaders);
switch (ret) {
case SCARD_S_SUCCESS:
LPTSTR pReader = pmszReaders;
while ('\0' != *pReader) {
readers.push_back(pReader);
pReader = pReader + wcslen((wchar_t *)pReader) + 1;
}
break;
}
int readerindex = -1;
int idx = 0;
for (auto r : readers) {
std::string rs = wcs2s(r);
if (reader.compare(rs) == 0) {
readerindex = idx;
break;
}
}
if (readerindex != -1) {
ret = SCardConnect(ContextHandle,
readers[readerindex],
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
&CardHandle,
&ActiveProtocol);
if (ret != SCARD_S_SUCCESS) {
std::cout << "error";
}
ret = SCardDisconnect(CardHandle, SCARD_LEAVE_CARD);
}
SCardFreeMemory(ContextHandle, pmszReaders);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment