📄 cameradevice.cpp
字号:
LPVOID
CCameraDevice::ValidateBuffer(
LPVOID lpBuff,
ULONG ulActualBufLen,
ULONG ulExpectedBuffLen,
DWORD * dwError
)
{
if ( NULL == lpBuff )
{
*dwError = ERROR_INSUFFICIENT_BUFFER;
return NULL;
}
if ( ulActualBufLen < ulExpectedBuffLen )
{
DEBUGMSG( ZONE_IOCTL|ZONE_ERROR, (_T("IOControl(%08x): buffer is not large enough\r\n"), this ) );
*dwError = ERROR_INSUFFICIENT_BUFFER;
return NULL;
}
//If the size is good, just return the buffer passed in
return lpBuff;
}
DWORD
CCameraDevice::AdapterHandleVersion(
PUCHAR pOutBuf,
DWORD OutBufLen,
PDWORD pdwBytesTransferred
)
{
if( OutBufLen < sizeof( DWORD ))
{
return ERROR_INSUFFICIENT_BUFFER;
}
*pdwBytesTransferred = sizeof( DWORD );
if( !CeSafeCopyMemory( pOutBuf, &m_dwVersion, sizeof( DWORD )))
{
return ERROR_INVALID_USER_BUFFER;
}
return ERROR_SUCCESS;
}
DWORD
CCameraDevice::AdapterHandlePinRequests(
PUCHAR pInBuf,
DWORD InBufLen,
PUCHAR pOutBuf,
DWORD OutBufLen,
PDWORD pdwBytesTransferred
)
{
DEBUGMSG( ZONE_IOCTL, ( _T("CAM_IOControl(%08x): HandlePinRequests\r\n"), this ) );
DWORD dwError = ERROR_INVALID_PARAMETER;
PCSP_PIN pCsPin = NULL;
PCS_DATARANGE_VIDEO pCsDataRangeVideo = NULL;
PCSMULTIPLE_ITEM pCsMultipleItem = NULL;
PCS_DATAFORMAT_VIDEOINFOHEADER pCsDataFormatVih = NULL;
PCSPIN_CINSTANCES pCsPinCinstances = NULL;
CSPROPERTY csProp = {0};
LONG lPinId = 0;
if( !CeSafeCopyMemory( &csProp, pInBuf, sizeof( CSPROPERTY )))
{
return dwError;
}
*pdwBytesTransferred = 0;
// we support PROPSETID_Pin, so just return success
if ( CSPROPERTY_TYPE_SETSUPPORT == csProp.Flags )
{
return ERROR_SUCCESS;
}
// we are here so the request is not SETSUPPORT and after this only GET requests will be entertained since
// PROPSETID_Pin contains READ-ONLY properties
if ( CSPROPERTY_TYPE_GET != csProp.Flags )
{
return dwError;
}
switch( csProp.Id )
{
case CSPROPERTY_PIN_CTYPES:
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): CSPROPERTY_PIN_CTYPES\r\n"), this ) );
*pdwBytesTransferred = sizeof(ULONG);
EnterCriticalSection( &m_csDevice );
if( OutBufLen < sizeof( ULONG ))
{
dwError = ERROR_MORE_DATA;
break;
}
if( !CeSafeCopyMemory( pOutBuf, &(m_AdapterInfo.ulCTypes), sizeof (ULONG) ))
{
dwError = ERROR_INVALID_PARAMETER;
break;
}
LeaveCriticalSection( &m_csDevice );
dwError = ERROR_SUCCESS;
break;
}
case CSPROPERTY_PIN_CINSTANCES:
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): CSPROPERTY_PIN_CINSTANCES\r\n"), this ) );
if ( NULL == ( pCsPin = reinterpret_cast<PCSP_PIN>( ValidateBuffer( pInBuf, InBufLen, sizeof (CSP_PIN), &dwError ) ) ) )
{
break;
}
lPinId = pCsPin->PinId;
if ( false == IsValidPin( lPinId ))
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid PinId\r\n"), this ) );
break;
}
*pdwBytesTransferred = sizeof (CSPIN_CINSTANCES);
if ( NULL == ( pCsPinCinstances = reinterpret_cast<PCSPIN_CINSTANCES>( ValidateBuffer( pOutBuf, OutBufLen, sizeof (CSPIN_CINSTANCES), &dwError ) ) ) )
{
dwError = ERROR_MORE_DATA;
break;
}
pCsPinCinstances->PossibleCount = m_pStrmInstances[lPinId].ulPossibleCount;
pCsPinCinstances->CurrentCount = m_pStrmInstances[lPinId].ulCInstances;
dwError = ERROR_SUCCESS;
break;
}
case CSPROPERTY_PIN_DATARANGES:
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): CSPROPERTY_PIN_DATARANGES\r\n"), this ) );
if( NULL == ( pCsPin = reinterpret_cast<PCSP_PIN>( ValidateBuffer( pInBuf, InBufLen, sizeof (CSP_PIN), &dwError ) ) ) )
{
break;
}
lPinId = pCsPin->PinId;
if ( false == IsValidPin( lPinId ) )
{
DEBUGMSG(ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid PinId\r\n"), this ) );
break;
}
*pdwBytesTransferred = sizeof(CSMULTIPLE_ITEM) + ( m_pStrmInstances[lPinId].pVideoFormat->ulAvailFormats * sizeof (CS_DATARANGE_VIDEO) );
if ( NULL == ( pCsMultipleItem = reinterpret_cast<PCSMULTIPLE_ITEM>( ValidateBuffer( pOutBuf, OutBufLen, *pdwBytesTransferred, &dwError ) ) ) )
{
dwError = ERROR_MORE_DATA ;
break ;
}
pCsMultipleItem->Count = m_pStrmInstances[lPinId].pVideoFormat->ulAvailFormats;
pCsMultipleItem->Size = *pdwBytesTransferred;
pCsDataRangeVideo = NULL;
pCsDataRangeVideo = reinterpret_cast<PCS_DATARANGE_VIDEO>( pCsMultipleItem + 1 );
for ( int iCount = 0 ; iCount < static_cast<int>( m_pStrmInstances[lPinId].pVideoFormat->ulAvailFormats ); iCount++ )
{
memcpy( pCsDataRangeVideo, m_pStrmInstances[lPinId].pVideoFormat->pCsDataRangeVideo[iCount], sizeof (CS_DATARANGE_VIDEO) );
pCsDataRangeVideo = reinterpret_cast<PCS_DATARANGE_VIDEO>( pCsDataRangeVideo + 1 );
}
dwError = ERROR_SUCCESS;
break;
}
case CSPROPERTY_PIN_DATAINTERSECTION:
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): CSPROPERTY_PIN_DATAINTERSECTION\r\n"), this ) );
if ( NULL == ( pCsPin = reinterpret_cast<PCSP_PIN>( ValidateBuffer( pInBuf, InBufLen, sizeof (CSP_PIN), &dwError ) ) ) )
{
break;
}
lPinId = pCsPin->PinId;
if ( false == IsValidPin( lPinId ) )
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid PinId\r\n"), this ) );
break;
}
pCsMultipleItem = NULL;
pCsMultipleItem = reinterpret_cast<PCSMULTIPLE_ITEM>( pCsPin + 1 );
if ( NULL == ValidateBuffer( pInBuf, InBufLen, ( sizeof (CSP_PIN) + (pCsMultipleItem->Count * pCsMultipleItem->Size ) ), &dwError ) )
{
break;
}
{
*pdwBytesTransferred = sizeof(CS_DATAFORMAT_VIDEOINFOHEADER);
}
if( NULL == ( pCsDataFormatVih = reinterpret_cast<PCS_DATAFORMAT_VIDEOINFOHEADER>( ValidateBuffer( pOutBuf, OutBufLen, *pdwBytesTransferred, &dwError ) ) ) )
{
dwError = ERROR_MORE_DATA;
break;
}
pCsDataRangeVideo = NULL;
pCsDataRangeVideo = reinterpret_cast<PCS_DATARANGE_VIDEO>( pCsMultipleItem + 1 );
{
for ( int iCount = 0 ; iCount < (int)pCsMultipleItem->Count ; iCount++ )
{
// First check whether the GUIDs match or not. This driver also tests other high level attributes of KS_DATARANGE_VIDEO
if ( true == AdapterCompareFormat( lPinId, pCsDataRangeVideo, NULL, true) )
{
// We found our format
memcpy(&pCsDataFormatVih->DataFormat,&pCsDataRangeVideo->DataRange, sizeof(CSDATAFORMAT) ) ;
memcpy(&pCsDataFormatVih->VideoInfoHeader,&pCsDataRangeVideo->VideoInfoHeader, sizeof(CS_VIDEOINFOHEADER) ) ;
dwError = ERROR_SUCCESS ;
break ;
}
pCsDataRangeVideo = reinterpret_cast<PCS_DATARANGE_VIDEO>(pCsDataRangeVideo + 1) ;
}
}
break;
}
case CSPROPERTY_PIN_CATEGORY:
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): CSPROPERTY_PIN_CATEGORY\r\n"), this ) );
if ( NULL == ( pCsPin = reinterpret_cast<PCSP_PIN>( ValidateBuffer( pInBuf, InBufLen, sizeof (CSP_PIN), &dwError ) ) ) )
{
break;
}
lPinId = pCsPin->PinId;
if ( false == IsValidPin( lPinId ) )
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid PinId\r\n"), this ) );
break;
}
*pdwBytesTransferred = sizeof( GUID );
if( OutBufLen < *pdwBytesTransferred )
{
dwError = ERROR_MORE_DATA;
break;
}
if ( CeSafeCopyMemory( pOutBuf, &(m_pStrmInstances[lPinId].pVideoFormat->categoryGUID), sizeof( GUID ) ))
{
dwError = ERROR_SUCCESS;
}
break;
}
case CSPROPERTY_PIN_NAME:
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Property CSPROPERTY_PIN_NAME\r\n"), this ) );
if ( NULL == ( pCsPin = reinterpret_cast<PCSP_PIN>( ValidateBuffer( pInBuf, InBufLen, sizeof(CSP_PIN), &dwError ) ) ) )
{
break;
}
lPinId = pCsPin->PinId;
if ( false == IsValidPin( lPinId ) )
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid PinId\r\n"), this ) );
break;
}
*pdwBytesTransferred = ( wcslen(g_wszPinNames[lPinId] ) + 1 ) * sizeof( g_wszPinNames[0][0] );
if( OutBufLen < *pdwBytesTransferred )
{
dwError = ERROR_MORE_DATA;
break;
}
if( CeSafeCopyMemory( pOutBuf, g_wszPinNames[lPinId], *pdwBytesTransferred ))
{
dwError = ERROR_SUCCESS;
}
break;
}
case CSPROPERTY_PIN_DEVICENAME:
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Property CSPROPERTY_PIN_NAME\r\n"), this ) );
if ( NULL == ( pCsPin = reinterpret_cast<PCSP_PIN>( ValidateBuffer( pInBuf, InBufLen, sizeof(CSP_PIN), &dwError ) ) ) )
{
break;
}
lPinId = pCsPin->PinId;
if ( false == IsValidPin( lPinId ) )
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid PinId\r\n"), this ) );
break;
}
*pdwBytesTransferred = ( wcslen( g_wszPinDeviceNames[lPinId] ) + 1 ) * sizeof( g_wszPinDeviceNames[0][0] ) ;
if( OutBufLen < *pdwBytesTransferred )
{
dwError = ERROR_MORE_DATA;
break;
}
if( CeSafeCopyMemory( pOutBuf, g_wszPinDeviceNames[lPinId], *pdwBytesTransferred ))
{
dwError = ERROR_SUCCESS;
}
break;
}
default:
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid Property\r\n"), this ) );
break;
}
}
return dwError;
}
DWORD
CCameraDevice::AdapterHandleVidProcAmpRequests(
PUCHAR pInBuf, // Warning: This is an unsafe buffer, access with care
DWORD InBufLen,
PUCHAR pOutBuf, // Warning: This is an unsafe buffer, access with care
DWORD OutBufLen,
PDWORD pdwBytesTransferred // Warning: This is an unsafe buffer, access with care
)
{
// Note: This whole function is wrapped in a __try/__except block
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): HandleVidProcAmpRequests\r\n"), this ) );
DWORD dwError = ERROR_INVALID_PARAMETER;
LONG lValue = 0;
LONG lFlags = 0;
PSENSOR_PROPERTY pSensorProp = NULL;
PCSPROPERTY_VIDEOPROCAMP_S pCsPropVidProcAmpOutput = NULL;
PCSPROPERTY_VIDEOPROCAMP_S pCsPropVidProcAmpInput = NULL;
PCSPROPERTY_DESCRIPTION pCsPropDesc = NULL;
PCSPROPERTY_VALUES pCsPropValues = NULL;
CSPROPERTY csProp = {0};
if( !CeSafeCopyMemory( &csProp, pInBuf, sizeof( CSPROPERTY )))
{
return dwError;
}
*pdwBytesTransferred = 0;
// we support PROPSETID_Pin, so just return success
if ( CSPROPERTY_TYPE_SETSUPPORT == csProp.Flags )
{
return ERROR_SUCCESS;
}
if ( csProp.Id < CSPROPERTY_VIDEOPROCAMP_BRIGHTNESS || csProp.Id > ENUM_GAIN )
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid Property\r\n"), this ) );
return dwError;
}
if ( ERROR_SUCCESS != m_PDDFuncTbl.PDD_GetAdapterInfo( m_PDDContext, &m_AdapterInfo ) )
{
return dwError;
}
pSensorProp = m_AdapterInfo.SensorProps + csProp.Id;
switch( csProp.Flags )
{
case CSPROPERTY_TYPE_GET:
if ( FALSE == pSensorProp->fGetSupported )
{
SetLastError(ERROR_INVALID_OPERATION);
break;
}
*pdwBytesTransferred = sizeof(CSPROPERTY_VIDEOPROCAMP_S);
if ( NULL == ( pCsPropVidProcAmpInput = reinterpret_cast<PCSPROPERTY_VIDEOPROCAMP_S>( ValidateBuffer( pInBuf, InBufLen, sizeof (CSPROPERTY_VIDEOPROCAMP_S), &dwError ) ) ) )
{
return dwError;
}
if( NULL == ( pCsPropVidProcAmpOutput = reinterpret_cast<PCSPROPERTY_VIDEOPROCAMP_S>( ValidateBuffer( pOutBuf, OutBufLen, *pdwBytesTransferred, &dwError ) ) ) )
{
dwError = ERROR_MORE_DATA;
break;
}
//Copy the CSPROPERTY structure to the output buffer just in case!
memcpy( pCsPropVidProcAmpOutput, pCsPropVidProcAmpInput, sizeof(CSPROPERTY) );
pCsPropVidProcAmpOutput->Value = pSensorProp->ulCurrentValue;
pCsPropVidProcAmpOutput->Flags = pSensorProp->ulFlags;
pCsPropVidProcAmpOutput->Capabilities = pSensorProp->ulCapabilities;
dwError = ERROR_SUCCESS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -