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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? xrmdd.c

?? wince 5.0下 實(shí)現(xiàn)PCI8串口卡驅(qū)動(dòng)
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
BOOL
COM_Deinit(PHW_INDEP_INFO pSerialHead)
{
    DEBUGMSG (ZONE_INIT|ZONE_FUNCTION, (TEXT("+COM_Deinit\r\n")));

    if ( !pSerialHead ) {
        /* Can't do much without this */
        DEBUGMSG (ZONE_INIT|ZONE_ERROR,
                  (TEXT("COM_Deinit can't find pSerialHead\r\n")));
        SetLastError(ERROR_INVALID_HANDLE);
        return(FALSE);
    }

    // If we have an interrupt handler thread, kill it
    if ( pSerialHead->pHWObj->BindFlags & THREAD_IN_MDD ) {
        StopDispatchThread( pSerialHead );
    }

    /*
    ** Call close, if we have a user.  Note that this call will ensure that
    ** all users are out of the serial routines before it returns, so we can
    ** go ahead and free our internal memory.
    */
    if ( pSerialHead->OpenCnt ) {
        PLIST_ENTRY     pEntry;
        PHW_OPEN_INFO   pOpenHead;

        pEntry = pSerialHead->OpenList.Flink;
        while ( pEntry != &pSerialHead->OpenList ) {
            pOpenHead = CONTAINING_RECORD( pEntry, HW_OPEN_INFO, llist);
            pEntry = pEntry->Flink;  // advance to next 

            DEBUGMSG (ZONE_INIT | ZONE_CLOSE, (TEXT(" Deinit - Closing Handle 0x%X\r\n"),
                                               pOpenHead ));
            COM_Close(pOpenHead);
        }
    }

    /* Free our resources */
    if ( pSerialHead->hSerialEvent )
        CloseHandle(pSerialHead->hSerialEvent);
    if ( pSerialHead->hKillDispatchThread )
        CloseHandle(pSerialHead->hKillDispatchThread);
    if ( pSerialHead->hTransmitEvent )
        CloseHandle(pSerialHead->hTransmitEvent);
    if ( pSerialHead->hReadEvent )
        CloseHandle(pSerialHead->hReadEvent);

    DeleteCriticalSection(&(pSerialHead->ReceiveCritSec1));
    DeleteCriticalSection(&(pSerialHead->TransmitCritSec1));
    DeleteCriticalSection(&(pSerialHead->RxBufferInfo.CS));
    DeleteCriticalSection(&(pSerialHead->TxBufferInfo.CS));
    DeleteCriticalSection(&(pSerialHead->OpenCS));

    if ( pSerialHead->RxBufferInfo.RxCharBuffer )
        LocalFree(pSerialHead->RxBufferInfo.RxCharBuffer);

    /* Now, call HW specific deinit function */
    if ( pSerialHead->pHWObj && pSerialHead->pHWObj->pFuncTbl ) {
        DEBUGMSG (ZONE_INIT, (TEXT("About to call HWDeinit\r\n")));
        pSerialHead->pHWObj->pFuncTbl->HWDeinit(pSerialHead->pHWHead);
        DEBUGMSG (ZONE_INIT, (TEXT("Returned from HWDeinit\r\n")));
    }

    LocalFree(pSerialHead);

    DEBUGMSG (ZONE_INIT|ZONE_FUNCTION, (TEXT("-COM_Deinit\r\n")));
    return(TRUE);
}


/*
   @doc EXTERNAL
   @func	ULONG | COM_Read | Allows application to receive characters from
   *	serial port. This routine sets the buffer and bufferlength to be used
   *	by the reading thread. It also enables reception and controlling when
   *	to return to the user. It writes to the referent of the fourth argument
   *	the number of bytes transacted. It returns the status of the call.
   *
   *	Exported to users.
   @rdesc This routine returns: -1 if error, or number of bytes read.
   */
ULONG
COM_Read(
        HANDLE      pHead,          //@parm [IN]	 HANDLE returned by COM_Open   
        PUCHAR      pTargetBuffer,  //@parm [IN,OUT] Pointer to valid memory.	  
        ULONG       BufferLength    //@parm [IN]	 Size in bytes of pTargetBuffer.
        )
{
    PHW_OPEN_INFO   pOpenHead = (PHW_OPEN_INFO)pHead;
    PHW_INDEP_INFO  pSerialHead = pOpenHead->pSerialHead;
    PHW_VTBL        pFuncTbl       = pSerialHead->pHWObj->pFuncTbl;
    PVOID           pHWHead        = pSerialHead->pHWHead;
    ULONG           Ticks;
    ULONG           Timeout;
    ULONG           BytesRead = 0;
    ULONG           IntervalTimeout;    // The interval timeout
	ULONG			AddIntervalTimeout;
    ULONG           TotalTimeout;       // The Total Timeout
    ULONG           TimeSpent = 0;      // How much time have we been waiting?
    ULONG           Len;

    DEBUGMSG (ZONE_USR_READ|ZONE_FUNCTION,
              (TEXT("+COM_READ(0x%X,0x%X,%d)\r\n"),
               pHead, pTargetBuffer, BufferLength));

    // Check to see that the call is valid.
    if ( !pSerialHead || !pSerialHead->OpenCnt ) {
        DEBUGMSG (ZONE_USR_READ|ZONE_ERROR,
                  (TEXT("COM_READ, device not open\r\n") ));
        SetLastError (ERROR_INVALID_HANDLE);
        return(ULONG)-1;
    }

    // Make sure the caller has access permissions
    if ( !(pOpenHead->AccessCode & GENERIC_READ) ) {
        DEBUGMSG(ZONE_USR_READ|ZONE_ERROR,
                 (TEXT("COM_Read: Access permission failure x%X\n\r"),
                  pOpenHead->AccessCode));
        SetLastError (ERROR_INVALID_ACCESS);
        return(ULONG)-1;
    }

#ifdef DEBUG
    if ( IsBadWritePtr(pTargetBuffer, BufferLength) ) {
        BytesRead = (ULONG)-1;
        SetLastError(ERROR_INVALID_PARAMETER);        
        return(ULONG)-1;
    }
#endif

    COM_INC_USAGE_CNT(pOpenHead);

    /* Practice safe threading.
     */
    EnterCriticalSection(&(pSerialHead->ReceiveCritSec1));
    pSerialHead->fAbortRead = 0;

    /* Compute total time to wait. Take product and add constant.
     */
    if ( MAXDWORD != pSerialHead->CommTimeouts.ReadTotalTimeoutMultiplier ) {
        TotalTimeout = pSerialHead->CommTimeouts.ReadTotalTimeoutMultiplier*BufferLength +
                       pSerialHead->CommTimeouts.ReadTotalTimeoutConstant;
		// Because we are using FIFO and water level is set to 8, we have to do following
		AddIntervalTimeout=pSerialHead->CommTimeouts.ReadTotalTimeoutMultiplier*8;
    } else {
        TotalTimeout = pSerialHead->CommTimeouts.ReadTotalTimeoutConstant;
		AddIntervalTimeout=0;
    }
    IntervalTimeout = pSerialHead->CommTimeouts.ReadIntervalTimeout;
	if ((IntervalTimeout < MAXDWORD  - AddIntervalTimeout) && (IntervalTimeout != 0)) {
		IntervalTimeout +=AddIntervalTimeout;
	};

    DEBUGMSG (ZONE_USR_READ, (TEXT("TotalTimeout:%d\r\n"), TotalTimeout));

    while ( BufferLength ) {
        DEBUGMSG (ZONE_USR_READ,
                  (TEXT("Top of Loop Fifo(R=%d,W=%d,L=%d,BA=%d)\r\n"),
                   RxRead(pSerialHead), RxWrite(pSerialHead),
                   RxLength(pSerialHead),
                   RxBytesAvail(pSerialHead)));
        if ( RxBytesAvail(pSerialHead) ) {
            RxEnterCS(pSerialHead);
            // Copy the data over
            // This only copies the continous portion, This will cause a loop
            // if the receive data spans the end of the buffer.
            Len = MIN(RxBytesAvail(pSerialHead),
                      RxLength(pSerialHead)-RxRead(pSerialHead));
            Len = MIN(Len, BufferLength);
            DEBUGMSG (ZONE_USR_READ, (TEXT("About to copy %d bytes\r\n"), Len));
            memcpy (pTargetBuffer, RxBuffRead(pSerialHead), Len);
            // Update Fifo info
            RxRead(pSerialHead) = 
                (RxRead(pSerialHead)+ Len<RxLength(pSerialHead)? RxRead(pSerialHead)+Len: RxRead(pSerialHead)+Len-RxLength(pSerialHead));

            // Update all the pointers.
            BufferLength -= Len;
            pTargetBuffer += Len;
            BytesRead += Len;
            RxLeaveCS(pSerialHead);
        } else {
            // Wait for a serial event?
            if ( IntervalTimeout == MAXDWORD){  // Special Case see Remarks of COMMTIMEOUTS 
                if (TotalTimeout == 0) 
                    // For some reason this means don't wait.
                    break;
                else
                if (BytesRead!=0) // There is data in the buffer or has been readed.
                    break;
            }
            Timeout=(TotalTimeout!=0?TotalTimeout:MAXDWORD);
            // Total timeout is valid
            if ( TimeSpent >= Timeout ) {
                // Timed out.
                break;
            }
            Timeout -= TimeSpent;
            // On first byte we only use interval timeout
            // on subsequent we use minimum of Interval and Timeout
            if ( BytesRead) {
                Timeout = MIN(Timeout, (IntervalTimeout!=0?IntervalTimeout:MAXDWORD));
            }
            Ticks = GetTickCount();
            DEBUGMSG (ZONE_USR_READ, (TEXT("About to wait %dms\r\n"), Timeout));

            if ( WAIT_TIMEOUT == WaitForSingleObject (pSerialHead->hReadEvent,
                                                      Timeout) ) {
                // Timeout
                break;
            }
            // Since ticks is a ULONG this handles wrap.
            Ticks = GetTickCount() - Ticks;
            TimeSpent += Ticks;

            // In the absense of WaitForMultipleObjects, we use flags to
            // handle errors/aborts. Check for aborts or asynchronous closes.
            if ( pSerialHead->fAbortRead ) {
                DEBUGMSG(ZONE_USR_READ,(TEXT("COM_Read - Aborting read\r\n")));
                break;
            }

            if ( !pSerialHead->OpenCnt ) {
                DEBUGMSG(ZONE_USR_READ|ZONE_ERROR,
                         (TEXT("COM_Read - device was closed\n\r")));
                SetLastError(ERROR_INVALID_HANDLE);
                break;
            }
        }

        // Are we below the SW flow control limits?
        if ( pSerialHead->DCB.fInX && pSerialHead->SentXoff &&
             (pSerialHead->DCB.XoffLim <
              (RxLength(pSerialHead) - RxBytesAvail(pSerialHead))) ) {
            PHWOBJ  pHWObj  = pSerialHead->pHWObj;

            DEBUGMSG (ZONE_FLOW, (TEXT("Sending XON\r\n")));
            pSerialHead->SentXoff = 0;
            if ( !pSerialHead->DCB.fTXContinueOnXoff ) {
                pSerialHead->StopXmit = 0;
            }
            pHWObj->pFuncTbl->HWXmitComChar(pSerialHead->pHWHead,
                                            pSerialHead->DCB.XonChar);
        }

        // Are we below the HW flow control limits?
        if ( 2*RxBytesAvail(pSerialHead) < RxLength(pSerialHead) ) {
            // When buffer is less then 1/2 full we set RTS/DTR
            if ( pSerialHead->RtsFlow &&
                 (pSerialHead->DCB.fRtsControl == RTS_CONTROL_HANDSHAKE) ) {
                DEBUGMSG (ZONE_USR_READ|ZONE_FLOW,
                          (TEXT("RTS_CONTROL_HANDSHAKE Setting RTS\r\n")));
                pSerialHead->RtsFlow = 0;
                pFuncTbl->HWSetRTS(pHWHead);
            }
            if ( pSerialHead->DtrFlow && 
                 (pSerialHead->DCB.fDtrControl == DTR_CONTROL_HANDSHAKE) ) {
                DEBUGMSG (ZONE_USR_READ|ZONE_FLOW,
                          (TEXT("DTR_CONTROL_HANDSHAKE Setting DTR\r\n")));
                pSerialHead->DtrFlow = 0;
                pFuncTbl->HWSetDTR(pHWHead);
            }
        }

    }

    DEBUGMSG (ZONE_USR_READ, (TEXT("ReceiveBytes exiting\r\n")));

    LeaveCriticalSection(&(pSerialHead->ReceiveCritSec1));

    DEBUGMSG (ZONE_USR_READ|ZONE_FUNCTION,	
              (TEXT("-COM_READ: returning %d (total %d, dropped %d,%d)\r\n"),
               BytesRead, pSerialHead->RxBytes, pSerialHead->DroppedBytesMDD,pSerialHead->DroppedBytesPDD));

    COM_DEC_USAGE_CNT(pOpenHead);

    return(BytesRead);
}

/*
   @doc EXTERNAL
   @func ULONG | COM_Write | Allows application to transmit bytes to the serial port. Exported to users.
   *
   @rdesc It returns the number of bytes written or -1 if error.
   *
   *
   */
ULONG
COM_Write(HANDLE pHead,         /*@parm [IN]  HANDLE returned by COM_Open.*/
          PUCHAR pSourceBytes,  /*@parm [IN]  Pointer to bytes to be written.*/
          ULONG  NumberOfBytes  /*@parm [IN]  Number of bytes to be written. */
         )
{
    PHW_OPEN_INFO   pOpenHead = (PHW_OPEN_INFO)pHead;
    PHW_INDEP_INFO  pSerialHead = pOpenHead->pSerialHead;
    ULONG               BytesWritten   = 0;
    ULONG               TotalWritten   = 0;
    PHWOBJ              pHWObj         = NULL;
    PVOID               pHWHead        = NULL;
    PHW_VTBL            pFuncTbl       = NULL;
    ULONG               TotalTimeout;   // The Total Timeout
    ULONG               Timeout;        // The Timeout value actually used
    ULONG               WaitReturn;

    DEBUGMSG (ZONE_WRITE|ZONE_FUNCTION,
              (TEXT("+COM_WRITE(0x%X, 0x%X, %d)\r\n"), pHead,
               pSourceBytes, NumberOfBytes));       


    // Check validity of handle
    if ( !pSerialHead || !pSerialHead->OpenCnt ) {
        DEBUGMSG (ZONE_WRITE|ZONE_ERROR,
                  (TEXT("COM_WRITE, device not open\r\n") ));
        SetLastError (ERROR_INVALID_HANDLE);
        return(ULONG)-1;
    }

    // Make sure the caller has access permissions
    if ( !(pOpenHead->AccessCode & GENERIC_WRITE) ) {
        DEBUGMSG(ZONE_USR_READ|ZONE_ERROR,
                 (TEXT("COM_Write: Access permission failure x%X\n\r"),
                  pOpenHead->AccessCode));
        SetLastError (ERROR_INVALID_ACCESS);
        return(ULONG)-1;
    }

#ifdef DEBUG
    if ( IsBadReadPtr(pSourceBytes, NumberOfBytes) ) {
        DEBUGMSG (ZONE_WRITE|ZONE_ERROR,
                  (TEXT("COM_WRITE, bad read pointer\r\n") ));

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区二区三区乱码| 高清av一区二区| 国产日韩欧美精品在线| 91国产成人在线| 国产精品一线二线三线精华| 亚洲第一电影网| 亚洲欧美在线观看| 2023国产精品视频| 91精品国产色综合久久不卡蜜臀 | 国产大陆a不卡| 午夜影视日本亚洲欧洲精品| 中文字幕一区二区三区蜜月 | 亚洲色图都市小说| 久久久精品人体av艺术| 9191国产精品| 91极品视觉盛宴| hitomi一区二区三区精品| 黄色资源网久久资源365| 亚洲福利一区二区| 亚洲精品日日夜夜| 国产精品蜜臀av| 国产人成亚洲第一网站在线播放| 51久久夜色精品国产麻豆| 欧美午夜一区二区三区免费大片| 91啪亚洲精品| 99久精品国产| 99精品国产视频| caoporn国产一区二区| 国产一区二区视频在线| 久久狠狠亚洲综合| 毛片基地黄久久久久久天堂| 日本成人超碰在线观看| 日韩二区三区四区| 亚洲成av人片在www色猫咪| 亚洲精品综合在线| 亚洲免费视频中文字幕| 亚洲欧洲精品一区二区精品久久久| 久久久久久9999| 国产三级精品在线| 国产午夜精品理论片a级大结局 | 精品人在线二区三区| 日韩精品一区二区在线| 精品福利在线导航| 久久久激情视频| 国产精品三级视频| 亚洲人成在线播放网站岛国 | 国产伦精品一区二区三区免费迷| 久久精品99国产精品| 黄色成人免费在线| 国产成人免费视频网站高清观看视频| 国产精品一级片| 成人激情黄色小说| 国产丝袜在线精品| 国产精品日韩精品欧美在线| 国产欧美一区二区精品久导航 | 亚洲精品一二三四区| 一区二区三区在线视频播放| 亚洲成人久久影院| 麻豆成人免费电影| 国产91富婆露脸刺激对白| 成人免费毛片高清视频| 色综合亚洲欧洲| 欧美日韩成人一区| 26uuu国产一区二区三区| 久久精品亚洲一区二区三区浴池| 国产精品女上位| 亚洲综合一区二区三区| 日韩高清国产一区在线| 国产成人a级片| 欧美又粗又大又爽| 精品精品国产高清a毛片牛牛| 国产欧美日韩精品一区| 一区二区三区四区在线播放| 日韩电影免费在线观看网站| 国产69精品久久久久毛片| 欧美亚一区二区| 精品国产污网站| 亚洲乱码国产乱码精品精可以看| 调教+趴+乳夹+国产+精品| 韩国女主播一区| 欧美性一区二区| 精品福利一二区| 亚洲精品视频一区| 国产精品888| 这里只有精品免费| 国产精品五月天| 欧美精品 国产精品| 国产精品视频yy9299一区| 天堂在线亚洲视频| 成人福利视频网站| 欧美一区二区视频网站| 中文字幕一区二区三区在线播放| 免费观看在线综合| 91精彩视频在线观看| 国产情人综合久久777777| 偷拍与自拍一区| 色综合天天综合狠狠| 久久久蜜桃精品| 亚洲成人午夜电影| av在线播放不卡| 26uuu亚洲婷婷狠狠天堂| 天天操天天色综合| 91色乱码一区二区三区| wwwwww.欧美系列| 日本vs亚洲vs韩国一区三区| 日本久久精品电影| 中文字幕中文字幕一区二区| 激情欧美一区二区三区在线观看| 欧美性猛交xxxx黑人交| 国产精品久久久久久久久果冻传媒 | 99国产精品国产精品久久| 精品国产污污免费网站入口| 偷拍一区二区三区四区| 色94色欧美sute亚洲13| 中文字幕在线视频一区| 国产美女主播视频一区| 欧美一级二级在线观看| 亚洲一区二区欧美日韩 | 欧美日韩一区二区三区不卡| 亚洲日本成人在线观看| 成人性生交大合| 久久九九影视网| 国产剧情在线观看一区二区| 欧美一区二区三区日韩视频| 亚洲成a人v欧美综合天堂下载| 色综合色综合色综合| 成人欧美一区二区三区视频网页 | 欧美精品 国产精品| 亚洲国产日韩一级| 欧美午夜精品免费| 一区二区免费看| 欧美亚洲禁片免费| 亚洲资源中文字幕| 欧美在线视频全部完| 一区二区国产视频| 欧美亚洲国产一卡| 午夜精品视频一区| 在线不卡a资源高清| 肉丝袜脚交视频一区二区| 欧美日韩不卡一区| 男男gaygay亚洲| 精品粉嫩aⅴ一区二区三区四区| 蜜桃久久久久久| 久久这里只有精品6| 国产精品性做久久久久久| 国产欧美日韩视频在线观看| 成人开心网精品视频| 中文字幕一区二区在线播放| 91激情在线视频| 亚洲成人先锋电影| 欧美xxxxxxxxx| 丰满少妇久久久久久久| 国产精品无圣光一区二区| 91麻豆产精品久久久久久| 一区二区免费看| 日韩片之四级片| 国产sm精品调教视频网站| 国产精品二三区| 欧美调教femdomvk| 狠狠狠色丁香婷婷综合激情 | 婷婷丁香激情综合| 2020国产精品久久精品美国| 成人福利视频网站| 亚洲h精品动漫在线观看| 日韩欧美亚洲国产精品字幕久久久| 国产黄色精品视频| 亚洲欧美激情一区二区| 欧美人与z0zoxxxx视频| 国产自产视频一区二区三区| 国产精品天天看| 欧美日本在线视频| 国产精品影视在线观看| 一区二区三区高清在线| 久久综合色鬼综合色| 99精品热视频| 蜜臀va亚洲va欧美va天堂| 欧美国产一区二区在线观看| 精品视频1区2区| 粉嫩av一区二区三区| 肉肉av福利一精品导航| 中文字幕av一区二区三区高 | 亚洲最大的成人av| 亚洲精品一区二区三区福利| 色综合久久中文字幕| 久久精品国产亚洲一区二区三区| 国产精品理伦片| 欧美一级黄色大片| 93久久精品日日躁夜夜躁欧美| 青青草成人在线观看| 91色porny| 一区二区三区四区中文字幕| 欧美日韩小视频| 国产成人精品影视| 中文字幕乱码亚洲精品一区| 激情综合色播五月| 成人污污视频在线观看| 午夜精品视频在线观看| 成人免费一区二区三区视频| 久久综合狠狠综合| 91精品婷婷国产综合久久性色|