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

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

?? xrmdd.c

?? wince 5.0下 實現PCI8串口卡驅動
?? C
?? 第 1 頁 / 共 5 頁
字號:
        pSerialHead->DCB.DCBlength  = sizeof(DCB);
        pSerialHead->DCB.BaudRate   = 9600;
        pSerialHead->DCB.fBinary    = TRUE;
        pSerialHead->DCB.fParity    = FALSE;

        pSerialHead->DCB.fOutxCtsFlow = FALSE;
        pSerialHead->DCB.fOutxDsrFlow = FALSE;
        pSerialHead->DCB.fDtrControl = DTR_CONTROL_ENABLE;
        pSerialHead->DCB.fDsrSensitivity = FALSE;
        pSerialHead->DCB.fTXContinueOnXoff = FALSE;
        pSerialHead->DCB.fOutX      = FALSE;
        pSerialHead->DCB.fInX       = FALSE;
        pSerialHead->DCB.fErrorChar = FALSE; //NOTE: ignored
        pSerialHead->DCB.fNull      = FALSE; //NOTE: ignored
        pSerialHead->DCB.fRtsControl = RTS_CONTROL_ENABLE;
        pSerialHead->DCB.fAbortOnError = FALSE; //NOTE: ignored

        pSerialHead->DCB.XonLim     = 512;
        pSerialHead->DCB.XoffLim    = 128;

        pSerialHead->DCB.ByteSize   = 8;
        pSerialHead->DCB.Parity     = NOPARITY;
        pSerialHead->DCB.StopBits   = ONESTOPBIT;

        pSerialHead->DCB.XonChar    = X_ON_CHAR;
        pSerialHead->DCB.XoffChar   = X_OFF_CHAR;
        pSerialHead->DCB.ErrorChar  = ERROR_CHAR;
        pSerialHead->DCB.EofChar    = E_OF_CHAR;
        pSerialHead->DCB.EvtChar    = EVENT_CHAR;

        pSerialHead->StopXmit = 0;
        pSerialHead->SentXoff = 0;
        pSerialHead->DtrFlow = 0;
        pSerialHead->RtsFlow = 0;

        ApplyDCB (pSerialHead, &(pSerialHead->DCB), FALSE);

        pHWObj->pFuncTbl->HWSetCommTimeouts(pSerialHead->pHWHead,
                                            &(pSerialHead->CommTimeouts));

        if ( !pHWObj->pFuncTbl->HWOpen(pSerialHead->pHWHead) ) {
            DEBUGMSG (ZONE_OPEN|ZONE_ERROR, (TEXT("HW Open failed.\r\n")));
            goto OpenFail;
        }

        pHWObj->pFuncTbl->HWPurgeComm(pSerialHead->pHWHead, PURGE_RXCLEAR);
        memset(pSerialHead->RxBufferInfo.RxCharBuffer, 0, pSerialHead->RxBufferInfo.Length);

        if ( pHWObj->BindFlags & THREAD_IN_MDD ) {
            CeSetThreadPriority(pSerialHead->pDispatchThread,
                                pSerialHead->Priority256);
        }

        RxResetFifo (pSerialHead);
    }

    ++(pSerialHead->OpenCnt);

    // OK, we are finally back in a stable state.  Release the CS.
    LeaveCriticalSection(&(pSerialHead->OpenCS));

    DEBUGMSG (ZONE_OPEN|ZONE_FUNCTION, (TEXT("-COM_Open handle x%X, x%X, Ref x%X\r\n"),
                                        pOpenHead, pOpenHead->pSerialHead, pSerialHead->OpenCnt));

    return(pOpenHead);

    OpenFail :
    DEBUGMSG (ZONE_OPEN|ZONE_FUNCTION, (TEXT("-COM_Open handle x%X, x%X, Ref x%X\r\n"),
                                        NULL, pOpenHead->pSerialHead, pSerialHead->OpenCnt));

    SetLastError(ERROR_OPEN_FAILED);

    // If this was the handle with access permission, remove pointer
    if ( pOpenHead == pSerialHead->pAccessOwner )
        pSerialHead->pAccessOwner = NULL;

    // Remove the Open entry from the linked list
    RemoveEntryList(&pOpenHead->llist);

    // OK, everything is stable so release the critical section
    LeaveCriticalSection(&(pSerialHead->OpenCS));

    // Free all data allocated in open
    if ( pOpenHead->CommEvents.hCommEvent )
        CloseHandle(pOpenHead->CommEvents.hCommEvent);
	DeleteCriticalSection(&(pOpenHead->CommEvents.EventCS));
    LocalFree( pOpenHead );

    return(NULL);


}

// ****************************************************************
//
//	@doc EXTERNAL
//
//	@func BOOL	| COM_Close | close the serial device.
//
//	@parm DWORD | pHead		| Context pointer returned from COM_Open
//
//	@rdesc TRUE if success; FALSE if failure
//
//	@remark This routine is called by the device manager to close the device.
//			
//
//
BOOL
COM_Close(PHW_OPEN_INFO pOpenHead)
{
    PHW_INDEP_INFO  pSerialHead = pOpenHead->pSerialHead;
    PHWOBJ          pHWObj;
    int i;
    BOOL            RetCode = TRUE;

    DEBUGMSG (ZONE_CLOSE|ZONE_FUNCTION, (TEXT("+COM_Close\r\n")));

    if ( !pSerialHead ) {
        DEBUGMSG (ZONE_ERROR, (TEXT("!!COM_Close: pSerialHead == NULL!!\r\n")));
        SetLastError(ERROR_INVALID_HANDLE);
        return(FALSE);
    }
    pHWObj = (PHWOBJ)pSerialHead->pHWObj;

    // Use the OpenCS to make sure we don't collide with an in-progress open.
    EnterCriticalSection(&(pSerialHead->OpenCS));

    if ( pSerialHead->OpenCnt ) {
        --(pSerialHead->OpenCnt);

        DEBUGMSG (1,
                  (TEXT("COM_Close: (%d handles) total RX %d, total TX %d, dropped (mdd, pdd) %d,%d\r\n"),
                   pSerialHead->OpenCnt, pSerialHead->RxBytes, pSerialHead->TxBytes, pSerialHead->DroppedBytesMDD, pSerialHead->DroppedBytesPDD));

        // In multi open case, do we need to restore state later on or something????
        if ( pHWObj && (pHWObj->BindFlags & THREAD_IN_MDD) &&
             pSerialHead->pDispatchThread ) {
            SetThreadPriority(pSerialHead->pDispatchThread,
                              THREAD_PRIORITY_NORMAL);
        }

        // Free up any threads which may be blocked waiting for events.
        // Monitor users count to make sure no one is still in one of
        // the COM_ functions before proceeding (wait up to 2 s). 
        for ( i=0; i<20 && pOpenHead->StructUsers; i++ ) {
            DEBUGMSG(ZONE_INIT|ZONE_CLOSE,
                     (TEXT("COM_Close: %d users in MDD functions\n\r"),pOpenHead->StructUsers));

            // For any open handle, we must free pending waitcommevents
			EnterCriticalSection(&(pOpenHead->CommEvents.EventCS));
            pOpenHead->CommEvents.fEventMask = 0;
            pOpenHead->CommEvents.fAbort = 1;
            SetEvent(pOpenHead->CommEvents.hCommEvent);
			LeaveCriticalSection(&(pOpenHead->CommEvents.EventCS));

            // And only for the handle with access permissions do we
            // have to worry about read, write, etc being blocked.
            if ( pOpenHead->AccessCode & (GENERIC_READ | GENERIC_WRITE) ) {
                SetEvent(pSerialHead->hReadEvent);
                SetEvent(pSerialHead->hTransmitEvent);
            }

            /* Sleep, let threads finish */
            Sleep(100);
        }
        if ( i==20 )
            DEBUGMSG(ZONE_CLOSE|ZONE_INIT|ZONE_ERROR,
                     (TEXT("COM_Close: Waited 2s for serial users to exit, %d left\n\r"),
                      pOpenHead->StructUsers));

        // If we are closing the last open handle, then close PDD also
        if ( !pSerialHead->OpenCnt ) {
            DEBUGMSG (ZONE_CLOSE, (TEXT("About to call HWClose\r\n")));
            if ( pHWObj )
                pHWObj->pFuncTbl->HWClose(pSerialHead->pHWHead);
            DEBUGMSG (ZONE_CLOSE, (TEXT("Returned from HWClose\r\n")));

            // And if thread was spun in open, kill it now.
            if ( pSerialHead->pHWObj->BindFlags & THREAD_AT_OPEN ) {
                DEBUGMSG (ZONE_CLOSE, (TEXT("COM_Close : Stopping Dispatch Thread\r\n")));
                StopDispatchThread( pSerialHead );
            }
        }

        // If this was the handle with access permission, remove pointer
        if ( pOpenHead == pSerialHead->pAccessOwner ) {
            DEBUGMSG(ZONE_INIT|ZONE_CLOSE,
                     (TEXT("COM_Close: Closed access owner handle\n\r"),
                      pOpenHead));

            pSerialHead->pAccessOwner = NULL;
        }

        // Remove the entry from the linked list
        RemoveEntryList(&pOpenHead->llist);

        // Free all data allocated in open
		DeleteCriticalSection(&(pOpenHead->CommEvents.EventCS));
        if ( pOpenHead->CommEvents.hCommEvent )
            CloseHandle(pOpenHead->CommEvents.hCommEvent);
        LocalFree( pOpenHead );
    } else {
        DEBUGMSG (ZONE_ERROR, (TEXT("!!Close of non-open serial port\r\n")));
        SetLastError(ERROR_INVALID_HANDLE);        
        RetCode = FALSE;
    }

    // OK, other inits/opens can go ahead.
    LeaveCriticalSection(&(pSerialHead->OpenCS));

    DEBUGMSG (ZONE_CLOSE|ZONE_FUNCTION, (TEXT("-COM_Close\r\n")));
    return(RetCode);
}

// Routine to handle the PROCESS_EXITING flag.  Should let free any threads blocked on pOpenHead,
// so they can be killed and the process closed.

BOOL
ProcessExiting(PHW_OPEN_INFO pOpenHead)
{
    PHW_INDEP_INFO  pSerialHead = pOpenHead->pSerialHead;
    PHWOBJ          pHWObj;
    int i;
    BOOL            RetCode = TRUE;

    DEBUGMSG (ZONE_CLOSE|ZONE_FUNCTION, (TEXT("+ProcessExiting\r\n")));

    if ( !pSerialHead ) {
        DEBUGMSG (ZONE_ERROR, (TEXT("!!ProcessExiting: pSerialHead == NULL!!\r\n")));
        SetLastError(ERROR_INVALID_HANDLE);
        return(FALSE);
    }
    pHWObj = (PHWOBJ)pSerialHead->pHWObj;

    // Use the OpenCS to make sure we don't collide with an in-progress open.
    EnterCriticalSection(&(pSerialHead->OpenCS));

    if ( pSerialHead->OpenCnt ) {
//        --(pSerialHead->OpenCnt);

        DEBUGMSG (1,
                  (TEXT("ProcessClose: (%d handles) total RX %d, total TX %d, dropped (mdd, pdd) %d,%d\r\n"),
                   pSerialHead->OpenCnt, pSerialHead->RxBytes, pSerialHead->TxBytes, pSerialHead->DroppedBytesMDD, pSerialHead->DroppedBytesPDD));

        // In multi open case, do we need to restore state later on or something????
        if ( pHWObj && (pHWObj->BindFlags & THREAD_IN_MDD) &&
             pSerialHead->pDispatchThread ) {
            SetThreadPriority(pSerialHead->pDispatchThread,
                              THREAD_PRIORITY_NORMAL);
        }

        // Free up any threads which may be blocked waiting for events.
        // Monitor users count to make sure no one is still in one of
        // the COM_ functions before proceeding (wait up to 2 s). 
        for ( i=0; i<20 && pOpenHead->StructUsers; i++ ) {
            DEBUGMSG(ZONE_INIT|ZONE_CLOSE,
                     (TEXT("ProcessExiting: %d users in MDD functions\n\r"),pOpenHead->StructUsers));

            // For any open handle, we must free pending waitcommevents
			EnterCriticalSection(&(pOpenHead->CommEvents.EventCS));
            pOpenHead->CommEvents.fEventMask = 0;
            pOpenHead->CommEvents.fAbort = 1;
            SetEvent(pOpenHead->CommEvents.hCommEvent);
			LeaveCriticalSection(&(pOpenHead->CommEvents.EventCS));

            // And only for the handle with access permissions do we
            // have to worry about read, write, etc being blocked.
            if ( pOpenHead->AccessCode & (GENERIC_READ | GENERIC_WRITE) ) {
                pSerialHead->fAbortRead=1;
                SetEvent(pSerialHead->hReadEvent);
                pSerialHead->fAbortTransmit=1;
                SetEvent(pSerialHead->hTransmitEvent);
            }

            /* Sleep, let threads finish */
            Sleep(100);
        }
        if ( i==20 )
            DEBUGMSG(ZONE_CLOSE|ZONE_INIT|ZONE_ERROR,
                     (TEXT("ProcessExiting: Waited 2s for serial users to exit, %d left\n\r"),
                      pOpenHead->StructUsers));

/*           Don't really want to close everything.  Just want to free threads
             // If we are closing the last open handle, then close PDD also
        if ( !pSerialHead->OpenCnt ) {
            DEBUGMSG (ZONE_CLOSE, (TEXT("About to call HWClose\r\n")));
            if ( pHWObj )
                pHWObj->pFuncTbl->HWClose(pSerialHead->pHWHead);
            DEBUGMSG (ZONE_CLOSE, (TEXT("Returned from HWClose\r\n")));

            // And if thread was spun in open, kill it now.
            if ( pSerialHead->pHWObj->BindFlags & THREAD_AT_OPEN ) {
                DEBUGMSG (ZONE_CLOSE, (TEXT("COM_Close : Stopping Dispatch Thread\r\n")));
                StopDispatchThread( pSerialHead );
            }
        }

        // If this was the handle with access permission, remove pointer
        if ( pOpenHead == pSerialHead->pAccessOwner ) {
            DEBUGMSG(ZONE_INIT|ZONE_CLOSE,
                     (TEXT("COM_Close: Closed access owner handle\n\r"),
                      pOpenHead));

            pSerialHead->pAccessOwner = NULL;
        }

        // Remove the entry from the linked list
        RemoveEntryList(&pOpenHead->llist);

        // Free all data allocated in open
        if ( pOpenHead->CommEvents.hCommEvent )
            CloseHandle(pOpenHead->CommEvents.hCommEvent);
        LocalFree( pOpenHead );
*/
    } else {
        DEBUGMSG (ZONE_ERROR, (TEXT("!!Close of non-open serial port\r\n")));
        SetLastError(ERROR_INVALID_HANDLE);        
        RetCode = FALSE;
    }

    // OK, other inits/opens can go ahead.
    LeaveCriticalSection(&(pSerialHead->OpenCS));

    DEBUGMSG (ZONE_CLOSE|ZONE_FUNCTION, (TEXT("-ProcessExiting\r\n")));
    return(RetCode);
}

/*
 @doc EXTERNAL
 @func	BOOL | COM_Deinit | De-initialize serial port.
 @parm DWORD | pSerialHead | Context pointer returned from COM_Init
 *
 @rdesc None.
 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人动漫在线免费观看| 亚洲免费资源在线播放| 91丨porny丨中文| 视频在线观看一区| 国产精品久久精品日日| 欧美疯狂性受xxxxx喷水图片| 国产精品资源网| 香蕉久久一区二区不卡无毒影院| 亚洲国产精品二十页| 欧美日韩亚洲综合| caoporn国产一区二区| 免费成人在线播放| 一区二区三区在线播放| 国产精品私人自拍| 日韩免费观看高清完整版 | 欧美伊人久久久久久久久影院| 久久国产综合精品| 亚洲va中文字幕| 亚洲美女视频一区| 国产精品久久久久久久裸模| 亚洲精品一区二区三区精华液 | 91理论电影在线观看| 国产综合久久久久久久久久久久| 亚洲国产精品久久久男人的天堂| 国产综合久久久久久久久久久久| 亚洲bdsm女犯bdsm网站| 亚洲欧美日韩综合aⅴ视频| 久久精品一区四区| 久久久av毛片精品| 国产成人激情av| 亚洲男帅同性gay1069| 97精品电影院| 一区二区三区中文字幕精品精品 | 亚洲国产成人精品视频| 欧美中文字幕一区| 亚洲国产视频一区二区| 国产精品婷婷午夜在线观看| 久久精品在这里| 久久精品视频免费观看| 欧美xingq一区二区| 日韩一区二区免费在线观看| 欧美日韩一区中文字幕| 欧美色精品天天在线观看视频| 91免费看片在线观看| 91在线免费看| 91福利社在线观看| 欧美性一级生活| 欧美亚洲尤物久久| 自拍偷拍国产亚洲| 亚洲男人的天堂在线aⅴ视频| 中文字幕亚洲精品在线观看| 亚洲婷婷综合色高清在线| 亚洲人精品午夜| 一区二区三区视频在线看| 一区二区三区中文字幕精品精品 | 免费高清视频精品| 久久精品国产亚洲高清剧情介绍 | 在线观看av一区| 在线亚洲+欧美+日本专区| 欧美午夜片在线观看| 欧美美女一区二区| 欧美成人一区二区| 国产精品免费丝袜| 亚洲一区在线视频观看| 美女视频网站黄色亚洲| 国产二区国产一区在线观看| 成人av免费网站| 欧美天堂亚洲电影院在线播放| 777色狠狠一区二区三区| 欧美成人精品高清在线播放| 久久久综合视频| 自拍偷拍亚洲欧美日韩| 五月婷婷激情综合| 久久er精品视频| 成av人片一区二区| 欧美婷婷六月丁香综合色| 日韩欧美一区二区在线视频| 国产亚洲精品超碰| 一区二区三区欧美在线观看| 天天射综合影视| 国产成人免费视频网站| 91国模大尺度私拍在线视频| 日韩一区二区精品在线观看| 国产精品乱人伦| 日日骚欧美日韩| 国产999精品久久| 欧美色涩在线第一页| 国产日产欧美一区二区视频| 亚洲一区欧美一区| 国产精品一区二区在线看| 在线免费一区三区| 国产欧美视频一区二区| 亚洲成人免费av| 丁香网亚洲国际| 欧美日韩国产首页在线观看| 中文字幕精品在线不卡| 日韩高清国产一区在线| 99视频一区二区| 欧美精品一区二区三区蜜桃视频| 一区二区三区精品视频在线| 国模无码大尺度一区二区三区| 91久久线看在观草草青青 | 亚洲成人一区二区在线观看| 国产福利一区二区| 69久久夜色精品国产69蝌蚪网| 国产精品你懂的在线欣赏| 免费黄网站欧美| 欧美在线播放高清精品| 国产精品久久久久久久久快鸭| 免费在线观看成人| 欧美午夜理伦三级在线观看| 国产精品久久国产精麻豆99网站| 美女视频网站久久| 欧美日韩视频在线一区二区 | 免费高清不卡av| 欧美日韩在线不卡| 亚洲欧美日韩国产综合在线| 高清国产一区二区| 欧美精品一区二区三区高清aⅴ| 亚洲一区二区在线播放相泽| 成人黄色电影在线| 久久久久久夜精品精品免费| 日韩综合在线视频| 欧美体内she精高潮| 又紧又大又爽精品一区二区| 不卡电影一区二区三区| 日本一区二区成人| 高清久久久久久| 国产精品日韩成人| 国产精品1024| 国产日产欧美精品一区二区三区| 国产一区二区看久久| 精品处破学生在线二十三| 美女网站色91| 精品日韩在线观看| 精品夜夜嗨av一区二区三区| 精品国产91久久久久久久妲己| 免费三级欧美电影| 欧美一卡2卡3卡4卡| 日本一区中文字幕| 欧美一区二区三区在线看| 日本女优在线视频一区二区| 日韩午夜激情视频| 久久精品99国产国产精| 久久在线免费观看| 盗摄精品av一区二区三区| 欧美激情中文不卡| 99re在线精品| 亚洲黄色尤物视频| 欧美久久久久久蜜桃| 免费在线一区观看| 久久久久久一级片| 成人午夜伦理影院| 亚洲精品国产精品乱码不99 | 色综合久久久久综合| 亚洲午夜久久久久| 日韩一区二区三区免费看| 国内精品嫩模私拍在线| 中文字幕乱码亚洲精品一区| 91视视频在线观看入口直接观看www| 亚洲美女电影在线| 欧美日韩视频在线观看一区二区三区 | 精品一区精品二区高清| 久久综合色婷婷| jvid福利写真一区二区三区| 亚洲美女偷拍久久| 日韩天堂在线观看| 国产成人免费网站| 伊人色综合久久天天| 欧美精品日韩综合在线| 国产一区二区三区观看| 亚洲欧美日韩久久精品| 日韩一卡二卡三卡四卡| 国产91精品露脸国语对白| 亚洲自拍与偷拍| 日韩精品在线网站| 99国产精品久久久久久久久久久| 亚洲国产日韩a在线播放性色| 日韩免费高清视频| aaa欧美大片| 琪琪久久久久日韩精品| 欧美国产日韩a欧美在线观看| 欧美性色黄大片手机版| 久久99在线观看| 亚洲精品乱码久久久久久日本蜜臀| 日韩一级成人av| 色综合婷婷久久| 韩国欧美国产一区| 一区二区三区丝袜| 久久九九国产精品| 欧美日韩大陆一区二区| 成人av资源站| 久久精品国产999大香线蕉| 亚洲美女淫视频| 久久精品视频一区| 欧美日韩精品一区二区三区四区| 粉嫩绯色av一区二区在线观看| 亚洲mv大片欧洲mv大片精品| 国产精品久久综合| 日韩免费在线观看|