// This static routine performs simulator initialization. The routine creates a // timer object that periodically updates the m_Index location NTSTATUS HardwareSimulator::Initialize( _In_ WDFDEVICE Device, // WDF device representing the sensor _Out_ WDFOBJECT *SimulatorInstance) // Instance of the WDF object for the simulator { PHardwareSimulator pSimulator = nullptr; NTSTATUS Status = STATUS_SUCCESS; WDF_OBJECT_ATTRIBUTES HardwareSimulatorAttributes = {}; SENSOR_FunctionEnter(); // Create WDFOBJECT for the hardware simulator WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&HardwareSimulatorAttributes, HardwareSimulator); HardwareSimulatorAttributes.ParentObject = Device; Status = WdfObjectCreate(&HardwareSimulatorAttributes, SimulatorInstance); if (!NT_SUCCESS(Status)) { TraceError("CSTM %!FUNC! WdfObjectCreate failed %!STATUS!", Status); goto Exit; } pSimulator = GetHardwareSimulatorContextFromInstance(*SimulatorInstance); if (nullptr == pSimulator) { Status = STATUS_INSUFFICIENT_RESOURCES; TraceError("CSTM %!FUNC! GetHardwareSimulatorContextFromInstance failed %!STATUS!", Status); goto Exit; } pSimulator->InitializeInternal(*SimulatorInstance); Exit: SENSOR_FunctionExit(Status); return Status; }
NTSTATUS BthEchoConnectionObjectCreate( _In_ PBTHECHOSAMPLE_DEVICE_CONTEXT_HEADER DevCtxHdr, _In_ WDFOBJECT ParentObject, _Out_ WDFOBJECT* ConnectionObject ) /*++ Description: This routine creates a connection object. This is called by client and server when a remote connection is made. Arguments: DevCtxHdr - Device context header ParentObject - Parent object for connection object ConnectionObject - receives the created connection object Return Value: NTSTATUS Status code. --*/ { NTSTATUS status; WDF_OBJECT_ATTRIBUTES attributes; WDFOBJECT connectionObject = NULL; WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, BTHECHO_CONNECTION); attributes.ParentObject = ParentObject; attributes.EvtCleanupCallback = BthEchoEvtConnectionObjectCleanup; // // We set execution level to passive so that we get cleanup at passive // level where we can wait for continuous readers to run down // and for completion of disconnect // attributes.ExecutionLevel = WdfExecutionLevelPassive; status = WdfObjectCreate( &attributes, &connectionObject ); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_CONNECT, "WdfObjectCreate for connection object failed, Status code %!STATUS!\n", status); goto exit; } status = BthEchoConnectionObjectInit(connectionObject, DevCtxHdr); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_CONNECT, "Context initialize for connection object failed, ConnectionObject 0x%p, Status code %!STATUS!\n", connectionObject, status ); goto exit; } *ConnectionObject = connectionObject; exit: if(!NT_SUCCESS(status) && connectionObject) { WdfObjectDelete(connectionObject); } return status; }