Microsoft Usbccid Smartcard Reader -umdf 2- Driver -

void UsbCcidDevice::EvtIoDeviceControl(WDFQUEUE Queue, WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength, ULONG IoControlCode) WDFDEVICE device = WdfIoQueueGetDevice(Queue); UsbCcidDevice* context = GetDeviceContext(device); NTSTATUS status = STATUS_NOT_SUPPORTED;

WDF_USB_DEVICE_CREATE_CONFIG_INIT(&usbConfig, USBD_CLIENT_CONTRACT_VERSION_602); status = WdfUsbTargetDeviceCreateWithParameters(m_Device, &usbConfig, WDF_NO_OBJECT_ATTRIBUTES, &m_UsbDevice); if (!NT_SUCCESS(status)) return status;

return STATUS_SUCCESS;

[Standard.NTamd64] %DeviceDesc% = UsbCcidReader_Install, USB\VID_xxxx&PID_xxxx microsoft usbccid smartcard reader -umdf 2- driver

NTSTATUS UsbCcidDevice::ConfigureUsbTarget() WDF_USB_DEVICE_CREATE_CONFIG usbConfig; WDF_USB_DEVICE_SELECT_CONFIG_PARAMS configParams; NTSTATUS status;

WdfRequestComplete(Request, status); Build Command (Developer Command Prompt) msbuild UsbCcidReader.sln /p:Configuration=Release /p:Platform=x64 Test Signing signtool sign /v /fd SHA256 /a /csp "Microsoft Software Key Storage Provider" ^ /sha1 YOUR_CERT_THUMBPRINT /t http://timestamp.digicert.com ^ UsbCcidReader.dll 6. Deployment & Testing Install Driver pnputil /add-driver UsbCcidReader.inf /install Debug with WinDbg windbg -k net:port=50000,key=1.2.3.4 Set breakpoints:

// Set PnP callbacks WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpCallbacks); pnpCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware; pnpCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware; WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpCallbacks); void UsbCcidDevice::EvtIoDeviceControl(WDFQUEUE Queue

m_UsbInterface = configParams.Types.SingleInterface.ConfiguredUsbInterface;

BYTE apdu[] = 0x00, 0xA4, 0x04, 0x00, 0x08, 0xA0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00; BYTE response[260]; DWORD responseLen = sizeof(response);

switch (IoControlCode) case IOCTL_SMARTCARD_POWER: // Handle power control status = context->HandlePowerControl(Request); break; case IOCTL_SMARTCARD_TRANSMIT: // Handle APDU transmit status = context->HandleTransmit(Request); break; case IOCTL_SMARTCARD_GET_STATE: // Get slot status status = context->HandleGetStatus(Request); break; default: status = STATUS_INVALID_DEVICE_REQUEST; break; UsbCcidDevice* context = GetDeviceContext(device)

// Configure power management WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IdleCannotWakeFromS0); WdfDeviceAssignS0IdleSettings(device, &idleSettings);

[UsbCcidReader_Install.NT] CopyFiles=UMDFDriverCopyFiles

bp UsbCcidDevice::EvtIoDeviceControl bp UsbCcidDevice::Transmit // Test application SCARDCONTEXT hContext; SCARDHANDLE hCard; DWORD dwProtocol; SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext); SCardConnect(hContext, "Reader Name", SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard, &dwProtocol);

[UsbCcidReader_Install] UmdfLibraryVersion=2.0 UmdfKernelModeClientPolicy=AllowKernelModeClients