NTSTATUS Ds4_AddQueryInterfaces(WDFDEVICE Device) { NTSTATUS status; WDF_QUERY_INTERFACE_CONFIG ifaceCfg; INTERFACE devinterfaceHid; devinterfaceHid.Size = sizeof(INTERFACE); devinterfaceHid.Version = 1; devinterfaceHid.Context = (PVOID)Device; devinterfaceHid.InterfaceReference = WdfDeviceInterfaceReferenceNoOp; devinterfaceHid.InterfaceDereference = WdfDeviceInterfaceDereferenceNoOp; // Expose GUID_DEVINTERFACE_HID so HIDUSB can initialize WDF_QUERY_INTERFACE_CONFIG_INIT(&ifaceCfg, (PINTERFACE)&devinterfaceHid, &GUID_DEVINTERFACE_HID, NULL); status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { KdPrint(("WdfDeviceAddQueryInterface failed status 0x%x\n", status)); return status; } PDS4_DEVICE_DATA ds4Data = Ds4GetData(Device); // Set default HID input report (everything zero`d) UCHAR DefaultHidReport[DS4_HID_REPORT_SIZE] = { 0x01, 0x82, 0x7F, 0x7E, 0x80, 0x08, 0x00, 0x58, 0x00, 0x00, 0xFD, 0x63, 0x06, 0x03, 0x00, 0xFE, 0xFF, 0xFC, 0xFF, 0x79, 0xFD, 0x1B, 0x14, 0xD1, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 }; // Initialize HID reports to defaults RtlCopyBytes(ds4Data->HidInputReport, DefaultHidReport, DS4_HID_REPORT_SIZE); RtlZeroMemory(&ds4Data->OutputReport, sizeof(DS4_OUTPUT_REPORT)); // Start pending IRP queue flush timer WdfTimerStart(ds4Data->PendingUsbInRequestsTimer, DS4_QUEUE_FLUSH_PERIOD); return STATUS_SUCCESS; }
NTSTATUS SimTcDriverDeviceAdd ( WDFDRIVER Driver, PWDFDEVICE_INIT DeviceInit ) /*++ Routine Description: EvtDriverDeviceAdd is called by the framework in response to AddDevice call from the PnP manager. A WDF device object is created and initialized to represent a new instance of the battery device. Arguments: Driver - Supplies a handle to the WDF Driver object. DeviceInit - Supplies a pointer to a framework-allocated WDFDEVICE_INIT structure. Return Value: NTSTATUS --*/ { PFDO_DATA DevExt; WDF_OBJECT_ATTRIBUTES DeviceAttributes; WDFDEVICE DeviceHandle; WDF_QUERY_INTERFACE_CONFIG QueryInterfaceConfig; NTSTATUS Status; THERMAL_DEVICE_INTERFACE ThermalDeviceInterface; UNREFERENCED_PARAMETER(Driver); DebugEnter(); PAGED_CODE(); // // Initialize attributes and a context area for the device object. // WDF_OBJECT_ATTRIBUTES_INIT(&DeviceAttributes); WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&DeviceAttributes, FDO_DATA); // // Create a framework device object. This call will in turn create // a WDM device object, attach to the lower stack, and set the // appropriate flags and attributes. // Status = WdfDeviceCreate(&DeviceInit, &DeviceAttributes, &DeviceHandle); if (!NT_SUCCESS(Status)) { DebugPrint(SIMTC_ERROR, "WdfDeviceCreate() Failed. 0x%x\n", Status); goto DriverDeviceAddEnd; } // // Create a driver interface for this device to advertise the thermal // cooling interface. // RtlZeroMemory(&ThermalDeviceInterface, sizeof(ThermalDeviceInterface)); ThermalDeviceInterface.Size = sizeof(ThermalDeviceInterface); ThermalDeviceInterface.Version = 1; ThermalDeviceInterface.Context = DeviceHandle; ThermalDeviceInterface.InterfaceReference = WdfDeviceInterfaceReferenceNoOp; ThermalDeviceInterface.InterfaceDereference = WdfDeviceInterfaceDereferenceNoOp; ThermalDeviceInterface.Flags = ThermalDeviceFlagPassiveCooling | ThermalDeviceFlagActiveCooling; ThermalDeviceInterface.ActiveCooling = SimTcEngageActiveCooling; ThermalDeviceInterface.PassiveCooling = SimTcEngagePassiveCooling; WDF_QUERY_INTERFACE_CONFIG_INIT(&QueryInterfaceConfig, (PINTERFACE) &ThermalDeviceInterface, &GUID_THERMAL_COOLING_INTERFACE, NULL); Status = WdfDeviceAddQueryInterface(DeviceHandle, &QueryInterfaceConfig); if (!NT_SUCCESS(Status)) { DebugPrint(SIMTC_ERROR, "WdfDeviceAddQueryInterface() Failed. 0x%x\n", Status); goto DriverDeviceAddEnd; } // // Finish initializing the device context area. // DevExt = GetDeviceExtension(DeviceHandle); DevExt->ThermalLevel = 100UL; DevExt->ActiveCoolingEngaged = FALSE; DriverDeviceAddEnd: DebugExitStatus(Status); return Status; }
NTSTATUS TpmEvtDeviceAdd( IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit ) { NTSTATUS status = STATUS_SUCCESS; WDF_PNPPOWER_EVENT_CALLBACKS PnpPowerEventCallbacks; WDF_OBJECT_ATTRIBUTES DeviceAttributes; WDFDEVICE device; PTPM_CONTEXT TpmContext; WDF_IO_QUEUE_CONFIG IoQueueConfig; WDFQUEUE hQueue; WDF_QUERY_INTERFACE_CONFIG InterfaceConfig; TPM_INTERFACE_STANDARD TpmInterface; WDF_DEVICE_POWER_CAPABILITIES PowerCaps; PAGED_CODE(); UNREFERENCED_PARAMETER( Driver ); RtlZeroMemory(&PnpPowerEventCallbacks,sizeof(PnpPowerEventCallbacks)); RtlZeroMemory(&PowerCaps,sizeof(PowerCaps)); KdPrintEx((DPFLTR_PNPMEM_ID, DPFLTR_INFO_LEVEL, "TpmEvtDeviceAdd routine PDO: %p (%p)\n", WdfDriverWdmGetDriverObject(Driver))); // // Zero out the PnpPowerCallbacks structure. // WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&PnpPowerEventCallbacks); // // These two callbacks set up and tear down hardware state that must be // done every time the device moves in and out of the D0-working state. // PnpPowerEventCallbacks.EvtDeviceD0Entry = TpmEvtDeviceD0Entry; PnpPowerEventCallbacks.EvtDeviceD0Exit = TpmEvtDeviceD0Exit; // // Set Callbacks for any of the functions we are interested in. // If no callback is set, Framework will take the default action // by itself. // PnpPowerEventCallbacks.EvtDevicePrepareHardware = TpmEvtDevicePrepareHardware; PnpPowerEventCallbacks.EvtDeviceReleaseHardware = TpmEvtDeviceReleaseHardware; WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit,&PnpPowerEventCallbacks); // // Specify the context type and size for the device we are about to create. // RtlZeroMemory(&DeviceAttributes,sizeof(DeviceAttributes)); WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&DeviceAttributes, TPM_CONTEXT); DeviceAttributes.Size = sizeof(WDF_OBJECT_ATTRIBUTES); DeviceAttributes.SynchronizationScope = WdfSynchronizationScopeInheritFromParent; DeviceAttributes.ExecutionLevel = WdfExecutionLevelPassive; status = WdfDeviceCreate(&DeviceInit,&DeviceAttributes,&device); if(NT_SUCCESS(status)) { TpmContext = GetTpmContext(device); RtlZeroMemory(TpmContext,sizeof(TPM_CONTEXT)); TpmContext->Device = device; TpmContext->AccessRegister = FALSE; KeInitializeSpinLock(&TpmContext->SpinLock); TpmContext->TpmState = StSuspend; TpmInitStateTable(); KeInitializeEvent(&TpmContext->Event,NotificationEvent,TRUE); status = WdfDeviceCreateDeviceInterface(device,&GUID_DEVINTERFACE_TPM,NULL); if(NT_SUCCESS(status)) { WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE( &IoQueueConfig, WdfIoQueueDispatchParallel ); IoQueueConfig.EvtIoDeviceControl = TpmEvtIoDeviceControl; status = WdfIoQueueCreate( device, &IoQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &hQueue ); if(NT_SUCCESS(status)) { WDF_DEVICE_POWER_CAPABILITIES_INIT(&PowerCaps); WdfDeviceSetPowerCapabilities(device,&PowerCaps); // TpmGetRegistryFlags(device,TpmContext); // RtlZeroMemory(&TpmInterface,sizeof(TpmInterface)); TpmInterface.InterfaceHeader.Size = sizeof(TpmInterface); TpmInterface.InterfaceHeader.Version = 1; TpmInterface.InterfaceHeader.Context = (PVOID)TpmContext; TpmInterface.InterfaceHeader.InterfaceReference = WdfDeviceInterfaceReferenceNoOp; TpmInterface.InterfaceHeader.InterfaceDereference = WdfDeviceInterfaceDereferenceNoOp; TpmInterface.pfn_TpmSetMorBitState = TpmSetMorBitState; // // Initialize the InterfaceConfig structure. // WDF_QUERY_INTERFACE_CONFIG_INIT( &InterfaceConfig, (PINTERFACE)&TpmInterface, &GUID_TPM_INTERFACE_STANDARD, NULL ); // // Create the interface. // status = WdfDeviceAddQueryInterface( device, &InterfaceConfig ); if(!NT_SUCCESS(status)) { KdPrintEx((DPFLTR_PNPMEM_ID, DPFLTR_INFO_LEVEL, "WdfDeviceAddQueryInterface failed with NTSTATUS 0x%x\n",status)); } } else { KdPrintEx((DPFLTR_PNPMEM_ID, DPFLTR_INFO_LEVEL, "WdfIoQueueCreate failed with Status code 0x%x\n",status)); } } else { KdPrintEx((DPFLTR_PNPMEM_ID, DPFLTR_INFO_LEVEL, "WdfDeviceCreateDeviceInterface failed with Status code 0x%x\n",status)); } } else { KdPrintEx((DPFLTR_PNPMEM_ID, DPFLTR_INFO_LEVEL, "WdfDeviceCreate failed with Status code 0x%x\n",status)); } KdPrintEx((DPFLTR_PNPMEM_ID, DPFLTR_INFO_LEVEL, "TpmEvtDeviceAdd exited with Status code 0x%x\n",status)); return status; }