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;
m_UsbInterface = configParams.Types.SingleInterface.ConfiguredUsbInterface;
UsbCcidDevice* context = GetDeviceContext(device); context->m_Device = device;
// Configure power management WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IdleCannotWakeFromS0); WdfDeviceAssignS0IdleSettings(device, &idleSettings);
[Standard.NTamd64] %DeviceDesc% = UsbCcidReader_Install, USB\VID_xxxx&PID_xxxx
[UsbCcidReader_Install] UmdfLibraryVersion=2.0 UmdfKernelModeClientPolicy=AllowKernelModeClients
// Set PnP callbacks WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpCallbacks); pnpCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware; pnpCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware; WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpCallbacks);
// 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);
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: