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;
// CCID Commands NTSTATUS PowerOn(_Out_ PBYTE Atr, _Out_ PDWORD AtrLength); NTSTATUS PowerOff(); NTSTATUS Transmit(_In_ PBYTE Command, _In_ DWORD CommandLen, _Out_ PBYTE Response, _Inout_ PDWORD ResponseLen); NTSTATUS GetSlotStatus(_Out_ PDWORD Status);
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); microsoft usbccid smartcard reader -umdf 2- driver
*Device = device; return STATUS_SUCCESS;
[Standard.NTamd64] %DeviceDesc% = UsbCcidReader_Install, USB\VID_xxxx&PID_xxxx status = WdfUsbTargetDeviceCreateWithParameters(m_Device
NTSTATUS UsbCcidDevice::ConfigureUsbTarget() WDF_USB_DEVICE_CREATE_CONFIG usbConfig; WDF_USB_DEVICE_SELECT_CONFIG_PARAMS configParams; NTSTATUS status;
// Callbacks static void EvtDevicePrepareHardware(_In_ WDFDEVICE Device, _In_ WDFCMRESLIST ResourceList); static void EvtDeviceReleaseHardware(_In_ WDFDEVICE Device, _In_ WDFCMRESLIST ResourceList); static void EvtIoDeviceControl(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t OutputBufferLength, _In_ size_t InputBufferLength, _In_ ULONG IoControlCode); private: WDFDEVICE m_Device; WDFUSBDEVICE m_UsbDevice; WDFUSBINTERFACE m_UsbInterface; WDFUSBPIPE m_BulkOutPipe; WDFUSBPIPE m_BulkInPipe; WDFUSBPIPE m_InterruptPipe; WDFQUEUE m_DefaultQueue; ; #include "Device.h" #include "trace.h" NTSTATUS UsbCcidDevice::Create(WDFDRIVER Driver, WDFDEVICE_INIT* DeviceInit, WDFDEVICE* Device) WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings; WDF_PNPPOWER_EVENT_CALLBACKS pnpCallbacks; WDF_IO_QUEUE_CONFIG queueConfig; WDF_OBJECT_ATTRIBUTES deviceAttributes; WDFDEVICE device; NTSTATUS status; if (!NT_SUCCESS(status)) return status
NTSTATUS UsbCcidDevice::Transmit(PBYTE Command, DWORD CommandLen, PBYTE Response, PDWORD ResponseLen) CCID_TRANSMIT transmitCmd = 0; transmitCmd.bMessageType = PC_to_RDR_XfrBlock; transmitCmd.dwLength = CommandLen; transmitCmd.bSlot = 0; transmitCmd.bSeq = 0; transmitCmd.bBWI = 0; transmitCmd.wLevelParameter = 0;
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:
[WudfServiceInstall] DisplayName=%ServiceDesc% ServiceType=1 StartType=3 ErrorControl=1 ServiceBinary=%12%\WUDFHost.exe
