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

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

?? xrmdd.c

?? wince 5.0下 實現PCI8串口卡驅動
?? C
?? 第 1 頁 / 共 5 頁
字號:
        } else {
            DEBUGMSG (ZONE_READ|ZONE_FLOW,
                      (TEXT("IOCTL:DTR_CONTROL_HANDSHAKE Setting DTR\r\n")));
            pSerialHead->DtrFlow = 0;
            pHWObj->pFuncTbl->HWSetDTR(pSerialHead->pHWHead);
        }
    }
    if ( pSerialHead->DCB.fRtsControl == RTS_CONTROL_HANDSHAKE ) {
        if ( (pSerialHead->RtsFlow) &&
             (4*RxBytesAvail(pSerialHead) > (3*RxLength(pSerialHead))) ) {
            DEBUGMSG (ZONE_READ|ZONE_FLOW,
                      (TEXT("IOCTL:RTS_CONTROL_HANDSHAKE Clearing RTS\r\n")));
            pSerialHead->RtsFlow = 1;
            pHWObj->pFuncTbl->HWClearRTS(pSerialHead->pHWHead);
        } else {
            DEBUGMSG (ZONE_READ|ZONE_FLOW,
                      (TEXT("IOCTL:RTS_CONTROL_HANDSHAKE Setting RTS\r\n")));
            pSerialHead->RtsFlow = 0;
            pHWObj->pFuncTbl->HWSetRTS(pSerialHead->pHWHead);
        }
    }

    if ( pSerialHead->DCB.fOutX || pSerialHead->DCB.fInX ) {
        pSerialHead->XFlow = 1;
    } else {
        pSerialHead->XFlow = 0;
    }
    return(TRUE);
}

// ****************************************************************
//
//	@doc EXTERNAL
//	@func		HANDLE | COM_INIT | Serial device initialization.
//
//	@parm 		ULONG  | Identifier | Port identifier.  The device loader
//				passes in the registry key that contains information
//				about the active device.
//
//	@remark		This routine is called at device load time in order
//	 			to perform any initialization.	 Typically the init
//				routine does as little as possible, postponing memory
//				allocation and device power-on to Open time.
//
//	 @rdesc		Returns a pointer to the serial head which is passed into 
//	 			the COM_OPEN and COM_DEINIT entry points as a device handle.
//
HANDLE
COM_Init(
        ULONG   Identifier
        )
{
    PVOID           pHWHead     = NULL;
    PHW_INDEP_INFO  pSerialHead = NULL;
    ULONG           HWBufferSize;
    DWORD           DevIndex;
    HKEY            hKey;
    ULONG           kreserved = 0, kvaluetype;
    ULONG           datasize = sizeof(ULONG);

    /*
     *	INTERNAL: this routine initializes the hardware abstraction interface
     *	via HWInit(). It allocates a data structure representing this
     *	instantiation of the device. It also creates an event and initializes
     *	a critical section for receiving as well as registering the logical
     *	interrupt dwIntID with NK via InterruptInitialize. This call
     *	requires that the hardware dependent portion export apis that return
     *	the physical address of the receive buffer and the size of that buffer.
     *	Finally, it creates a buffer to act as an intermediate
     *	buffer when receiving.
     */
    DEBUGMSG (ZONE_INIT | ZONE_FUNCTION, (TEXT("+COM_Init\r\n")));

    // Allocate our control structure.
    pSerialHead  =  (PHW_INDEP_INFO)LocalAlloc(LPTR, sizeof(HW_INDEP_INFO));

    // Check that LocalAlloc did stuff ok too.
    if ( !pSerialHead ) {
        DEBUGMSG(ZONE_INIT | ZONE_ERROR,
                 (TEXT("Error allocating memory for pSerialHead, COM_Init failed\n\r")));
        return(NULL);
    }

    // Initially, open list is empty.
    InitializeListHead( &pSerialHead->OpenList );
    InitializeCriticalSection(&(pSerialHead->OpenCS));
    pSerialHead->pAccessOwner = NULL;
    pSerialHead->fEventMask = 0;

    // Init CommTimeouts.
    pSerialHead->CommTimeouts.ReadIntervalTimeout = READ_TIMEOUT;
    pSerialHead->CommTimeouts.ReadTotalTimeoutMultiplier =
    READ_TIMEOUT_MULTIPLIER;
    pSerialHead->CommTimeouts.ReadTotalTimeoutConstant =
    READ_TIMEOUT_CONSTANT;
    pSerialHead->CommTimeouts.WriteTotalTimeoutMultiplier=  0;
    pSerialHead->CommTimeouts.WriteTotalTimeoutConstant =   0;

    /* Create tx and rx events and stash in global struct field. Check return.
     */
    pSerialHead->hSerialEvent = CreateEvent(0,FALSE,FALSE,NULL);
    pSerialHead->hKillDispatchThread = CreateEvent(0, FALSE, FALSE, NULL);
    pSerialHead->hTransmitEvent = CreateEvent(0, FALSE, FALSE, NULL);
    pSerialHead->hReadEvent = CreateEvent(0, FALSE, FALSE, NULL);

    if ( !pSerialHead->hSerialEvent || !pSerialHead->hKillDispatchThread ||
         !pSerialHead->hTransmitEvent || !pSerialHead->hReadEvent ) {
        DEBUGMSG(ZONE_ERROR | ZONE_INIT,
                 (TEXT("Error creating event, COM_Init failed\n\r")));
        LocalFree(pSerialHead);
        return(NULL);
    }

    /* Initialize the critical sections that will guard the parts of
     * the receive and transmit buffers.
     */
    InitializeCriticalSection(&(pSerialHead->ReceiveCritSec1));
    InitializeCriticalSection(&(pSerialHead->TransmitCritSec1));

    /* Want to use the Identifier to do RegOpenKey and RegQueryValue (?)
     * to get the index to be passed to GetHWObj.
     * The HWObj will also have a flag denoting whether to start the
     * listening thread or provide the callback.
     */
    DEBUGMSG (ZONE_INIT,(TEXT("Try to open %s\r\n"), (LPCTSTR)Identifier));
    hKey = OpenDeviceKey((LPCTSTR)Identifier);
    if ( !hKey ) {
        DEBUGMSG (ZONE_INIT | ZONE_ERROR,
                  (TEXT("Failed to open devkeypath, COM_Init failed\r\n")));
        LocalFree(pSerialHead);
        return(NULL);
    }

    datasize = sizeof(DWORD);

    if ( RegQueryValueEx(hKey, L"DeviceArrayIndex", NULL, &kvaluetype,
                         (LPBYTE)&DevIndex, &datasize) ) {
        DEBUGMSG (ZONE_INIT | ZONE_ERROR,
                  (TEXT("Failed to get DeviceArrayIndex value, COM_Init failed\r\n")));
        RegCloseKey (hKey);
        LocalFree(pSerialHead);
        return(NULL);
    }

    datasize = sizeof(DWORD);
    if ( RegQueryValueEx(hKey, L"Priority256", NULL, &kvaluetype,
                         (LPBYTE)&pSerialHead->Priority256, &datasize) ) {
        pSerialHead->Priority256 = DEFAULT_CE_THREAD_PRIORITY;
        DEBUGMSG (ZONE_INIT | ZONE_WARN,
                  (TEXT("Failed to get Priority256 value, defaulting to %d\r\n"), pSerialHead->Priority256));
    }

    RegCloseKey (hKey);

    DEBUGMSG (ZONE_INIT,
              (TEXT("DevIndex %X\r\n"), DevIndex));

    // Initialize hardware dependent data.
    pSerialHead->pHWObj = GetSerialObject( DevIndex );
    if ( !pSerialHead->pHWObj ) {
        DEBUGMSG(ZONE_ERROR | ZONE_INIT,
                 (TEXT("Error in GetSerialObject, COM_Init failed\n\r")));
        LocalFree(pSerialHead);
        return(NULL);
    }

    DEBUGMSG (ZONE_INIT, (TEXT("About to call HWInit(%s,0x%X)\r\n"),
                          Identifier, pSerialHead));
    pHWHead = pSerialHead->pHWObj->pFuncTbl->HWInit(Identifier, pSerialHead, pSerialHead->pHWObj);
    pSerialHead->pHWHead = pHWHead;

    /* Check that HWInit did stuff ok.  From here on out, call Deinit function
     * when things fail.
     */
    if ( !pHWHead ) {
        DEBUGMSG (ZONE_INIT | ZONE_ERROR,
                  (TEXT("Hardware doesn't init correctly, COM_Init failed\r\n")));
        COM_Deinit(pSerialHead);
        return(NULL);
    }
    DEBUGMSG (ZONE_INIT,
              (TEXT("Back from hardware init\r\n")));

    // Allocate at least twice the hardware buffer size so we have headroom
    HWBufferSize        = 2 * pSerialHead->pHWObj->pFuncTbl->HWGetRxBufferSize(pHWHead);

    // Init rx buffer and buffer length here.
    pSerialHead->RxBufferInfo.Length =
    HWBufferSize > RX_BUFFER_SIZE ? HWBufferSize:RX_BUFFER_SIZE;

    pSerialHead->RxBufferInfo.RxCharBuffer =
    LocalAlloc(LPTR, pSerialHead->RxBufferInfo.Length);

    if ( !pSerialHead->RxBufferInfo.RxCharBuffer ) {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
                 (TEXT("Error allocating receive buffer, COM_Init failed\n\r")));
        COM_Deinit(pSerialHead);
        return(NULL);
    }

    DEBUGMSG (ZONE_INIT, (TEXT("RxHead init'ed\r\n")));

    RxResetFifo(pSerialHead);

    InitializeCriticalSection(&(pSerialHead->RxBufferInfo.CS));
    InitializeCriticalSection(&(pSerialHead->TxBufferInfo.CS));
    DEBUGMSG (ZONE_INIT, (TEXT("RxBuffer init'ed with start at %x\r\n"),
                          pSerialHead->RxBufferInfo.RxCharBuffer));

    if ( pSerialHead->pHWObj->BindFlags & THREAD_AT_INIT ) {
        // Hook the interrupt and start the associated thread.
        if ( ! StartDispatchThread( pSerialHead ) ) {
            // Failed on InterruptInitialize or CreateThread.  Bail.
            COM_Deinit(pSerialHead);
            return(NULL);        
        }

    }

    // OK, now that everything is ready on our end, give the PDD
    // one last chance to init interrupts, etc.
    (void) pSerialHead->pHWObj->pFuncTbl->HWPostInit( pHWHead );

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

/*
 @doc EXTERNAL
 @func		HANDLE | COM_Open | Serial port driver initialization.
 *	Description: This routine must be called by the user to open the
 *	serial device. The HANDLE returned must be used by the application in
 *	all subsequent calls to the serial driver. This routine starts the thread
 *	which handles the serial events.
 *	Exported to users.
 *
 @rdesc This routine returns a HANDLE representing the device.
 */
HANDLE
COM_Open(
        HANDLE  pHead,          // @parm Handle returned by COM_Init.
        DWORD   AccessCode,     // @parm access code.
        DWORD   ShareMode       // @parm share mode - Not used in this driver.
        )
{
    PHW_INDEP_INFO  pSerialHead = (PHW_INDEP_INFO)pHead;
    PHW_OPEN_INFO   pOpenHead;
    PHWOBJ          pHWObj      = pSerialHead->pHWObj;

    DEBUGMSG (ZONE_OPEN|ZONE_FUNCTION, (TEXT("+COM_Open handle x%X, access x%X, share x%X\r\n"),
                                        pHead, AccessCode, ShareMode));

    // Return NULL if SerialInit failed.
    if ( !pSerialHead ) {
        DEBUGMSG (ZONE_OPEN|ZONE_ERROR,
                  (TEXT("Open attempted on uninited device!\r\n")));
        SetLastError(ERROR_INVALID_HANDLE);        
        return(NULL);
    }

    // Return NULL if opening with access & someone else already has
    if ( (AccessCode & (GENERIC_READ | GENERIC_WRITE)) &&
         pSerialHead->pAccessOwner ) {
        DEBUGMSG (ZONE_OPEN|ZONE_ERROR,
                  (TEXT("Open requested access %x, handle x%X already has x%X!\r\n"),
                   AccessCode, pSerialHead->pAccessOwner,
                   pSerialHead->pAccessOwner->AccessCode));
        SetLastError(ERROR_INVALID_ACCESS);        
        return(NULL);
    }

    // OK, lets allocate an open structure
    pOpenHead    =  (PHW_OPEN_INFO)LocalAlloc(LPTR, sizeof(HW_OPEN_INFO));
    if ( !pOpenHead ) {
        DEBUGMSG(ZONE_INIT | ZONE_ERROR,
                 (TEXT("Error allocating memory for pOpenHead, COM_Open failed\n\r")));
        return(NULL);
    }

    // Init the structure 
    pOpenHead->pSerialHead = pSerialHead;  // pointer back to our parent
    pOpenHead->StructUsers = 0;
    pOpenHead->AccessCode = AccessCode;
    pOpenHead->ShareMode = ShareMode;
    pOpenHead->CommEvents.hCommEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    pOpenHead->CommEvents.fEventMask = 0;
    pOpenHead->CommEvents.fEventData = 0;
    pOpenHead->CommEvents.fAbort = 0;
	InitializeCriticalSection(&(pOpenHead->CommEvents.EventCS));

    // if we have access permissions, note it in pSerialhead
    if ( AccessCode & (GENERIC_READ | GENERIC_WRITE) ) {
        DEBUGMSG(ZONE_INIT|ZONE_CLOSE,
                 (TEXT("COM_Open: Access permission handle granted x%X\n\r"),
                  pOpenHead));
        pSerialHead->pAccessOwner = pOpenHead;
    }

    // add this open entry to list of open entries.
    // Note that we hold the open CS for the duration of the routine since
    // all of our state info is in flux during this time.  In particular,
    // without the CS is would be possible for an open & close to be going on
    // simultaneously and have bad things happen like spinning a new event
    // thread before the old one was gone, etc.
    EnterCriticalSection(&(pSerialHead->OpenCS));
    InsertHeadList(&pSerialHead->OpenList,
                   &pOpenHead->llist);

    // If port not yet opened, we need to do some init
    if ( ! pSerialHead->OpenCnt ) {
        DEBUGMSG(ZONE_INIT|ZONE_OPEN,
                 (TEXT("COM_Open: First open : Do Init x%X\n\r"),
                  pOpenHead));

        if ( pSerialHead->pHWObj->BindFlags & THREAD_AT_OPEN ) {
            DEBUGMSG(ZONE_INIT|ZONE_OPEN,
                     (TEXT("COM_Open: Starting DispatchThread x%X\n\r"),
                      pOpenHead));
            // Hook the interrupt and start the associated thread.
            if ( ! StartDispatchThread( pSerialHead ) ) {
                // Failed on InterruptInitialize or CreateThread.  Bail.
                DEBUGMSG(ZONE_INIT|ZONE_OPEN,
                         (TEXT("COM_Open: Failed StartDispatchThread x%X\n\r"),
                          pOpenHead));
                goto OpenFail;
            }
        }

        pSerialHead->RxBytes = 0;
        pSerialHead->TxBytes = 0;
        pSerialHead->TxBytesPending = 0;
        pSerialHead->DroppedBytesMDD = 0;
        pSerialHead->DroppedBytesPDD = 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产高清一区| 粉嫩久久99精品久久久久久夜| 亚洲色图19p| 亚洲丝袜制服诱惑| 亚洲精品美腿丝袜| 一区二区三区四区av| 亚洲激情av在线| 亚洲国产另类av| 日本亚洲免费观看| 国内精品伊人久久久久影院对白| 麻豆精品国产91久久久久久| 美女mm1313爽爽久久久蜜臀| 久久99精品久久久久久动态图| 麻豆精品久久精品色综合| 激情久久五月天| 成人晚上爱看视频| 99国内精品久久| 欧美日韩亚洲丝袜制服| 欧美成人性战久久| 亚洲国产高清在线| 亚洲五码中文字幕| 精品亚洲欧美一区| av成人动漫在线观看| 91成人免费电影| 精品国产1区二区| 亚洲女同ⅹxx女同tv| 日本不卡视频在线| av成人免费在线观看| 欧美日本视频在线| 中文字幕av一区二区三区免费看 | 日韩一级二级三级| 国产午夜亚洲精品羞羞网站| 亚洲人成网站在线| 免费成人av在线| 一本久久精品一区二区| 欧美大黄免费观看| 亚洲午夜电影在线| 成人激情av网| 91精品国产91久久综合桃花 | 欧美日韩国产影片| 亚洲国产精品二十页| 亚洲风情在线资源站| 国产成人精品免费视频网站| 在线不卡欧美精品一区二区三区| 久久奇米777| 日本在线播放一区二区三区| av亚洲产国偷v产偷v自拍| 欧美精品一区二区三区蜜桃| 亚洲中国最大av网站| 不卡免费追剧大全电视剧网站| 欧美一区二区三区男人的天堂| 亚洲美女偷拍久久| 成人国产一区二区三区精品| 欧美成人艳星乳罩| 男女男精品视频| 久久精品综合网| 青青草视频一区| 欧美日韩一区二区在线观看视频| 中文字幕乱码日本亚洲一区二区| 久久精品国产免费看久久精品| 色激情天天射综合网| 中文字幕中文字幕中文字幕亚洲无线| 久久er99热精品一区二区| 欧美一区二区日韩| 水蜜桃久久夜色精品一区的特点 | 日韩欧美国产电影| 爽好久久久欧美精品| 欧美午夜寂寞影院| 亚洲成人资源网| 欧美日韩免费电影| 亚洲一区二区三区四区五区黄 | 欧美三级资源在线| 亚洲午夜精品在线| 欧美高清视频www夜色资源网| 一个色综合av| 欧美日韩一区在线| 日本成人在线电影网| 欧美一区中文字幕| 久久精品国内一区二区三区| 日韩精品中文字幕一区| 国产一区二区三区国产| 2022国产精品视频| 国产91精品一区二区麻豆亚洲| 久久久久久久久久久久久久久99| 国产伦理精品不卡| 国产精品国产三级国产有无不卡| 成人免费黄色在线| 亚洲精品国产第一综合99久久 | 蓝色福利精品导航| 久久久精品tv| 91香蕉视频在线| 亚洲电影你懂得| 久久综合久久综合九色| 不卡电影一区二区三区| 亚洲综合自拍偷拍| 欧美变态tickle挠乳网站| 国产精品99久久久久久宅男| 日韩理论片一区二区| 欧美日韩一卡二卡三卡| 久久99久久99精品免视看婷婷| 久久精品男人的天堂| 欧美亚男人的天堂| 国产精品原创巨作av| 亚洲欧美日韩国产一区二区三区 | 老司机精品视频在线| 国产三级精品三级| 欧美三级三级三级爽爽爽| 久久99久久久久| 一级日本不卡的影视| 精品国产1区2区3区| 91精品国产欧美一区二区| 成人精品视频.| 日本成人在线一区| 一区二区三区丝袜| 久久久www免费人成精品| 欧美系列一区二区| 国产精品白丝av| 蜜臀久久99精品久久久久久9| 国产精品高潮呻吟| 精品欧美乱码久久久久久1区2区| 色综合久久久久综合体桃花网| 麻豆精品在线观看| 亚洲福利电影网| 一区二区中文视频| 久久久久久99久久久精品网站| 欧美日韩在线免费视频| av亚洲精华国产精华精华| 国产一区二区三区综合| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲天堂成人在线观看| 国产日韩一级二级三级| 久久综合九色综合欧美就去吻| 欧美日韩精品欧美日韩精品| 色综合网站在线| 91小视频在线| av一区二区三区四区| 国产福利精品一区二区| 精品在线你懂的| 美国毛片一区二区三区| 日本欧美大码aⅴ在线播放| 午夜欧美电影在线观看| 亚洲永久精品大片| 亚洲精品免费在线| 亚洲自拍偷拍欧美| 五月婷婷激情综合| 天堂一区二区在线免费观看| 亚洲一级二级三级| 亚洲动漫第一页| 亚洲成人综合网站| 午夜成人免费电影| 免费成人av在线| 激情五月播播久久久精品| 国产在线精品一区二区不卡了| 经典三级一区二区| 国产精品一级片在线观看| 国产99久久久国产精品潘金| 成人永久免费视频| 成人性生交大片免费看视频在线| 国产91精品在线观看| 成人app软件下载大全免费| 不卡av电影在线播放| av影院午夜一区| 欧美日韩一级视频| 欧美一区二区福利在线| 久久综合中文字幕| 国产精品成人一区二区三区夜夜夜| 国产精品激情偷乱一区二区∴| 中文字幕中文字幕中文字幕亚洲无线| 亚洲人成影院在线观看| 免费欧美高清视频| 高清av一区二区| 欧美综合亚洲图片综合区| 91精品国产综合久久香蕉的特点 | 成人免费视频播放| 日本久久一区二区三区| 91精品国产入口在线| 中文字幕成人网| 亚洲bdsm女犯bdsm网站| 精品伊人久久久久7777人| 成人精品高清在线| 欧美日韩高清一区| 国产亚洲一二三区| 亚洲国产中文字幕在线视频综合| 久久国产综合精品| 91视频免费播放| 日韩欧美久久一区| 亚洲女同ⅹxx女同tv| 久色婷婷小香蕉久久| 91黄色免费看| 久久精品亚洲乱码伦伦中文| 伊人色综合久久天天人手人婷| 激情综合网最新| 欧美在线不卡视频| 久久精品亚洲国产奇米99| 亚洲成人av一区二区三区| 丰满亚洲少妇av| 日韩亚洲国产中文字幕欧美| 亚洲男女毛片无遮挡| 国产一区二区精品久久91| 欧美日本在线播放|