static VOID XenBus_EvtFileCleanup(WDFFILEOBJECT file_object) { PXENPCI_DEVICE_INTERFACE_DATA xpdid = GetXpdid(file_object); PXENPCI_DEVICE_DATA xpdd = GetXpdd(WdfFileObjectGetDevice(file_object)); watch_context_t *watch_context; KIRQL old_irql; PCHAR msg; FUNCTION_ENTER(); KeAcquireSpinLock(&xpdid->lock, &old_irql); while (!IsListEmpty(&xpdid->xenbus.watch_list_head)) { watch_context = (watch_context_t *)RemoveHeadList(&xpdid->xenbus.watch_list_head); KeReleaseSpinLock(&xpdid->lock, old_irql); msg = XenBus_RemWatch(xpdd, XBT_NIL, watch_context->path, XenPci_IoWatch, watch_context); if (msg != NULL) { KdPrint((__DRIVER_NAME " Error freeing watch (%s)\n", msg)); XenPci_FreeMem(msg); } ExFreePoolWithTag(watch_context, XENPCI_POOL_TAG); WdfObjectDereference(file_object); KeAcquireSpinLock(&xpdid->lock, &old_irql); } KeReleaseSpinLock(&xpdid->lock, old_irql); FUNCTION_EXIT(); }
VOID VIOSerialPortClose( IN WDFFILEOBJECT FileObject ) { PRAWPDO_VIOSERIAL_PORT pdoData = RawPdoSerialPortGetData( WdfFileObjectGetDevice(FileObject)); TraceEvents(TRACE_LEVEL_INFORMATION, DBG_CREATE_CLOSE, "--> %s\n", __FUNCTION__); if (!pdoData->port->Removed && pdoData->port->GuestConnected) { VIOSerialSendCtrlMsg(pdoData->port->BusDevice, pdoData->port->PortId, VIRTIO_CONSOLE_PORT_OPEN, 0); } pdoData->port->GuestConnected = FALSE; WdfSpinLockAcquire(pdoData->port->InBufLock); VIOSerialDiscardPortDataLocked(pdoData->port); WdfSpinLockRelease(pdoData->port->InBufLock); WdfSpinLockAcquire(pdoData->port->OutVqLock); VIOSerialReclaimConsumedBuffers(pdoData->port); WdfSpinLockRelease(pdoData->port->OutVqLock); TraceEvents(TRACE_LEVEL_INFORMATION, DBG_CREATE_CLOSE, "<-- %s\n", __FUNCTION__); }
VOID SerialEvtFileClose( IN WDFFILEOBJECT FileObject ) /*++ EvtFileClose is called when all the handles represented by the FileObject is closed and all the references to FileObject is removed. This callback may get called in an arbitrary thread context instead of the thread that called CloseHandle. If you want to delete any per FileObject context that must be done in the context of the user thread that made the Create call, you should do that in the EvtDeviceCleanp callback. Arguments: FileObject - Pointer to fileobject that represents the open handle. Return Value: VOID --*/ { PAGED_CODE(); SerialFileCloseWorker(WdfFileObjectGetDevice(FileObject)); return; }
VOID NfcCxSCPresentAbsentDispatcherRequestCanceled( _In_ WDFREQUEST Request ) /*++ Routine Description: Called when a pending request has been canceled. Arguments: Request - The request Return Value: NTSTATUS --*/ { TRACE_FUNCTION_ENTRY(LEVEL_VERBOSE); WDFFILEOBJECT fileObject = WdfRequestGetFileObject(Request); WDFDEVICE device = WdfFileObjectGetDevice(fileObject); PNFCCX_FILE_CONTEXT fileContext = NfcCxFileGetContext(fileObject); PNFCCX_FDO_CONTEXT fdoContext = NfcCxFdoGetContext(device); PNFCCX_SC_REQUEST_CONTEXT requestContext = NfcCxSCGetRequestContext(Request); PNFCCX_SC_PRESENT_ABSENT_DISPATCHER dispatcher = requestContext->Dispatcher; // Remove this request from the dispatcher void* previousRequest = InterlockedCompareExchangePointer((void**)&dispatcher->CurrentRequest, /*exchange*/ nullptr, /*compare*/ Request); // Check if another thread has already completed the request. if (previousRequest != Request) { // Request already completed by a different thread. // Nothing to do. goto Done; } // Release power reference (if required). if (dispatcher->PowerManaged) { NfcCxPowerFileRemoveReference(fdoContext->Power, fileContext, NfcCxPowerReferenceType_Proximity); } // Complete the request. TRACE_LINE(LEVEL_ERROR, "Smartcard Present/Absent request canceled. %!STATUS!", STATUS_CANCELLED); WdfRequestComplete(Request, STATUS_CANCELLED); Done: // Release the cancel callback's extra ref-count WdfObjectDereference(Request); TRACE_FUNCTION_EXIT(LEVEL_VERBOSE); }
VOID BalloonEvtFileClose ( IN WDFFILEOBJECT FileObject ) { PDEVICE_CONTEXT devCtx = GetDeviceContext( WdfFileObjectGetDevice(FileObject)); PAGED_CODE(); TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "<-> %s\n", __FUNCTION__); RtlFillMemory(devCtx->MemStats, sizeof(BALLOON_STAT) * VIRTIO_BALLOON_S_NR, -1); if (devCtx->StatVirtQueue) { BalloonMemStats(WdfFileObjectGetDevice(FileObject)); } }
/** * @brief handles operations that must be performed when all of an application's * accesses to a device have been closed. * * @param[in] FileObject The handle to the FileObject. */ VOID FdoEvtFileClose ( IN WDFFILEOBJECT FileObject) { PUSB_FDO_CONTEXT fdoContext = DeviceGetFdoContext(WdfFileObjectGetDevice(FileObject)); TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DEVICE, __FUNCTION__": %s Device %p\n", fdoContext->FrontEndPath, fdoContext->WdfDevice); }
NTSTATUS CUsbDkFilterDeviceInit::Configure(ULONG InstanceNumber) { PAGED_CODE(); WDF_OBJECT_ATTRIBUTES requestAttributes; WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&requestAttributes, WDF_REQUEST_CONTEXT); requestAttributes.ContextSizeOverride = CUsbDkFilterDevice::CStrategist::GetRequestContextSize(); SetRequestAttributes(requestAttributes); SetFilter(); CString DeviceName; auto status = DeviceName.Create(TEXT("\\Device\\UsbDkFilter"), InstanceNumber); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, TRACE_FILTERDEVICE, "%!FUNC! Failed to allocate filter device name (%!STATUS!)", status); return status; } status = SetName(*DeviceName); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, TRACE_FILTERDEVICE, "%!FUNC! SetName failed %!STATUS!", status); return status; } SetPowerCallbacks([](_In_ WDFDEVICE Device) { return Strategy(Device)->MakeAvailable(); }); SetIoInCallerContextCallback([](_In_ WDFDEVICE Device, WDFREQUEST Request) { return Strategy(Device)->IoInCallerContext(Device, Request); }); SetFileEventCallbacks(WDF_NO_EVENT_CALLBACK, [](_In_ WDFFILEOBJECT FileObject) { WDFDEVICE Device = WdfFileObjectGetDevice(FileObject); Strategy(Device)->OnClose(); }, WDF_NO_EVENT_CALLBACK); status = SetPreprocessCallback([](_In_ WDFDEVICE Device, _Inout_ PIRP Irp) { return Strategy(Device)->PNPPreProcess(Irp); }, IRP_MJ_PNP); return status; }
VOID NonPnpEvtFileClose ( IN WDFFILEOBJECT FileObject ) /*++ Routine Description: EvtFileClose is called when all the handles represented by the FileObject is closed and all the references to FileObject is removed. This callback may get called in an arbitrary thread context instead of the thread that called CloseHandle. If you want to delete any per FileObject context that must be done in the context of the user thread that made the Create call, you should do that in the EvtDeviceCleanp callback. Arguments: FileObject - Pointer to fileobject that represents the open handle. Return Value: VOID --*/ { PCONTROL_DEVICE_EXTENSION devExt; PAGED_CODE (); TraceEvents(TRACE_LEVEL_VERBOSE, DBG_INIT, "NonPnpEvtFileClose\n"); devExt = ControlGetData(WdfFileObjectGetDevice(FileObject)); if(devExt->FileHandle) { TraceEvents(TRACE_LEVEL_VERBOSE, DBG_INIT, "Closing File Handle %p", devExt->FileHandle); ZwClose(devExt->FileHandle); } return; }