//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- DtaGenlockClose -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. // void DtaGenlockClose(DtaDeviceData* pDvcData, DtFileObject* pFile) { if (pDvcData->m_Genlock.m_GenlArch != GENLOCK_ARCH_2154) return; if (pDvcData->m_Genlock.m_pVcxoOwner != DtFileGetHandle(pFile)) return; DtaGenlockResetVcxo(pDvcData); }
//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- DtaGenlockResetVcxo -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. // void DtaGenlockSetVcxo(DtaDeviceData* pDvcData, DtFileObject* pFile, Int VcxoValue) { Bool SetDevCtrl = (pDvcData->m_Genlock.m_VcxoValue == -1); pDvcData->m_Genlock.m_VcxoValue = VcxoValue; pDvcData->m_Genlock.m_pVcxoOwner = DtFileGetHandle(pFile); DtaLmh1983SetVcxoValue(&pDvcData->m_Genlock.m_Lmh1983, pDvcData->m_Genlock.m_VcxoValue); if (SetDevCtrl) DtaLmh1983SetDevCtrl(&pDvcData->m_Genlock.m_Lmh1983); }
//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- DtaEventsDequeue -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- // DtStatus DtaEventsDequeue( DtaDeviceData* pDvcData, DtFileObject* pFile, DtaEvents* pEvents) // If not NULL, we don't need the file object { WDF_REQUEST_PARAMETERS Params; WDFREQUEST Request; WDFREQUEST Request2; NTSTATUS NtStatus = STATUS_SUCCESS; size_t BufSize; DtaIoctlOutputData* pOutBuf; // Get all pending requests from queue for this file object while (NtStatus == STATUS_SUCCESS) { WDF_REQUEST_PARAMETERS_INIT(&Params); NtStatus = WdfIoQueueFindRequest(pDvcData->m_IalData.m_EventQueue, NULL, DtFileGetHandle(pFile), &Params, &Request); if (NtStatus != STATUS_SUCCESS) // Don't use the NT_SUCCESS macro here break; NtStatus = WdfIoQueueRetrieveFoundRequest(pDvcData->m_IalData.m_EventQueue, Request, &Request2); WdfObjectDereference(Request); if (!NT_SUCCESS(NtStatus)) continue; if (NT_SUCCESS(NtStatus)) { NtStatus = WdfRequestRetrieveOutputBuffer(Request2, Params.Parameters.DeviceIoControl.OutputBufferLength, &pOutBuf, &BufSize); } if (NT_SUCCESS(NtStatus)) { DtStatus Status; BufSize = sizeof(DtaIoctlGetEventOutput); Status = DtaEventsGet(pDvcData, pFile, pEvents, &pOutBuf->m_GetEvent.m_EventType, &pOutBuf->m_GetEvent.m_Value1, &pOutBuf->m_GetEvent.m_Value2); } if (!NT_SUCCESS(NtStatus)) BufSize = 0; // Complete request, use DtStatus in the driver-defined information field WdfRequestCompleteWithInformation(Request2, NtStatus, (ULONG_PTR)BufSize); } return DT_STATUS_OK; }