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

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

?? nt_com.c

?? DD sample implements serial port support for the Virtual DOS Machine (VDM). Driver for windows. Tool
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*
 * 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++;
}

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人精品二区三区99精品| 欧美亚洲免费在线一区| 午夜精品国产更新| 亚洲午夜在线观看视频在线| 亚洲人xxxx| 亚洲黄网站在线观看| 国产精品欧美久久久久无广告| 久久色在线视频| 久久久久久久久久久黄色| 精品国产乱码久久久久久闺蜜 | 国精产品一区一区三区mba桃花 | 国产精品白丝在线| 国产性做久久久久久| 亚洲欧洲国产专区| 亚洲伦理在线精品| 日本女人一区二区三区| 日韩精品电影一区亚洲| 久久99久久久久| 国内精品伊人久久久久影院对白| 狠狠色综合日日| 成人中文字幕合集| 欧洲一区二区三区免费视频| 欧美精品一卡两卡| 精品国产乱码久久久久久久久| 日本一区二区三区dvd视频在线| 国产精品国产精品国产专区不蜜| 一区二区三区加勒比av| 蜜臀av性久久久久蜜臀aⅴ四虎| 看片的网站亚洲| av在线播放成人| 在线不卡中文字幕| 中文字幕欧美三区| 日韩精品欧美精品| 成人免费黄色在线| 欧美日韩免费高清一区色橹橹| 精品国产一区二区三区久久影院 | 亚洲一区二区在线免费看| 亚洲超碰精品一区二区| 国产一区二区三区最好精华液| 色播五月激情综合网| 欧美本精品男人aⅴ天堂| 日韩理论片网站| 国产美女视频91| 欧美日韩成人综合| 中文字幕亚洲区| 精品一区二区成人精品| 欧美在线视频全部完| 日本一区二区三区久久久久久久久不| 亚洲午夜久久久久| 成人av综合一区| 久久久久国产精品麻豆| 视频一区二区三区在线| www.亚洲国产| 久久婷婷国产综合精品青草| 爽好久久久欧美精品| 91在线一区二区| 国产拍揄自揄精品视频麻豆| 首页亚洲欧美制服丝腿| 日本久久精品电影| 国产精品毛片久久久久久久| 麻豆91精品91久久久的内涵| 欧美三级在线看| 一区二区三区中文在线观看| 国产不卡视频在线观看| 日韩久久精品一区| 日本不卡视频在线| 欧美日韩五月天| 午夜一区二区三区视频| 91麻豆国产福利精品| ...xxx性欧美| a美女胸又www黄视频久久| 国产欧美视频在线观看| 国产一区在线精品| 欧美tickle裸体挠脚心vk| 亚洲成av人片在线| 欧美日韩国产片| 亚洲gay无套男同| 欧美日韩中文字幕精品| 亚洲国产精品自拍| 欧美一区二区三区免费视频| 午夜av电影一区| 日韩欧美在线影院| 免费人成在线不卡| 久久综合给合久久狠狠狠97色69| 精品一区二区三区在线播放视频 | 中文字幕高清不卡| 高清不卡在线观看| 亚洲色图一区二区三区| 91麻豆123| 午夜私人影院久久久久| 91精品国产黑色紧身裤美女| 麻豆传媒一区二区三区| 精品剧情v国产在线观看在线| 国产在线视视频有精品| 国产精品美女久久久久av爽李琼 | 国产一区二区在线免费观看| 国产三级一区二区| www.亚洲国产| 天天色图综合网| 欧美成人精品二区三区99精品| 国产精品亚洲人在线观看| 国产精品视频一二| 91久久香蕉国产日韩欧美9色| 亚洲va天堂va国产va久| 日韩欧美国产高清| 972aa.com艺术欧美| 日韩高清不卡在线| 国产欧美一区二区精品性色| 色中色一区二区| 国产做a爰片久久毛片| 亚洲九九爱视频| 久久综合九色综合97_久久久| 成人不卡免费av| 免费不卡在线观看| 亚洲欧美在线视频| 日韩免费高清av| 91久久精品网| 国产一区二区久久| 天堂成人国产精品一区| 国产欧美日韩精品在线| 欧美日韩亚洲高清一区二区| 国产成人99久久亚洲综合精品| 一区二区三区日韩欧美| 久久久久久日产精品| 6080日韩午夜伦伦午夜伦| 国产成人av一区二区| 日本成人中文字幕在线视频| 亚洲欧洲另类国产综合| 日韩一级完整毛片| 欧美亚洲一区二区在线| 国产成人亚洲综合a∨婷婷图片| 一区二区三区在线视频免费观看| 久久久一区二区三区| 欧美二区在线观看| 日本乱人伦aⅴ精品| 成人动漫视频在线| 国产成人精品在线看| 成人精品国产免费网站| 美女国产一区二区三区| 亚洲欧美偷拍卡通变态| 国产精品美女久久福利网站| 日韩欧美亚洲国产另类| 91精品国产综合久久精品性色| 91在线一区二区| 色综合婷婷久久| 成人免费视频app| 成人黄页毛片网站| 丁香婷婷综合网| 精品一区二区三区av| 蜜臀91精品一区二区三区| 午夜不卡av在线| 亚洲高清视频的网址| 亚洲一区二区在线免费观看视频| 亚洲少妇30p| 亚洲精品免费看| 一区二区三区 在线观看视频| 亚洲欧美一区二区三区孕妇| 国产精品国产a| 亚洲美女淫视频| 午夜精品视频一区| 蜜桃在线一区二区三区| 久久精品av麻豆的观看方式| 麻豆久久一区二区| 久久99国产精品久久| 国产曰批免费观看久久久| 国产精品888| 91丨九色porny丨蝌蚪| 在线中文字幕不卡| 在线播放国产精品二区一二区四区 | 亚洲天堂2016| 亚洲黄色小说网站| 天天影视网天天综合色在线播放| 久草精品在线观看| 成人精品在线视频观看| 91免费版在线看| 777亚洲妇女| 久久久久国产精品麻豆| 综合av第一页| 亚洲风情在线资源站| 蜜桃视频一区二区三区| 国产高清精品在线| 精品久久99ma| 国产精品久久久久婷婷| 玉足女爽爽91| 国产乱码字幕精品高清av| 97se狠狠狠综合亚洲狠狠| 欧美日韩一二三区| 国产日韩三级在线| 亚洲自拍偷拍网站| 国产精品自产自拍| 欧美日韩综合不卡| 欧美激情综合五月色丁香小说| 亚洲精品高清视频在线观看| 日本va欧美va精品| 99亚偷拍自图区亚洲| 日韩一区二区麻豆国产| 国产精品久久久久四虎| 日韩电影在线免费看| 国产69精品久久久久777| 在线91免费看|