You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.4 KiB
112 lines
2.4 KiB
#include <windows.h>
|
|
#include <wincrypt.h>
|
|
#include <winscard.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include "pinlib.h"
|
|
|
|
#define TEST_CASE(X) { if (ERROR_SUCCESS != (dwSts = X)) { printf("%s", #X); goto Ret; } }
|
|
|
|
#define CAPI_TEST_CASE(X) { if (! X) { dwSts = GetLastError(); printf("%s", #X); goto Ret; } }
|
|
|
|
//
|
|
// Function: CspAllocH
|
|
//
|
|
LPVOID WINAPI CspAllocH(
|
|
IN SIZE_T cBytes)
|
|
{
|
|
return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cBytes);
|
|
}
|
|
|
|
//
|
|
// Function: CspFreeH
|
|
//
|
|
void WINAPI CspFreeH(
|
|
IN LPVOID pMem)
|
|
{
|
|
HeapFree(GetProcessHeap(), 0, pMem);
|
|
}
|
|
|
|
//
|
|
// Function: PrintBytes
|
|
//
|
|
#define CROW 8
|
|
void PrintBytes(LPSTR pszHdr, BYTE *pb, DWORD cbSize)
|
|
{
|
|
ULONG cb, i;
|
|
CHAR rgsz[1024];
|
|
|
|
printf("\n %s, %d bytes ::\n", pszHdr, cbSize);
|
|
|
|
while (cbSize > 0)
|
|
{
|
|
// Start every row with an extra space
|
|
printf(" ");
|
|
|
|
cb = min(CROW, cbSize);
|
|
cbSize -= cb;
|
|
for (i = 0; i < cb; i++)
|
|
printf(" %02x", pb[i]);
|
|
for (i = cb; i < CROW; i++)
|
|
printf(" ");
|
|
printf(" '");
|
|
for (i = 0; i < cb; i++)
|
|
{
|
|
if (pb[i] >= 0x20 && pb[i] <= 0x7f)
|
|
printf("%c", pb[i]);
|
|
else
|
|
printf(".");
|
|
}
|
|
printf("\n");
|
|
pb += cb;
|
|
}
|
|
}
|
|
|
|
DWORD WINAPI MyVerifyPin(
|
|
IN PPINCACHE_PINS pPins,
|
|
IN PVOID pvCallbackCtx)
|
|
{
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
int _cdecl main(int argc, char * argv[])
|
|
{
|
|
DWORD dwSts = ERROR_SUCCESS;
|
|
PIN_SHOW_GET_PIN_UI_INFO PinUIInfo;
|
|
HMODULE hCspMod = 0;
|
|
|
|
hCspMod = LoadLibrary(L"basecsp.dll");
|
|
|
|
if (0 == hCspMod || INVALID_HANDLE_VALUE == hCspMod)
|
|
{
|
|
dwSts = GetLastError();
|
|
goto Ret;
|
|
}
|
|
|
|
memset(&PinUIInfo, 0, sizeof(PinUIInfo));
|
|
|
|
PinUIInfo.wszCardName = L"My Card";
|
|
PinUIInfo.wszPrincipal = L"User";
|
|
PinUIInfo.pfnVerify = MyVerifyPin;
|
|
PinUIInfo.pvCallbackContext = (PVOID) 0xdaad;
|
|
PinUIInfo.hDlgResourceModule = hCspMod;
|
|
|
|
dwSts = PinShowGetPinUI(
|
|
&PinUIInfo);
|
|
|
|
Ret:
|
|
|
|
if (ERROR_SUCCESS != dwSts)
|
|
printf(" failed, 0x%x\n", dwSts);
|
|
else
|
|
printf("Success.\n");
|
|
|
|
if (hCspMod)
|
|
FreeLibrary(hCspMod);
|
|
if (PinUIInfo.pbPin)
|
|
CspFreeH(PinUIInfo.pbPin);
|
|
|
|
return 0;
|
|
}
|
|
|