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

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

?? nt_com.c

?? DD sample implements serial port support for the Virtual DOS Machine (VDM). Driver for windows. Tool
?? C
?? 第 1 頁 / 共 3 頁
字號(hào):
/*
 * NT_com.c - Windows NT serial interface
 *
 * This module handles serial input and output to Windows NT.
 *
 * copyright 1992, 1993 by Microsoft Corporation
 * portions copyright 1991 by Insignia Solutions Ltd., used by permission.
 *
 * revision history:
 *  24-Dec-1992 John Morgan:  written
 *              based (in part) on serial driver support from Windows NT VDM.
 *   4-Jan-1993 John Morgan:  added support for transmit buffering
 */

//
//    useful utility macros
//
#include "util_def.h"

//
//    standard library include files
//
#include <windows.h>

#include <math.h>
#include <malloc.h>
#include <stdlib.h>

//
//    COM_VDD specific include files
//
#include "com_vdd.h"
#include "pc_com.h"
#include "nt_com.h"
#include "vddsvc.h"


//
// Serial driver magic numbers
//
#define INPUT_QUEUE_SIZE    (4*1024)
#define OUTPUT_QUEUE_SIZE   100

#define  XON_CHARACTER   (17)           /* XON character, Cntrl-Q */
#define  XOFF_CHARACTER  (19)           /* XOFF character, Cntrl-S */

#define  REOPEN_DELAY    (36)           /* Reopen delay in 55ms (2 secs) */

//
// Serial status structure
//  this incorporates the UART status as a substucture
//
tHostCom host_com[NUM_SERIAL_PORTS];    /* 4 comm ports - the insignia MAX */


/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::: Wait for Comm Event ::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
static BOOL wait_comm( pHostCom current )
{
    ResetEvent( current->WaitOverlap.hEvent );

    if (WaitCommEvent( current->handle, &current->EvtMask, &current->WaitOverlap ))
        return TRUE;

    if (GetLastError() == ERROR_IO_PENDING)
        return GetOverlappedResult( current->handle, &current->WaitOverlap, NULL, TRUE );

    return FALSE;
}

/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::: Read Comm Port :::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
static BOOL read_comm( pHostCom current, DWORD *bytesread )
{

    ResetEvent( current->WaitOverlap.hEvent );

    if (ReadFile( current->handle, current->rx_buffer, RX_BUFFER_SIZE, bytesread, &current->RXOverlap ))
        return TRUE;

    if (GetLastError() == ERROR_IO_PENDING)
        return GetOverlappedResult( current->handle, &current->RXOverlap, NULL, TRUE );

    return FALSE;
}

#if (!XMIT_BUFFER)

/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::: Write Comm Port ::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
static BOOL write_comm( pHostCom current, BYTE *buffer, DWORD length )
{
    DWORD byteswritten;

    ResetEvent( current->WaitOverlap.hEvent );

    if (WriteFile( current->handle, buffer, length, &byteswritten, &current->TXOverlap ))
        return TRUE;

    if (GetLastError() == ERROR_IO_PENDING)
        return GetOverlappedResult( current->handle, &current->TXOverlap, NULL, TRUE );

    return FALSE;
}

#else

/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::: TX buffer pool :::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
// the number of transmit buffers available
#define NUM_TX_BUFFERS 4

typedef struct tTX_qitem
{
    struct tTX_qitem *next;      // pointer to next buffer (for queues)
    tTX_buffer buffer;
} tTX_qitem, *pTX_qitem;

static tTX_qitem  TX_q_buff[NUM_TX_BUFFERS];


/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::: TX transmit queues :::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
// queue selector type
typedef DWORD tQueueSel;

// the queue number for the free pool
#define NUM_TX_QUEUES (NUM_SERIAL_PORTS+1)
#define TX_FREE_QUEUE (NUM_TX_QUEUES-1)

typedef struct tTX_queue
{
    HANDLE wait[2];              // mutal exclusion & buffer available
    pTX_qitem head;
    pTX_qitem tail;
} tTX_queue, *pTX_queue;

static tTX_queue  TX_queue[NUM_TX_QUEUES];

static pTX_qitem TX_dequeue( tQueueSel queue_sel )
{
    pTX_queue queue = &TX_queue[queue_sel];
    pTX_qitem item;

    // wait until buffer available
    WaitForMultipleObjects( 2, queue -> wait, TRUE, INFINITE );
    if ((item = queue -> tail) != NULL)
    {
        if ((queue -> tail = item -> next) == NULL)
            queue -> head = NULL;
        item -> next = NULL;
    }
    ReleaseMutex( queue -> wait[0] );

    return item;
}

static void TX_enqueue( tQueueSel queue_sel, pTX_qitem item )
{
    pTX_queue queue = &TX_queue[queue_sel];

    WaitForSingleObject( queue -> wait[0], INFINITE );
    item -> next = NULL;
    if (queue -> head == NULL)
        queue -> tail = item;
    else
        queue -> head -> next = item;
    queue -> head = item;
    ReleaseSemaphore( queue -> wait[1], 1, NULL );
    ReleaseMutex( queue -> wait[0] );
}

/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*:::::::::::::::::::::::::::: transmit buffers ::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

// the maximum wait time before writing a buffer even if it isn't full
#define TX_BUFF_DELAY 130

static DWORD transmit_buffers( DWORD adapter )
{
    DWORD byteswritten;
    pTX_qitem item;

    while ((item = TX_dequeue( adapter )) != NULL)      // Get next buffer to transmit
    {
        // wait until full, or timeout
        if (WaitForMultipleObjects( 2, item -> buffer.wait, TRUE, TX_BUFF_DELAY ) == WAIT_TIMEOUT)
        {
            // must have mutual exclusion regardless
            WaitForSingleObject( item -> buffer.wait[0], INFINITE );
        }

        // signal that buffer has been written
        item -> buffer.adapter = TX_FREE_QUEUE;         // not a legal port number

        // OK to release now (WE DON'T HAVE TO WAIT FOR ACTUAL WRITE!)
        ReleaseMutex( item -> buffer.wait[0] );

        // Wait for previous write (if any to complete)
        WaitForSingleObject( item -> buffer.Overlap.hEvent, INFINITE);
        ResetEvent( item -> buffer.Overlap.hEvent );

        // write buffer to com port
        WriteFile( host_com[adapter].handle, item -> buffer.bytes, item -> buffer.byte_count,
            &byteswritten, &item -> buffer.Overlap );

        // now buffer should be moved to free pool
        TX_enqueue( TX_FREE_QUEUE, item );

    }

    // close buffer queue
    CloseHandle( TX_queue[adapter].wait[0] );
    CloseHandle( TX_queue[adapter].wait[1] );

    return TRUE;
}

static void post_transmit( tAdapter adapter, BYTE data )
{
    register pHostCom current = & host_com[adapter];
    pTX_buffer buffer;
    pTX_qitem item;

    // check to see if buffer available
    if ((buffer = current -> tx_buffer) != NULL && buffer -> adapter == adapter)
    {
        // get mutual exclusion on buffer
        WaitForSingleObject( buffer -> wait[0], INFINITE );

        // check for buffer written before we could get MX
        if (buffer -> adapter == adapter)
        {
            // add another byte
            buffer -> bytes[(buffer -> byte_count)++] = data;

            // signal if buffer full
            if ((int)(buffer -> byte_count) >= current -> TX_full_length)
            {
                SetEvent( buffer -> wait[1] );
                current -> tx_buffer = NULL;
            }

            // release buffer MX
            ReleaseMutex( buffer -> wait[0] );

            return;
        }

        // Oops buffer written, but no harm done.
        ReleaseMutex( buffer -> wait[0] );
    }

    // expand buffer size by one character
    if (++(current -> TX_full_length) > TX_BUFFER_SIZE)
        current -> TX_full_length = TX_BUFFER_SIZE;

    // buffer written or unavailable.
    item = TX_dequeue( TX_FREE_QUEUE );
    item -> buffer.adapter = adapter;
    item -> buffer.bytes[0] = data;
    if ((int)(item -> buffer.byte_count = 1) >= current -> TX_full_length)
    {
        SetEvent( item -> buffer.wait[1] );        // signal buffer full
        current -> tx_buffer = NULL;
    }
    else
    {
        ResetEvent( item -> buffer.wait[1] );      // buffer not full
        current -> tx_buffer = &(item -> buffer);
    }
    TX_enqueue( adapter, item );
}

static void shrink_TX_buffer( tAdapter adapter )
{
    // collapse buffer by one character
    if (--(host_com[adapter].TX_full_length) < 0)
        host_com[adapter].TX_full_length = 0;
}

#endif //(XMIT_BUFFER)


/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*::::::::::::::::::: Enter critical section for adapter :::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void host_com_lock( tAdapter adapter )
{
    register pHostCom current = & host_com[adapter];
    if (current->host_adapter_status != HOST_ADAPTER_OPEN)
        return;  /* Exit, NULL adapter */

    EnterCriticalSection(&current->AdapterLock);
    current->AdapterLockCnt++;
}

/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本人妖一区二区| 美腿丝袜一区二区三区| 日韩免费看的电影| 99国产精品视频免费观看| 日韩高清一级片| 国产精品初高中害羞小美女文| 日韩写真欧美这视频| 在线免费观看日本一区| 成人性视频免费网站| 久久国产尿小便嘘嘘| 亚洲国产一区二区三区| 国产精品久久久久影视| 精品乱人伦小说| 欧美日本一道本| 色综合中文字幕国产 | 99v久久综合狠狠综合久久| 日本亚洲免费观看| 亚洲一区二区三区中文字幕| 国产精品毛片久久久久久| 欧美电影免费观看完整版| 欧美日韩视频专区在线播放| 色婷婷久久一区二区三区麻豆| 成人中文字幕在线| 国产69精品久久久久毛片| 极品美女销魂一区二区三区 | 一区二区三区av电影| 99re热视频精品| 国产激情偷乱视频一区二区三区 | 亚洲一区二区3| 自拍偷拍国产亚洲| 中文字幕永久在线不卡| 中文字幕av一区二区三区| 久久免费的精品国产v∧| 欧美v亚洲v综合ⅴ国产v| 欧美一区二区三区电影| 欧美日韩国产成人在线91| 色94色欧美sute亚洲线路一ni| 99视频在线精品| 99久久伊人精品| 99精品热视频| 国产精品一色哟哟哟| 国内外成人在线| 国产精品综合二区| 国产成人夜色高潮福利影视| 国产精品资源在线观看| 国产成人精品影院| 成人av在线看| 99久久99久久精品免费看蜜桃| 欧美午夜精品免费| 91成人网在线| 欧美日产在线观看| 日韩丝袜情趣美女图片| 精品国产免费人成在线观看| 欧美精品一区二区三区很污很色的 | 成人av在线播放网址| 99久久久无码国产精品| 日本精品一级二级| 欧美三级一区二区| 日韩一二三四区| 久久伊人蜜桃av一区二区| 精品久久国产字幕高潮| 欧美一级片在线看| 日本在线不卡视频| 奇米精品一区二区三区在线观看一| 久久精品国产色蜜蜜麻豆| 国产乱一区二区| 91美女在线看| 337p亚洲精品色噜噜| ww亚洲ww在线观看国产| 国产精品乱码久久久久久| 亚洲综合色在线| 蜜桃视频第一区免费观看| 成人中文字幕电影| 欧美日韩大陆一区二区| 欧美va亚洲va| 亚洲女女做受ⅹxx高潮| 日本亚洲欧美天堂免费| 成人av高清在线| 欧美日韩高清一区二区不卡| 久久久精品日韩欧美| 亚洲综合色自拍一区| 国内外成人在线| 色域天天综合网| 日韩精品影音先锋| 亚洲三级在线免费| 秋霞午夜av一区二区三区| 不卡av电影在线播放| 免费三级欧美电影| 日本一区二区三区四区| 亚洲欧洲99久久| 亚洲第一福利一区| 精品一区二区三区在线视频| 99久久精品99国产精品| 日韩一级欧美一级| 亚洲激情五月婷婷| 国产一区二区免费视频| 欧美丰满少妇xxxbbb| 国产精品伦一区| 久久电影网站中文字幕 | av不卡一区二区三区| 欧美一级二级三级蜜桃| 亚洲精品免费在线| 国产91综合网| 欧美一级xxx| 亚洲福利国产精品| 97超碰欧美中文字幕| 久久亚洲私人国产精品va媚药| 亚洲午夜免费电影| 99精品久久只有精品| 精品国产在天天线2019| 综合久久久久久| 国产成人亚洲精品青草天美| 制服视频三区第一页精品| 亚洲免费观看高清| av中文一区二区三区| 精品久久久久久综合日本欧美| 亚洲国产sm捆绑调教视频| 成人av资源在线| 国产亚洲综合av| 紧缚奴在线一区二区三区| 欧美精品一二三区| 亚洲高清免费在线| 在线免费观看视频一区| 亚洲精品写真福利| 91色乱码一区二区三区| 国产精品入口麻豆九色| 成人午夜电影网站| 亚洲国产精品国自产拍av| 国产在线麻豆精品观看| 日韩欧美亚洲另类制服综合在线| 午夜伦欧美伦电影理论片| 欧日韩精品视频| 亚洲综合久久av| 在线精品视频一区二区| 亚洲最新在线观看| 在线观看91精品国产入口| 亚洲精品视频观看| 色综合久久久久久久久| 综合网在线视频| 在线观看日韩av先锋影音电影院| 亚洲欧洲日本在线| 色综合久久综合| 一区二区三区精品在线观看| 色8久久精品久久久久久蜜| 玉米视频成人免费看| 在线免费观看日本一区| 丝袜诱惑制服诱惑色一区在线观看| 欧美日本一道本| 色综合激情久久| 色噜噜狠狠色综合欧洲selulu| ...中文天堂在线一区| 97se亚洲国产综合自在线| 亚洲免费视频成人| 欧美日韩精品免费| 奇米精品一区二区三区四区| 欧美成人精精品一区二区频| 国产精品一区二区男女羞羞无遮挡| 久久综合久久综合九色| av色综合久久天堂av综合| 亚洲最新在线观看| 日韩欧美精品在线视频| 成人avav影音| 亚洲一区二区中文在线| 日韩视频在线观看一区二区| 国产福利精品一区| 亚洲婷婷国产精品电影人久久| 欧美日韩欧美一区二区| 捆绑调教一区二区三区| 欧美国产精品一区| 欧美日韩三级一区| 国产专区综合网| 一区二区在线观看免费 | 欧洲av一区二区嗯嗯嗯啊| 蜜臀精品一区二区三区在线观看| 久久久精品2019中文字幕之3| 日本高清视频一区二区| 蜜臀99久久精品久久久久久软件| 国产欧美一二三区| 日本韩国欧美一区二区三区| 日本精品视频一区二区| 免费在线视频一区| 中文字幕第一区| 欧美性猛片aaaaaaa做受| 国产在线一区观看| 一区二区三区四区在线播放 | 男人操女人的视频在线观看欧美| 国产网站一区二区三区| 欧美视频中文字幕| 国产精品18久久久久久久久久久久| 亚洲欧洲av色图| 精品粉嫩超白一线天av| 色综合久久久久综合体| 韩国女主播一区| 天堂一区二区在线| 亚洲欧美在线视频| 亚洲精品在线一区二区| 欧美性欧美巨大黑白大战| 高潮精品一区videoshd| 久久精品久久久精品美女| 亚洲国产一区二区三区青草影视|