minidriver:

* factorize the code from CardAuthenticatePIN into CardAuthenticateEx
* allows authentication with the PINPAD without a UI

minidriver: fix some code analysis warnings
This commit is contained in:
vletoux 2015-04-17 21:39:41 +02:00 committed by Viktor Tarasov
parent 8062eac145
commit ad47d4d043
2 changed files with 78 additions and 127 deletions

View File

@ -1511,8 +1511,8 @@ static int part10_build_modify_pin_block(struct sc_reader *reader, u8 * buf, siz
/* Ignore language and T=1 parameters. */
pin_modify->wLangId = HOST_TO_CCID_16(0x0000);
pin_modify->bMsgIndex1 = 0x00; /* Default message indexes */
pin_modify->bMsgIndex2 = 0x01;
pin_modify->bMsgIndex1 = (data->flags & SC_PIN_CMD_IMPLICIT_CHANGE ? 0x01: 0x00); /* Default message indexes */
pin_modify->bMsgIndex2 = (data->flags & SC_PIN_CMD_IMPLICIT_CHANGE ? 0x02: 0x01);
pin_modify->bMsgIndex3 = 0x02;
pin_modify->bTeoPrologue[0] = 0x00;
pin_modify->bTeoPrologue[1] = 0x00;

View File

@ -173,6 +173,7 @@ typedef struct _VENDOR_SPECIFIC
#define MD_STATIC_FLAG_CREATE_CONTAINER_KEY_IMPORT 32
#define MD_STATIC_FLAG_CREATE_CONTAINER_KEY_GEN 64
#define MD_STATIC_FLAG_IGNORE_PIN_LENGTH 128
#define MD_STATIC_FLAG_ALLOW_PINPAD_IF_SILENT_CONTEXT 256
#define MD_STATIC_PROCESS_ATTACHED 0xA11AC4EDL
struct md_opensc_static_data {
@ -205,7 +206,7 @@ static DWORD md_get_cardcf(PCARD_DATA pCardData, CARD_CACHE_FILE_FORMAT **out);
static DWORD md_pkcs15_delete_object(PCARD_DATA pCardData, struct sc_pkcs15_object *obj);
static DWORD md_fs_init(PCARD_DATA pCardData);
static void logprintf(PCARD_DATA pCardData, int level, const char* format, ...)
static void logprintf(PCARD_DATA pCardData, int level, _Printf_format_string_ const char* format, ...)
{
va_list arg;
VENDOR_SPECIFIC *vs;
@ -286,14 +287,14 @@ static void loghex(PCARD_DATA pCardData, int level, PBYTE data, int len)
logprintf(pCardData, level, " %04X %s\n", a, line);
}
static void print_werror(PCARD_DATA pCardData, char *str)
static void print_werror(PCARD_DATA pCardData, PSTR str)
{
void *buf;
FormatMessage(
FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(), 0, (LPTSTR) &buf, 0, NULL);
NULL, GetLastError(), 0, (LPSTR) &buf, 0, NULL);
logprintf(pCardData, 0, "%s%s\n", str, buf);
logprintf(pCardData, 0, "%s%s\n", str, (PSTR) buf);
LocalFree(buf);
}
@ -485,6 +486,13 @@ md_is_supports_container_key_import(PCARD_DATA pCardData)
return md_get_config_bool(pCardData, "md_supports_container_key_import", MD_STATIC_FLAG_CREATE_CONTAINER_KEY_IMPORT, TRUE);
}
/* Get know if the minidriver can request a pin from the pinpad if the minidriver can't display a UI - typically windows smart card logon*/
static BOOL
md_is_supports_use_pinpad_in_silent_context(PCARD_DATA pCardData)
{
logprintf(pCardData, 2, "Can the minidriver request a pin from the pinpad if the minidriver can't display a UI?\n");
return md_get_config_bool(pCardData, "md_supports_pinpad_in_silent_context", MD_STATIC_FLAG_ALLOW_PINPAD_IF_SILENT_CONTEXT, FALSE);
}
/* Check if specified PIN has been verified */
static BOOL
@ -1590,7 +1598,7 @@ md_create_context(PCARD_DATA pCardData, VENDOR_SPECIFIC *vs)
}
static DWORD
md_card_capabilities(PCARD_CAPABILITIES pCardCapabilities)
md_card_capabilities(PCARD_DATA pCardData, PCARD_CAPABILITIES pCardCapabilities)
{
if (!pCardCapabilities)
return SCARD_E_INVALID_PARAMETER;
@ -2092,12 +2100,12 @@ DWORD WINAPI CardDeleteContext(__inout PCARD_DATA pCardData)
}
DWORD WINAPI CardQueryCapabilities(__in PCARD_DATA pCardData,
__in PCARD_CAPABILITIES pCardCapabilities)
__inout PCARD_CAPABILITIES pCardCapabilities)
{
DWORD dwret;
logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData);
logprintf(pCardData, 1, "pCardCapabilities=%X\n", pCardCapabilities);
logprintf(pCardData, 1, "pCardCapabilities=%p\n", pCardCapabilities);
if (!pCardData || !pCardCapabilities)
return SCARD_E_INVALID_PARAMETER;
@ -2198,7 +2206,7 @@ typedef struct {
} PUBKEYSTRUCT_BASE;
DWORD WINAPI CardGetContainerInfo(__in PCARD_DATA pCardData, __in BYTE bContainerIndex, __in DWORD dwFlags,
__in PCONTAINER_INFO pContainerInfo)
__inout PCONTAINER_INFO pContainerInfo)
{
VENDOR_SPECIFIC *vs = NULL;
DWORD sz = 0;
@ -2347,82 +2355,27 @@ DWORD WINAPI CardGetContainerInfo(__in PCARD_DATA pCardData, __in BYTE bContaine
DWORD WINAPI CardAuthenticatePin(__in PCARD_DATA pCardData,
__in LPWSTR pwszUserId,
__in PBYTE pbPin,
__in_bcount(cbPin) PBYTE pbPin,
__in DWORD cbPin,
__out_opt PDWORD pcAttemptsRemaining)
{
struct sc_pkcs15_object *pin_obj = NULL;
struct sc_pkcs15_auth_info *auth_info = NULL;
char type[256];
VENDOR_SPECIFIC *vs;
struct md_file *cardcf_file = NULL;
CARD_CACHE_FILE_FORMAT *cardcf = NULL;
DWORD dwret;
int r;
if(!pCardData)
return SCARD_E_INVALID_PARAMETER;
vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific);
PIN_ID PinId = 0;
logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData);
logprintf(pCardData, 1, "CardAuthenticatePin '%S':%d\n", NULLWSTR(pwszUserId), cbPin);
check_reader_status(pCardData);
dwret = md_get_cardcf(pCardData, &cardcf);
if (dwret != SCARD_S_SUCCESS)
return dwret;
if (NULL == pwszUserId)
return SCARD_E_INVALID_PARAMETER;
if (wcscmp(wszCARD_USER_USER,pwszUserId) != 0 && wcscmp(wszCARD_USER_ADMIN,pwszUserId) != 0)
return SCARD_E_INVALID_PARAMETER;
if (!(vs->reader->capabilities & SC_READER_CAP_PIN_PAD) && NULL == pbPin)
return SCARD_E_INVALID_PARAMETER;
if (!(vs->reader->capabilities & SC_READER_CAP_PIN_PAD) && (cbPin < 4 || cbPin > 12))
return SCARD_W_WRONG_CHV;
if (wcscmp(wszCARD_USER_ADMIN, pwszUserId) == 0)
return SCARD_W_WRONG_CHV;
if(pcAttemptsRemaining)
(*pcAttemptsRemaining) = (DWORD) -1;
wcstombs(type, pwszUserId, 100);
type[10] = 0;
logprintf(pCardData, 1, "CardAuthenticatePin %.20s, %d, %d\n", NULLSTR(type),
cbPin, (pcAttemptsRemaining==NULL?-2:*pcAttemptsRemaining));
r = md_get_pin_by_role(pCardData, ROLE_USER, &pin_obj);
if (r != SCARD_S_SUCCESS) {
logprintf(pCardData, 2, "Cannot get User PIN object");
return r;
if (wcscmp(pwszUserId, wszCARD_USER_USER) == 0) {
PinId = ROLE_USER;
}
if (!pin_obj)
return SCARD_F_INTERNAL_ERROR;
auth_info = (struct sc_pkcs15_auth_info *)pin_obj->data;
r = sc_pkcs15_verify_pin(vs->p15card, pin_obj, (const u8 *) pbPin, cbPin);
if (r) {
logprintf(pCardData, 1, "PIN code verification failed: %s; tries left %i\n", sc_strerror(r), auth_info->tries_left);
if (r == SC_ERROR_AUTH_METHOD_BLOCKED)
return SCARD_W_CHV_BLOCKED;
if(pcAttemptsRemaining)
(*pcAttemptsRemaining) = auth_info->tries_left;
return SCARD_W_WRONG_CHV;
else if (wcscmp(pwszUserId, wszCARD_USER_ADMIN) == 0) {
PinId = ROLE_ADMIN;
}
else {
return SCARD_E_INVALID_PARAMETER;
}
if (pbPin == NULL)
return SCARD_E_INVALID_PARAMETER;
logprintf(pCardData, 3, "Pin code correct.\n");
SET_PIN(cardcf->bPinsFreshness, ROLE_USER);
logprintf(pCardData, 3, "PinsFreshness = %d\n", cardcf->bPinsFreshness);
return SCARD_S_SUCCESS;
return CardAuthenticateEx(pCardData, PinId, 0, pbPin, cbPin, NULL, NULL, pcAttemptsRemaining);
}
@ -2431,8 +2384,6 @@ DWORD WINAPI CardGetChallenge(__in PCARD_DATA pCardData,
__out PDWORD pcbChallengeData)
{
VENDOR_SPECIFIC *vs;
unsigned char *random = NULL;
size_t random_len;
int rv;
logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData);
@ -2444,7 +2395,7 @@ DWORD WINAPI CardGetChallenge(__in PCARD_DATA pCardData,
return SCARD_E_INVALID_PARAMETER;
logprintf(pCardData, 1, "Asked challenge length %i, buffer %p\n", *pcbChallengeData, *ppbChallengeData);
if (pcbChallengeData == 0) {
if (pcbChallengeData == NULL) {
*ppbChallengeData = NULL;
logprintf(pCardData, 7, "returns zero bytes\n");
@ -2455,29 +2406,20 @@ DWORD WINAPI CardGetChallenge(__in PCARD_DATA pCardData,
check_reader_status(pCardData);
random_len = (size_t)(*pcbChallengeData);
if(random_len < 8)
random_len = 8;
*pcbChallengeData = 0;
*pcbChallengeData = 8;
random = pCardData->pfnCspAlloc(random_len);
if (!random)
*ppbChallengeData = (PBYTE) pCardData->pfnCspAlloc(8);
if (!*ppbChallengeData)
return SCARD_E_NO_MEMORY;
rv = sc_get_challenge(vs->p15card->card, random, random_len);
rv = sc_get_challenge(vs->p15card->card, *ppbChallengeData, 8);
if (rv) {
logprintf(pCardData, 1, "Get challenge failed: %s\n", sc_strerror(rv));
pCardData->pfnCspFree(*ppbChallengeData);
*ppbChallengeData = NULL;
return SCARD_E_UNEXPECTED;
}
*ppbChallengeData = pCardData->pfnCspAlloc(random_len);
if(!*ppbChallengeData)
return SCARD_E_NO_MEMORY;
memcpy(*ppbChallengeData, random, random_len);
*pcbChallengeData = random_len;
pCardData->pfnCspFree(random);
logprintf(pCardData, 7, "returns %i bytes:\n", *pcbChallengeData);
loghex(pCardData, 7, *ppbChallengeData, *pcbChallengeData);
return SCARD_S_SUCCESS;
@ -2522,7 +2464,7 @@ DWORD WINAPI CardUnblockPin(__in PCARD_DATA pCardData,
if (wcscmp(wszCARD_USER_ADMIN, pwszUserId) == 0)
return SCARD_W_WRONG_CHV;
logprintf(pCardData, 1, "UserID('%s'), AuthData(%p, %li), NewPIN(%p, %li), Retry(%li), dwFlags(0x%lX)\n",
logprintf(pCardData, 1, "UserID('%S'), AuthData(%p, %u), NewPIN(%p, %u), Retry(%u), dwFlags(0x%X)\n",
pwszUserId, pbAuthenticationData, cbAuthenticationData, pbNewPinData, cbNewPinData,
cRetryCount, dwFlags);
@ -2602,7 +2544,7 @@ DWORD WINAPI CardChangeAuthenticator(__in PCARD_DATA pCardData,
if(pcAttemptsRemaining)
(*pcAttemptsRemaining) = 0;
logprintf(pCardData, 1, "UserID('%s'), CurrentPIN(%p, %li), NewPIN(%p, %li), Retry(%li), dwFlags(0x%lX)\n",
logprintf(pCardData, 1, "UserID('%S'), CurrentPIN(%p, %u), NewPIN(%p, %u), Retry(%u), dwFlags(0x%X)\n",
pwszUserId, pbCurrentAuthenticator, cbCurrentAuthenticator, pbNewAuthenticator, cbNewAuthenticator,
cRetryCount, dwFlags);
@ -2614,7 +2556,7 @@ DWORD WINAPI CardChangeAuthenticator(__in PCARD_DATA pCardData,
return SCARD_F_INTERNAL_ERROR;
if (dw_rv != SCARD_S_SUCCESS) {
logprintf(pCardData, 2, "Cannot get %s PIN by role", pwszUserId);
logprintf(pCardData, 2, "Cannot get %S PIN by role", pwszUserId);
return dw_rv;
}
if (!pin_obj)
@ -2624,7 +2566,7 @@ DWORD WINAPI CardChangeAuthenticator(__in PCARD_DATA pCardData,
pbCurrentAuthenticator, cbCurrentAuthenticator,
pbNewAuthenticator, cbNewAuthenticator);
if (rv) {
logprintf(pCardData, 2, "Failed to change %s PIN: '%s' (%i)\n", pwszUserId, sc_strerror(rv), rv);
logprintf(pCardData, 2, "Failed to change %S PIN: '%s' (%i)\n", pwszUserId, sc_strerror(rv), rv);
return SCARD_F_INTERNAL_ERROR;
}
@ -2692,7 +2634,7 @@ DWORD WINAPI CardDeleteDirectory(__in PCARD_DATA pCardData,
}
DWORD WINAPI CardCreateFile(__in PCARD_DATA pCardData,
__in LPSTR pszDirectoryName,
__in_opt LPSTR pszDirectoryName,
__in LPSTR pszFileName,
__in DWORD cbInitialCreationSize,
__in CARD_FILE_ACCESS_CONDITION AccessCondition)
@ -2719,10 +2661,10 @@ DWORD WINAPI CardCreateFile(__in PCARD_DATA pCardData,
DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData,
__in LPSTR pszDirectoryName,
__in_opt LPSTR pszDirectoryName,
__in LPSTR pszFileName,
__in DWORD dwFlags,
__deref_out_bcount(*pcbData) PBYTE *ppbData,
__deref_out_bcount_opt(*pcbData) PBYTE *ppbData,
__out PDWORD pcbData)
{
VENDOR_SPECIFIC *vs;
@ -2739,7 +2681,7 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData,
vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific);
logprintf(pCardData, 2, "pszDirectoryName = %s, pszFileName = %s, dwFlags = %X, pcbData=%d, *ppbData=%X\n",
logprintf(pCardData, 2, "pszDirectoryName = %s, pszFileName = %s, dwFlags = %X, pcbData=%u, *ppbData=%X\n",
NULLSTR(pszDirectoryName), NULLSTR(pszFileName), dwFlags, *pcbData, *ppbData);
if (!pszFileName || !strlen(pszFileName))
@ -2771,7 +2713,7 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData,
DWORD WINAPI CardWriteFile(__in PCARD_DATA pCardData,
__in LPSTR pszDirectoryName,
__in_opt LPSTR pszDirectoryName,
__in LPSTR pszFileName,
__in DWORD dwFlags,
__in_bcount(cbData) PBYTE pbData,
@ -2822,7 +2764,7 @@ DWORD WINAPI CardWriteFile(__in PCARD_DATA pCardData,
}
DWORD WINAPI CardDeleteFile(__in PCARD_DATA pCardData,
__in LPSTR pszDirectoryName,
__in_opt LPSTR pszDirectoryName,
__in LPSTR pszFileName,
__in DWORD dwFlags)
{
@ -2848,8 +2790,8 @@ DWORD WINAPI CardDeleteFile(__in PCARD_DATA pCardData,
DWORD WINAPI CardEnumFiles(__in PCARD_DATA pCardData,
__in LPSTR pszDirectoryName,
__out_ecount(*pdwcbFileName) LPSTR *pmszFileNames,
__in_opt LPSTR pszDirectoryName,
__deref_out_ecount(*pdwcbFileName) LPSTR *pmszFileNames,
__out LPDWORD pdwcbFileName,
__in DWORD dwFlags)
{
@ -2904,9 +2846,9 @@ DWORD WINAPI CardEnumFiles(__in PCARD_DATA pCardData,
DWORD WINAPI CardGetFileInfo(__in PCARD_DATA pCardData,
__in LPSTR pszDirectoryName,
__in_opt LPSTR pszDirectoryName,
__in LPSTR pszFileName,
__in PCARD_FILE_INFO pCardFileInfo)
__inout PCARD_FILE_INFO pCardFileInfo)
{
VENDOR_SPECIFIC *vs = NULL;
struct md_directory *dir = NULL;
@ -2932,7 +2874,7 @@ DWORD WINAPI CardGetFileInfo(__in PCARD_DATA pCardData,
DWORD WINAPI CardQueryFreeSpace(__in PCARD_DATA pCardData, __in DWORD dwFlags,
__in PCARD_FREE_SPACE_INFO pCardFreeSpaceInfo)
__inout PCARD_FREE_SPACE_INFO pCardFreeSpaceInfo)
{
VENDOR_SPECIFIC *vs;
DWORD dwret;
@ -2963,7 +2905,7 @@ DWORD WINAPI CardQueryFreeSpace(__in PCARD_DATA pCardData, __in DWORD dwFlags,
DWORD WINAPI CardQueryKeySizes(__in PCARD_DATA pCardData,
__in DWORD dwKeySpec,
__in DWORD dwFlags,
__out PCARD_KEY_SIZES pKeySizes)
__inout PCARD_KEY_SIZES pKeySizes)
{
DWORD dwret;
@ -3178,7 +3120,7 @@ DWORD WINAPI CardRSADecrypt(__in PCARD_DATA pCardData,
}
DWORD WINAPI CardSignData(__in PCARD_DATA pCardData, __in PCARD_SIGNING_INFO pInfo)
DWORD WINAPI CardSignData(__in PCARD_DATA pCardData, __inout PCARD_SIGNING_INFO pInfo)
{
VENDOR_SPECIFIC *vs;
ALG_ID hashAlg;
@ -3384,7 +3326,7 @@ DWORD WINAPI CardSignData(__in PCARD_DATA pCardData, __in PCARD_SIGNING_INFO pIn
}
DWORD WINAPI CardConstructDHAgreement(__in PCARD_DATA pCardData,
__in PCARD_DH_AGREEMENT_INFO pAgreementInfo)
__inout PCARD_DH_AGREEMENT_INFO pAgreementInfo)
{
logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData);
logprintf(pCardData, 1, "CardConstructDHAgreement - unsupported\n");
@ -3392,7 +3334,7 @@ DWORD WINAPI CardConstructDHAgreement(__in PCARD_DATA pCardData,
}
DWORD WINAPI CardDeriveKey(__in PCARD_DATA pCardData,
__in PCARD_DERIVE_KEY pAgreementInfo)
__inout PCARD_DERIVE_KEY pAgreementInfo)
{
logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData);
logprintf(pCardData, 1, "CardDeriveKey - unsupported\n");
@ -3432,9 +3374,9 @@ DWORD WINAPI CardGetChallengeEx(__in PCARD_DATA pCardData,
DWORD WINAPI CardAuthenticateEx(__in PCARD_DATA pCardData,
__in PIN_ID PinId,
__in DWORD dwFlags,
__in PBYTE pbPinData,
__in_bcount(cbPinData) PBYTE pbPinData,
__in DWORD cbPinData,
__deref_out_bcount_opt(*pcbSessionPin) PBYTE *ppbSessionPin,
__deref_opt_out_bcount(*pcbSessionPin) PBYTE *ppbSessionPin,
__out_opt PDWORD pcbSessionPin,
__out_opt PDWORD pcAttemptsRemaining)
{
@ -3444,6 +3386,7 @@ DWORD WINAPI CardAuthenticateEx(__in PCARD_DATA pCardData,
struct sc_pkcs15_object *pin_obj = NULL;
struct sc_pkcs15_auth_info *auth_info = NULL;
int r;
BOOL DisplayPinpadUI = TRUE;
logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData);
logprintf(pCardData, 1, "CardAuthenticateEx\n");
@ -3463,11 +3406,19 @@ DWORD WINAPI CardAuthenticateEx(__in PCARD_DATA pCardData,
return SCARD_E_UNSUPPORTED_FEATURE;
}
if (dwFlags && (dwFlags & CARD_PIN_SILENT_CONTEXT) && NULL == pbPinData)
if (dwFlags & ~(CARD_AUTHENTICATE_GENERATE_SESSION_PIN | CARD_AUTHENTICATE_SESSION_PIN | CARD_PIN_SILENT_CONTEXT))
return SCARD_E_INVALID_PARAMETER;
if (!(vs->reader->capabilities & SC_READER_CAP_PIN_PAD) && NULL == pbPinData)
return SCARD_E_INVALID_PARAMETER;
/* using a pin pad */
if (NULL == pbPinData) {
if (!(vs->reader->capabilities & SC_READER_CAP_PIN_PAD))
return SCARD_E_INVALID_PARAMETER;
if (dwFlags & CARD_PIN_SILENT_CONTEXT) {
if (!md_is_supports_use_pinpad_in_silent_context(pCardData))
return SCARD_E_UNSUPPORTED_FEATURE;
DisplayPinpadUI = FALSE;
}
}
if (PinId != ROLE_USER)
return SCARD_E_INVALID_PARAMETER;
@ -3486,9 +3437,9 @@ DWORD WINAPI CardAuthenticateEx(__in PCARD_DATA pCardData,
auth_info = (struct sc_pkcs15_auth_info *)pin_obj->data;
/* Do we need to display a prompt to enter PIN on pin pad? */
logprintf(pCardData, 7, "PIN pad=%s, pbPinData=%p, hwndParent=%d\n",
logprintf(pCardData, 7, "PIN pad=%s, pbPinData=%p, hwndParent=%p\n",
vs->reader->capabilities & SC_READER_CAP_PIN_PAD ? "yes" : "no", pbPinData, vs->hwndParent);
if ((vs->reader->capabilities & SC_READER_CAP_PIN_PAD) && NULL == pbPinData) {
if (DisplayPinpadUI && NULL == pbPinData) {
char buf[200];
if (NULL == vs->wszPinContext ) {
strcpy(buf, "Please enter PIN on reader pinpad.");
@ -3953,13 +3904,13 @@ DWORD WINAPI CardSetProperty(__in PCARD_DATA pCardData,
return SCARD_E_INVALID_PARAMETER;
vs->hwndParent = cp;
}
logprintf(pCardData, 3, "Saved parent window (%u)\n", vs->hwndParent);
logprintf(pCardData, 3, "Saved parent window (%p)\n", vs->hwndParent);
return SCARD_S_SUCCESS;
}
if (wcscmp(CP_PIN_CONTEXT_STRING, wszProperty) == 0) {
vs->wszPinContext = (LPWSTR) pbData;
logprintf(pCardData, 3, "Saved PIN context string: %S\n", pbData);
vs->wszPinContext = (PWSTR) pbData;
logprintf(pCardData, 3, "Saved PIN context string: %S\n", (PWSTR) pbData);
return SCARD_S_SUCCESS;
}
logprintf(pCardData, 3, "INVALID PARAMETER\n");
@ -4224,7 +4175,7 @@ DWORD WINAPI CardCreateContainerEx(
return CardCreateContainer(pCardData, bContainerIndex, dwFlags, dwKeySpec, dwKeySize, pbKeyData);
}
DWORD WINAPI CardAcquireContext(IN PCARD_DATA pCardData, __in DWORD dwFlags)
DWORD WINAPI CardAcquireContext(__inout PCARD_DATA pCardData, __in DWORD dwFlags)
{
VENDOR_SPECIFIC *vs;
DWORD dwret, suppliedVersion = 0;
@ -4510,7 +4461,7 @@ BOOL APIENTRY DllMain( HMODULE hModule,
break;
}
logprintf(NULL,8,"\n********** DllMain Module(handle:0x%X) '%s'; reason='%s'; Reserved=%p; P:%d; T:%d\n",
logprintf(NULL,8,"\n********** DllMain Module(handle:0x%p) '%s'; reason='%s'; Reserved=%p; P:%d; T:%d\n",
hModule, name, reason, lpReserved, GetCurrentProcessId(), GetCurrentThreadId());
#endif
switch (ul_reason_for_call)