亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pindevice.cpp.svn-base

?? PXA270 平臺 Windows Mobile 5 攝像頭驅動
?? SVN-BASE
?? 第 1 頁 / 共 3 頁
字號:
        m_pStreamDescriptorList[ m_dwBufferCount ].pCsStreamDescriptorExternal = NULL;
        m_pStreamDescriptorList[ m_dwBufferCount ].m_fBusy = TRUE;
        m_dwBufferCount++;
    }
    else if( GetCurrentMemoryModel() == CSPROPERTY_BUFFER_CLIENT_LIMITED )
    {
        // The software is allocated by the software, let's copy the descriptor and generate a handle
        ASSERT( m_pStreamDescriptorList[ m_dwBufferCount ].m_fBusy == FALSE );

        if( !CeSafeCopyMemory( &( m_pStreamDescriptorList[ m_dwBufferCount ].csStreamDescriptorShadow ), pOutBuf, sizeof( CS_STREAM_DESCRIPTOR )))
        {
            dwError = ERROR_INVALID_PARAMETER;
            goto Cleanup;
        }

        // Let's populate the handle and the buffer field.
        dwError = SwSetupStreamDescriptor( m_dwBufferCount, &( m_pStreamDescriptorList[ m_dwBufferCount ].csStreamDescriptorShadow ), pOutBuf );
        if( dwError != ERROR_SUCCESS )
        {
            goto Cleanup;
        }

        m_pStreamDescriptorList[ m_dwBufferCount ].pCsStreamDescriptorExternal = NULL;
        m_pStreamDescriptorList[ m_dwBufferCount ].m_fBusy = TRUE;
        m_dwBufferCount++;
    }
    else if( GetCurrentMemoryModel() == CSPROPERTY_BUFFER_CLIENT_UNLIMITED )
    {
        // let's find a slot available
        DWORD dwAvailableRow = -1;
        for( DWORD i = 0; ( i < m_ulMaxNumOfBuffers ) && ( dwAvailableRow == -1 ); i++ )
        {
            if( m_pStreamDescriptorList[ i ].m_fBusy == FALSE )
            {
                dwAvailableRow = i;
            }
        }
        if( dwAvailableRow == -1 )
        {
            goto Cleanup;
        }

        if( !CeSafeCopyMemory( &( m_pStreamDescriptorList[ dwAvailableRow ].csStreamDescriptorShadow ), pOutBuf, sizeof( CS_STREAM_DESCRIPTOR )))
        {
            dwError = ERROR_INVALID_PARAMETER;
            goto Cleanup;
        }

        dwError = SwSetupStreamDescriptor( dwAvailableRow, &( m_pStreamDescriptorList[ dwAvailableRow ].csStreamDescriptorShadow ), pOutBuf );
        if( dwError != ERROR_SUCCESS )
        {
            goto Cleanup;
        }

        m_pStreamDescriptorList[ dwAvailableRow ].pCsStreamDescriptorExternal = NULL;
        m_pStreamDescriptorList[ dwAvailableRow ].m_fBusy = TRUE;
        m_dwBufferCount++;
    }

Cleanup:
    LeaveCriticalSection( &m_csStreamBuffer );
    return dwError;
}


DWORD
CPinDevice::DeallocateBuffer( LPVOID pOutBuf )
{
    LPVOID  lpBuffer;
    DWORD   dwHandle;
    DWORD   dwIndex;
    DWORD   dwError = ERROR_SUCCESS;
    PCS_STREAM_DESCRIPTOR pCsDescriptor;

    pCsDescriptor = (PCS_STREAM_DESCRIPTOR) pOutBuf;
    lpBuffer = pCsDescriptor->CsStreamHeader.Data;
    dwHandle = pCsDescriptor->CsStreamHeader.Handle;

    // Get the entry for this buffer in the internal list
    EnterCriticalSection( &m_csStreamBuffer );

    dwIndex = GetIndexFromHandle( dwHandle, lpBuffer );
    if( dwIndex == -1 )
    {
        dwError = ERROR_INVALID_PARAMETER;
        goto Cleanup;
    }

    // If the row is not in use, let's make it available
    if( m_pStreamDescriptorList[ dwIndex ].pCsStreamDescriptorExternal != NULL )
    {
        dwError = ERROR_INVALID_PARAMETER;
        goto Cleanup;
    }

    ASSERT( m_pStreamDescriptorList[ dwIndex ].m_fBusy == TRUE );
    m_pStreamDescriptorList[ dwIndex ].m_fBusy = FALSE;
    m_dwBufferCount--;

    DEBUGMSG(ZONE_INIT, (_T("DeallocateBuffer (%s): Index = %d\r\n"), STILL == m_ulPinId ? L"Still" : L"Preview/Capture", dwIndex));

    if( GetCurrentMemoryModel() == CSPROPERTY_BUFFER_DRIVER )
    {
        // We release the buffer.
        RemoteLocalFree( m_pStreamDescriptorList[ dwIndex ].csStreamDescriptorShadow.CsStreamHeader.Data );
        m_pStreamDescriptorList[ dwIndex ].csStreamDescriptorShadow.CsStreamHeader.Data = NULL;
        pCsDescriptor->CsStreamHeader.Data = NULL;
    }

Cleanup:
    LeaveCriticalSection( &m_csStreamBuffer );
    return dwError;
}


DWORD
CPinDevice::SwSetupStreamDescriptor( 
    DWORD                   dwIndex,
    PCS_STREAM_DESCRIPTOR   pCsStreamDesc, 
    LPVOID                  pBuffer             // Warning: This is an unsafe buffer, use with caution
)
{
    DWORD dwHandle;
    PCS_STREAM_DESCRIPTOR pCsStreamDescExt = ( PCS_STREAM_DESCRIPTOR ) pBuffer;

    if(( pCsStreamDesc == NULL ) || ( pBuffer == NULL ))
    {
        return ERROR_INVALID_PARAMETER;
    }

    dwHandle = CreateHandle( dwIndex, pBuffer );

    __try
    {
        pCsStreamDescExt->CsStreamHeader.Handle = dwHandle; 
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
    {
        return ERROR_INVALID_PARAMETER;
    }

    pCsStreamDesc->CsStreamHeader.Handle = dwHandle; 
        
    return ERROR_SUCCESS;
}


DWORD
CPinDevice::HwSetupStreamDescriptor(
    DWORD   dwIndex
)
{
    PCSSTREAM_HEADER                pCsStreamHeader; 
    PCS_FRAME_INFO                  pCsFrameInfo;

    if( dwIndex > m_dwBufferCount )
    {
        return ERROR_INVALID_PARAMETER;
    }

    m_ulFrameSize = CS__DIBSIZE (m_CsDataRangeVideo.VideoInfoHeader.bmiHeader);

    pCsStreamHeader = &( m_pStreamDescriptorList[ dwIndex ].csStreamDescriptorShadow.CsStreamHeader );
    pCsFrameInfo = &( m_pStreamDescriptorList[ dwIndex ].csStreamDescriptorShadow.CsFrameInfo );

    pCsStreamHeader->Size                         = sizeof(CSSTREAM_HEADER);
    pCsStreamHeader->TypeSpecificFlags            = 0;
    pCsStreamHeader->PresentationTime.Time        = 0;
    pCsStreamHeader->PresentationTime.Numerator   = 1;
    pCsStreamHeader->PresentationTime.Denominator = 1;
    pCsStreamHeader->Duration                     = 0;
    pCsStreamHeader->FrameExtent                  = m_ulFrameSize;
    pCsStreamHeader->DataUsed                     = m_ulFrameSize;
    pCsStreamHeader->OptionsFlags                 = CSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY;

    pCsFrameInfo->ExtendedHeaderSize = sizeof(CS_FRAME_INFO);
    pCsFrameInfo->dwFrameFlags       = CS_VIDEO_FLAG_FRAME;
    pCsFrameInfo->PictureNumber      = 0; 
    pCsFrameInfo->DropCount          = 0;

    // Note: RemoteLocalAlloc can't really trigger an exception, the __try/__except block is here
    // to highlight the fact that this call has to be protected in the case of a hardware access.
    __try
    {
        pCsStreamHeader->Data = RemoteLocalAlloc( LPTR, m_ulFrameSize );
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
    {
        return ERROR_INTERNAL_ERROR;
    }
    
    if( NULL == pCsStreamHeader->Data )
    {
        return ERROR_OUTOFMEMORY;
    }

    // And setup the handle
    pCsStreamHeader->Handle = CreateHandle( dwIndex, pCsStreamHeader->Data );

    return ERROR_SUCCESS;
}


DWORD 
CPinDevice::CreateHandle( 
    DWORD  dwIndex, 
    LPVOID pBuffer 
)
{
    DWORD  dwHandle;
    HANDLE hProcess = GetCallerProcess();

    dwHandle = (DWORD) hProcess ^ (( dwIndex << 16 ) + ( (DWORD)pBuffer & 0xFFFF ));

    return dwHandle;
}


DWORD
CPinDevice::GetIndexFromHandle( 
    DWORD  dwHandle, 
    LPVOID pBuffer      // Warning: This is an unsafe buffer, use with caution
)
{
    DWORD   dwIndex = -1;
    HANDLE  hProcess = GetCallerProcess();

    // TODO: let's retrieve the index from the handle table and make sure we have a match
    dwIndex = ( dwHandle ^ (DWORD)hProcess ) >> 16;
    if( dwIndex >= m_ulMaxNumOfBuffers )
    {
        // Invalid index, bail out
        return -1;
    }

    if(   ( m_pStreamDescriptorList[ dwIndex ].csStreamDescriptorShadow.CsStreamHeader.Data   != pBuffer )
        ||( m_pStreamDescriptorList[ dwIndex ].csStreamDescriptorShadow.CsStreamHeader.Handle != dwHandle ))
    {
        // Something's wrong, bail out
        return -1;
    }

    return dwIndex;
}


DWORD
CPinDevice::EnqueueDescriptor( LPVOID pOutBuf )
{
    LPVOID  lpBuffer, lpMappedBuffer;
    DWORD   dwHandle;
    DWORD   dwIndex;
    DWORD   dwSize;
    DWORD   dwError = ERROR_INVALID_PARAMETER;
    PCS_VIDEOINFOHEADER   pCsVideoInfoHdr;
    PCS_STREAM_DESCRIPTOR pCsDescriptor;
    
    DEBUGMSG( ZONE_IOCTL, ( _T("PIN_IOControl(%08x): EnqueueDescriptor\r\n"), this ) );

    if( m_CsState == CSSTATE_STOP )
    {
        return ERROR_SERVICE_NOT_ACTIVE;
    }

    pCsDescriptor = (PCS_STREAM_DESCRIPTOR) pOutBuf;

    // First, let's use the handle and the buffer to retrieve the shadow copy
    // If an exception happens during the following 2 lines, it will be trapped by the upper level
    lpBuffer = pCsDescriptor->CsStreamHeader.Data;
    dwHandle = pCsDescriptor->CsStreamHeader.Handle;

    EnterCriticalSection( &m_csStreamBuffer );

    // Get the entry for this buffer in the internal list
    dwIndex = GetIndexFromHandle( dwHandle, lpBuffer );
    if( dwIndex == -1 )
    {
        goto Cleanup;
    }

    // Is the row in use?
    if( m_pStreamDescriptorList[ dwIndex ].m_fBusy == FALSE )
    {
        DEBUGMSG( ZONE_IOCTL|ZONE_ERROR, ( _T("PIN_IOControl(%08x): The buffer has not be prepared. Call CS_ALLOCATE first.\r\n"), this ) );
        goto Cleanup;
    }

    if( m_pStreamDescriptorList[ dwIndex ].pCsStreamDescriptorExternal != NULL )
    {
        DEBUGMSG( ZONE_IOCTL|ZONE_ERROR, ( _T("PIN_IOControl(%08x): This buffer has already be enqueued.\r\n"), this ) );
        goto Cleanup;
    }

    // Now, let's probe the incoming buffer
    pCsVideoInfoHdr = reinterpret_cast<PCS_VIDEOINFOHEADER>( &m_CsDataRangeVideo.VideoInfoHeader );
    dwSize = abs( pCsVideoInfoHdr->bmiHeader.biHeight ) * CS_DIBWIDTHBYTES( pCsVideoInfoHdr->bmiHeader );
    lpMappedBuffer = (LPVOID) MapCallerPtr( lpBuffer, dwSize );

    if( lpMappedBuffer == NULL )
    {
        DEBUGMSG( ZONE_IOCTL|ZONE_ERROR, ( _T("PIN_IOControl(%08x): MapCallerPtr failed for incoming pointer \r\n"), this ) );
        goto Cleanup;
    }

    // Finally, set the internal table
    m_pStreamDescriptorList[ dwIndex ].csStreamDescriptorShadow.CsStreamHeader.Data = lpMappedBuffer;
    m_pStreamDescriptorList[ dwIndex ].pCsStreamDescriptorExternal = pCsDescriptor;           

    dwError = ERROR_SUCCESS;
    
Cleanup:
    LeaveCriticalSection( &m_csStreamBuffer );
    return dwError;
}


bool
CPinDevice::RemoveBufferFromList(
    PCS_STREAM_DESCRIPTOR * ppCsStreamDesc,
    PVOID                 * ppMappedData,
    PVOID                 * ppUnmappedData
    )
{
    DWORD dwCounter = 0;

    // Let's look in the list of buffers for the first buffer that has a non null external stream descriptor
    DEBUGMSG( ZONE_IOCTL, ( _T("PIN_IOControl(%08x): RemoveBufferFromList\r\n"), this ) );

    if(( ppCsStreamDesc == NULL ) || ( ppMappedData == NULL ) || ( ppUnmappedData == NULL ))
    {
        DEBUGMSG( ZONE_IOCTL|ZONE_ERROR, ( _T("PIN_IOControl(%08x): RemoveBufferFromList - Null pointer has been passed in.\r\n"), this ) );
        return false;
    }

    *ppCsStreamDesc = NULL;

    EnterCriticalSection( &m_csStreamBuffer );
    while(( dwCounter < m_dwBufferCount ) && ( *ppCsStreamDesc == NULL ))
    {
        if( m_pStreamDescriptorList[ dwCounter ].pCsStreamDescriptorExternal != NULL )
        {
            // We found one registered buffer. Let's return it.
            *ppCsStreamDesc = m_pStreamDescriptorList[ dwCounter ].pCsStreamDescriptorExternal;
            *ppMappedData   = m_pStreamDescriptorList[ dwCounter ].csStreamDescriptorShadow.CsStreamHeader.Data;
            *ppUnmappedData = m_pStreamDescriptorList[ dwCounter ].pCsStreamDescriptorExternal->CsStreamHeader.Data;
            m_pStreamDescriptorList[ dwCounter ].pCsStreamDescriptorExternal = NULL;
            m_pStreamDescriptorList[ dwCounter ].csStreamDescriptorShadow.CsStreamHeader.Data = *ppUnmappedData;
        }

        dwCounter++;
    }
    LeaveCriticalSection( &m_csStreamBuffer );

    return true;
}


bool
CPinDevice::ResetBufferList()
{
    EnterCriticalSection( &m_csStreamBuffer );
    for( DWORD i = 0; i < m_dwBufferCount; i++ )
    {
        m_pStreamDescriptorList[ i ].pCsStreamDescriptorExternal = NULL;
        m_pStreamDescriptorList[ i ].m_fBusy = FALSE;
    }
    
    LeaveCriticalSection( &m_csStreamBuffer );

    return true;
}


bool
CPinDevice::ReadMemoryModelFromRegistry()
{
    HKEY  hKey = 0;
    DWORD dwType  = 0;
    DWORD dwSize  = sizeof ( DWORD );
    DWORD dwValue = -1;


    if( ERROR_SUCCESS != RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"Drivers\\Capture\\NullCam", 0, 0, &hKey ))
    {
        false;
    }

    if( ERROR_SUCCESS == RegQueryValueEx( hKey, L"MemoryModel", 0, &dwType, (BYTE *)&dwValue, &dwSize ) )
    {
        if(   ( REG_DWORD == dwType ) 
           && ( sizeof( DWORD ) == dwSize ) 
           && (( dwValue == CSPROPERTY_BUFFER_DRIVER ) || ( dwValue == CSPROPERTY_BUFFER_CLIENT_LIMITED ) || ( dwValue == CSPROPERTY_BUFFER_CLIENT_UNLIMITED )))
        {
            m_dwMemoryModel = (CSPROPERTY_BUFFER_MODE) dwValue;
        }
    }

    RegCloseKey( hKey );
    return true;
}

CSPROPERTY_BUFFER_MODE CPinDevice::GetCurrentMemoryModel()
{
    return CSPROPERTY_BUFFER_CLIENT_LIMITED;
   
    return m_dwMemoryModel;
}

DWORD CPinDevice::GetMaxBufferCount()
{
    return MAX_BUFFER_COUNT;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产.欧美.日韩| 91精品国产91热久久久做人人| 欧美精品国产精品| 亚洲观看高清完整版在线观看| 欧美日韩一级二级三级| 麻豆视频一区二区| 国产日韩高清在线| 色婷婷久久久久swag精品 | 国产视频一区在线观看| 99在线精品一区二区三区| 一区二区三区电影在线播| 欧美一级爆毛片| 色综合亚洲欧洲| 久久草av在线| 亚洲午夜三级在线| 日韩不卡一区二区| 国产精品情趣视频| 欧美一区二区视频在线观看2020| 欧美精品aⅴ在线视频| 日韩欧美中文字幕制服| 久久影院午夜论| 欧美性大战久久久| 91色.com| 97精品视频在线观看自产线路二| 久久精品国产99| 粉嫩欧美一区二区三区高清影视| 99精品热视频| 精品视频1区2区| 精品国产伦一区二区三区观看方式| 亚洲自拍偷拍九九九| 不卡欧美aaaaa| 亚洲午夜视频在线观看| 免费成人深夜小野草| 一区二区三区丝袜| 日韩精品成人一区二区在线| 亚洲裸体在线观看| 欧美一区午夜视频在线观看 | 亚洲电影在线免费观看| 免费成人在线网站| 91在线一区二区三区| 日韩亚洲欧美高清| 亚洲欧美综合色| 国产嫩草影院久久久久| 亚洲一区二区三区视频在线 | 18欧美乱大交hd1984| 日韩精品国产欧美| 91在线观看视频| 久久久亚洲国产美女国产盗摄| 日韩欧美一区二区免费| 欧美一级搡bbbb搡bbbb| 中文字幕日韩av资源站| 久久99国产精品麻豆| 久久成人麻豆午夜电影| 91激情五月电影| 欧美高清视频不卡网| 亚洲天堂成人在线观看| 亚洲精品视频自拍| 国产精品一二三在| 风间由美一区二区av101 | 精品一区二区三区久久久| 欧美午夜宅男影院| 亚洲视频在线一区二区| 国产91丝袜在线播放0| 精品国产免费一区二区三区四区| 亚洲国产视频一区二区| proumb性欧美在线观看| 国产日韩精品一区二区三区| 九色|91porny| 精品福利二区三区| 男人的天堂久久精品| 欧美精品久久一区二区三区| 亚洲欧美激情视频在线观看一区二区三区 | 国产一区二区三区美女| 成人91在线观看| 一区二区免费在线播放| 成人午夜电影网站| 欧美偷拍一区二区| 亚洲国产一区二区视频| 欧美影片第一页| 天天av天天翘天天综合网色鬼国产| 久久国产人妖系列| 日韩欧美另类在线| 久久精品国产第一区二区三区| 欧美福利视频一区| 奇米色一区二区| 欧美精品一区二区精品网| 国产一区二区三区电影在线观看| 欧美精品一区二区三区蜜臀| 国产一区二区三区综合| 久久久精品综合| 成人免费不卡视频| 亚洲最快最全在线视频| 欧美精品 国产精品| 麻豆freexxxx性91精品| 国产日韩v精品一区二区| 不卡视频在线观看| 亚洲线精品一区二区三区| 在线不卡欧美精品一区二区三区| 麻豆久久久久久久| 国产亚洲一区二区三区四区 | 五月开心婷婷久久| 日韩三级中文字幕| 成人午夜av影视| 亚洲电影视频在线| 97se狠狠狠综合亚洲狠狠| 亚洲国产欧美另类丝袜| 日韩欧美123| 色综合久久久久综合99| 日本成人在线看| 中文字幕一区二区三| 日韩一区二区三区三四区视频在线观看| 精品一区二区三区久久久| 一区二区激情小说| 精品乱人伦一区二区三区| 五月天网站亚洲| 国产精品免费视频观看| 在线成人午夜影院| 91亚洲精品久久久蜜桃| 精品在线观看免费| 一区二区欧美精品| 国产精品妹子av| 日韩欧美的一区二区| 91日韩在线专区| 国产综合一区二区| 久久久不卡网国产精品二区| 欧美曰成人黄网| 亚洲一区二区欧美日韩| 国产午夜精品美女毛片视频| 欧美日韩国产成人在线免费| 亚洲一区二区不卡免费| 国产日产欧美一区二区视频| 欧美一区二视频| 欧洲一区二区av| 91亚洲精品乱码久久久久久蜜桃| 麻豆91在线看| 日本视频一区二区| 亚洲午夜激情网站| 亚洲精品videosex极品| 国产精品久久久久婷婷| 欧美性色黄大片| av成人老司机| av激情综合网| 成人综合婷婷国产精品久久| 国产老女人精品毛片久久| 五月天欧美精品| 日韩国产欧美一区二区三区| 一区二区三区高清不卡| 亚洲黄色小说网站| 一级女性全黄久久生活片免费| 中文字幕在线不卡| 国产精品热久久久久夜色精品三区| 久久久精品免费观看| 久久久国产精品不卡| 久久免费的精品国产v∧| 欧美成人官网二区| 日韩精品专区在线影院观看| 日韩亚洲欧美成人一区| 91精品国产综合久久久久久久| 国产精品一区久久久久| 国产精品99久久久久久有的能看| 久热成人在线视频| 国产一区二区不卡| 国产91综合网| 91亚洲精品久久久蜜桃| 在线看国产一区二区| 777a∨成人精品桃花网| 日韩欧美一区二区免费| 久久精品一区四区| 国产精品丝袜91| 亚洲综合999| 免费的国产精品| 成人免费视频免费观看| 色偷偷久久一区二区三区| 欧美精品久久久久久久久老牛影院| 3d动漫精品啪啪1区2区免费| 精品国产99国产精品| 中国色在线观看另类| 亚洲乱码国产乱码精品精小说 | 国产乱码精品一区二区三区五月婷| 国产高清久久久| 久久福利视频一区二区| 粉嫩一区二区三区在线看| 欧洲精品一区二区| 精品少妇一区二区三区在线播放| 国产午夜精品一区二区三区嫩草| 最近日韩中文字幕| 天天综合色天天| 国产精品一卡二| 欧美日韩精品系列| 久久久久国产一区二区三区四区| 亚洲人成网站在线| 国产麻豆精品在线观看| 色综合久久中文综合久久牛| 日韩欧美黄色影院| 亚洲女子a中天字幕| 韩国视频一区二区| 欧美嫩在线观看| 亚洲女女做受ⅹxx高潮| 狠狠网亚洲精品| 欧美日韩一二三|