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

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

?? io.c

?? 這個是一個開源項目, 有能力的人可以一起來寫
?? C
?? 第 1 頁 / 共 3 頁
字號:
  if (pIoPortWrite->sendBreak) {
    /* get BREAK char */

    dataChar.data.chr.type = RW_DATA_TYPE_CHR_BREAK;
    dataChar.data.chr.chr = 0;
    dataChar.data.chr.isChr = TRUE;
  } else {
    /* get XON or XOFF char */

    switch (pIoPortWrite->sendXonXoff) {
    case C0C_XCHAR_ON:
      dataChar.data.chr.type = RW_DATA_TYPE_CHR_XCHR;
      dataChar.data.chr.chr = pIoPortWrite->specialChars.XonChar;
      dataChar.data.chr.isChr = TRUE;
      break;
    case C0C_XCHAR_OFF:
      dataChar.data.chr.type = RW_DATA_TYPE_CHR_XCHR;
      dataChar.data.chr.chr = pIoPortWrite->specialChars.XoffChar;
      dataChar.data.chr.isChr = TRUE;
      break;
    default:
      dataChar.data.chr.type = RW_DATA_TYPE_CHR_NONE;
      dataChar.data.chr.isChr = FALSE;
    }
  }

  /* get first pIrpWrite */

  wasWrite = FALSE;
  doneWrite = 0;
  firstWrite = TRUE;

  if(startWrite) {
    dataIrpWrite.data.irp.pIrp = pQueueWrite->pCurrent;
    pCancelRoutineWrite = NULL;
  } else {
    dataIrpWrite.data.irp.pIrp =
        StartCurrentIrp(pQueueWrite, &pCancelRoutineWrite, &firstWrite);
  }

  /* read/write direct */

  while (dataIrpRead.data.irp.pIrp) {
    if (dataChar.data.chr.isChr) {
      if (!pWriteLimit || *pWriteLimit) {
        if (CAN_WRITE_RW_DATA_CHR(pIoPortWrite, dataChar)) {
          if (dataIrpRead.data.irp.status == STATUS_PENDING) {
            SIZE_T done = 0;

            ReadWriteDirect(dataIrpRead.data.irp.pIrp,
                            &dataChar,
                            &dataIrpRead.data.irp.status,
                            pIoPortRead,
                            pQueueToComplete,
                            pWriteLimit,
                            &doneRead, &done);

            if (done) {
              if (pWriteDelay)
                pWriteDelay->sentFrames += done;
            }
          }
        }
        else
        if (pWriteDelay) {
          pWriteDelay->sentFrames += *pWriteLimit;
          *pWriteLimit = 0;
        }
      }
    }

    while (dataIrpWrite.data.irp.pIrp) {
      if (IoGetCurrentIrpStackLocation(dataIrpWrite.data.irp.pIrp)->MajorFunction ==
                                                                IRP_MJ_FLUSH_BUFFERS)
      {
        dataIrpWrite.data.irp.status = STATUS_SUCCESS;
      } else {
        dataIrpWrite.data.irp.status = STATUS_PENDING;

        if (!pWriteLimit || *pWriteLimit) {
          if (!pIoPortWrite->writeHolding) {
            if (dataIrpRead.data.irp.status == STATUS_PENDING) {
              SIZE_T done = 0;

              ReadWriteDirect(dataIrpRead.data.irp.pIrp,
                              &dataIrpWrite,
                              &dataIrpRead.data.irp.status,
                              pIoPortRead,
                              pQueueToComplete,
                              pWriteLimit,
                              &doneRead, &done);

              if (done) {
                doneWrite += done;
                wasWrite = TRUE;

                if (pWriteDelay)
                  pWriteDelay->sentFrames += done;
              }
            }
          }
          else
          if (pWriteDelay) {
            pWriteDelay->sentFrames += *pWriteLimit;
            *pWriteLimit = 0;
          }
        }
      }

      if (dataIrpWrite.data.irp.status == STATUS_PENDING)
        break;

      if(startWrite && firstWrite) {
        status = dataIrpWrite.data.irp.status;
        ShiftQueue(pQueueWrite);
      } else {
        StopCurrentIrp(dataIrpWrite.data.irp.status, pCancelRoutineWrite, firstWrite,
                       doneWrite, pIoPortWrite, pQueueWrite, pQueueToComplete);
      }

      /* get next pIrpWrite */

      doneWrite = 0;
      firstWrite = FALSE;

      dataIrpWrite.data.irp.pIrp =
          StartCurrentIrp(pQueueWrite, &pCancelRoutineWrite, &firstWrite);
    }

    if (startRead && firstRead) {
      if (dataIrpRead.data.irp.status == STATUS_PENDING)
        dataIrpRead.data.irp.status =
            SetIrpTimeout(pIoPortRead, dataIrpRead.data.irp.pIrp);

      status = dataIrpRead.data.irp.status;

      if (dataIrpRead.data.irp.status != STATUS_PENDING)
        ShiftQueue(pQueueRead);
    } else {
      dataIrpRead.data.irp.status = StopCurrentIrp(
          dataIrpRead.data.irp.status, pCancelRoutineRead, firstRead,
          doneRead, pIoPortRead, pQueueRead, pQueueToComplete);
    }

    /* get next pIrpRead */

    if (dataIrpRead.data.irp.status != STATUS_PENDING) {
      dataIrpRead.data.irp.status = STATUS_PENDING;
      doneRead = 0;
      firstRead = FALSE;
      dataIrpRead.data.irp.pIrp =
          StartCurrentIrp(pQueueRead, &pCancelRoutineRead, &firstRead);
    } else {
      dataIrpRead.data.irp.pIrp = NULL;
    }
  }

  /* write to buffer */

  if (dataChar.data.chr.isChr) {
    if (!pWriteLimit || *pWriteLimit) {
      if (CAN_WRITE_RW_DATA_CHR(pIoPortWrite, dataChar)) {
        SIZE_T done = 0;

        WriteBuffer(&dataChar, pIoPortRead,
                    pQueueToComplete, pWriteLimit, &done);

        readBufBusyEnd = C0C_BUFFER_BUSY(&pIoPortRead->readBuf);

        if (readBufBusyBeg < readBufBusyEnd) {
          if ((pIoPortRead->waitMask & SERIAL_EV_RX80FULL) &&
              readBufBusyEnd > pIoPortRead->readBuf.size80 &&
              readBufBusyBeg <= pIoPortRead->readBuf.size80)
          {
            pIoPortRead->eventMask |= SERIAL_EV_RX80FULL;
            WaitComplete(pIoPortRead, pQueueToComplete);
          }

          UpdateHandFlow(pIoPortRead, FALSE, pQueueToComplete);
          readBufBusyBeg = readBufBusyEnd;
        }

        if (pIoPortRead->emuOverrun &&
            dataChar.data.chr.isChr &&
            CAN_WRITE_RW_DATA_CHR(pIoPortWrite, dataChar) &&
            C0C_BUFFER_BUSY(&pIoPortRead->readBuf) >= C0C_BUFFER_SIZE(&pIoPortRead->readBuf))
        {
          WriteOverrun(&dataChar, pIoPortRead,
                       pQueueToComplete, pWriteLimit, &done);
        }

        if (done) {
          if (pWriteDelay)
            pWriteDelay->sentFrames += done;
        }
      }
      else
      if (pWriteDelay) {
        pWriteDelay->sentFrames += *pWriteLimit;
        *pWriteLimit = 0;
      }
    }
  }

  if (!dataChar.data.chr.isChr) {
    switch (dataChar.data.chr.type) {
    case RW_DATA_TYPE_CHR_XCHR:
      pIoPortWrite->sendXonXoff = 0;
      break;
    case RW_DATA_TYPE_CHR_BREAK:
      if (pIoPortWrite->sendBreak) {
        pIoPortWrite->sendBreak = FALSE;
        if (pIoPortRead->escapeChar) {
          UCHAR lsr = 0x10;  /* break interrupt indicator */

          if (!pIoPortRead->amountInWriteQueue || pIoPortRead->writeHolding)
            lsr |= 0x60;  /* transmit holding register empty and transmitter empty indicators */

          InsertLsrMst(pIoPortRead, FALSE,  lsr, pQueueToComplete);
        }
        if (pIoPortRead->handFlow.FlowReplace & SERIAL_BREAK_CHAR)
          InsertChar(pIoPortRead, pIoPortRead->specialChars.BreakChar, pQueueToComplete);
      }
      break;
    }
  }

  while (dataIrpWrite.data.irp.pIrp) {
    if (IoGetCurrentIrpStackLocation(dataIrpWrite.data.irp.pIrp)->MajorFunction ==
                                                              IRP_MJ_FLUSH_BUFFERS)
    {
      dataIrpWrite.data.irp.status = STATUS_SUCCESS;
    } else {
      dataIrpWrite.data.irp.status = STATUS_PENDING;

      if (!pWriteLimit || *pWriteLimit) {
        if (!pIoPortWrite->writeHolding) {
          SIZE_T done = 0;

          WriteBuffer(&dataIrpWrite, pIoPortRead,
                      pQueueToComplete, pWriteLimit, &done);

          readBufBusyEnd = C0C_BUFFER_BUSY(&pIoPortRead->readBuf);

          if (readBufBusyBeg < readBufBusyEnd) {
            if ((pIoPortRead->waitMask & SERIAL_EV_RX80FULL) &&
                readBufBusyEnd > pIoPortRead->readBuf.size80 &&
                readBufBusyBeg <= pIoPortRead->readBuf.size80)
            {
              pIoPortRead->eventMask |= SERIAL_EV_RX80FULL;
              WaitComplete(pIoPortRead, pQueueToComplete);
            }

            UpdateHandFlow(pIoPortRead, FALSE, pQueueToComplete);
            readBufBusyBeg = readBufBusyEnd;
          }

          if (pIoPortRead->emuOverrun &&
              dataIrpWrite.data.irp.status == STATUS_PENDING &&
              !pIoPortWrite->writeHolding &&
              C0C_BUFFER_BUSY(&pIoPortRead->readBuf) >= C0C_BUFFER_SIZE(&pIoPortRead->readBuf))
          {
            WriteOverrun(&dataIrpWrite, pIoPortRead,
                         pQueueToComplete, pWriteLimit, &done);
          }

          if (done) {
            doneWrite += done;
            wasWrite = TRUE;

            if (pWriteDelay)
              pWriteDelay->sentFrames += done;
          }
        }
        else
        if (pWriteDelay) {
          pWriteDelay->sentFrames += *pWriteLimit;
          *pWriteLimit = 0;
        }
      }
    }

    if(startWrite && firstWrite) {
      if (dataIrpWrite.data.irp.status == STATUS_PENDING)
        dataIrpWrite.data.irp.status =
            SetIrpTimeout(pIoPortWrite, dataIrpWrite.data.irp.pIrp);

      status = dataIrpWrite.data.irp.status;

      if (dataIrpWrite.data.irp.status != STATUS_PENDING)
        ShiftQueue(pQueueWrite);
    } else {
      dataIrpWrite.data.irp.status =
          StopCurrentIrp(dataIrpWrite.data.irp.status, pCancelRoutineWrite, firstWrite,
                         doneWrite, pIoPortWrite, pQueueWrite, pQueueToComplete);
    }

    /* get next pIrpWrite */

    if (dataIrpWrite.data.irp.status != STATUS_PENDING) {
      doneWrite = 0;
      firstWrite = FALSE;
      dataIrpWrite.data.irp.pIrp = StartCurrentIrp(pQueueWrite, &pCancelRoutineWrite, &firstWrite);
    } else {
      dataIrpWrite.data.irp.pIrp = NULL;
    }
  }

  if (wasWrite && !pQueueWrite->pCurrent &&
      pIoPortWrite->waitMask & SERIAL_EV_TXEMPTY)
  {
    pIoPortWrite->eventMask |= SERIAL_EV_TXEMPTY;
    WaitComplete(pIoPortWrite, pQueueToComplete);
  }

  UpdateTransmitToggle(pIoPortWrite, pQueueToComplete);

  return status;
}

NTSTATUS ReadWrite(
    PC0C_IO_PORT pIoPortRead,
    BOOLEAN startRead,
    PC0C_IO_PORT pIoPortWrite,
    BOOLEAN startWrite,
    PLIST_ENTRY pQueueToComplete)
{
  NTSTATUS status;

  status = TryReadWrite(
      pIoPortRead, startRead,
      pIoPortWrite, startWrite,
      pQueueToComplete);

  pIoPortWrite->tryWrite = FALSE;

  while (pIoPortRead->tryWrite) {
    PC0C_IO_PORT pIoPortTmp;

    pIoPortTmp = pIoPortRead;
    pIoPortRead = pIoPortWrite;
    pIoPortWrite = pIoPortTmp;

    TryReadWrite(
        pIoPortRead, FALSE,
        pIoPortWrite, FALSE,
        pQueueToComplete);

    pIoPortWrite->tryWrite = FALSE;

    if (status == STATUS_PENDING && (startRead || startWrite))
      break;
  }

  return status;
}

VOID SetModemStatus(
    IN PC0C_IO_PORT pIoPort,
    IN ULONG bits,
    IN ULONG mask,
    PLIST_ENTRY pQueueToComplete)
{
  ULONG modemStatusOld;
  ULONG modemStatusChanged;

  modemStatusOld = pIoPort->modemStatus;

  pIoPort->modemStatus |= bits & mask;
  pIoPort->modemStatus &= ~(~bits & mask);

  /* DCD = DSR */
  if (pIoPort->modemStatus & C0C_MSB_DSR)
    pIoPort->modemStatus |= C0C_MSB_RLSD;
  else
    pIoPort->modemStatus &= ~C0C_MSB_RLSD;

  modemStatusChanged = modemStatusOld ^ pIoPort->modemStatus;

  if (modemStatusChanged) {
    TraceModemStatus(pIoPort);

    SetModemStatusHolding(pIoPort);

    if (pIoPort->escapeChar)
      InsertLsrMst(pIoPort, TRUE,
          (UCHAR)(pIoPort->modemStatus | (modemStatusChanged >> 4)), pQueueToComplete);

    if (modemStatusChanged & C0C_MSB_CTS)
      pIoPort->eventMask |= pIoPort->waitMask & SERIAL_EV_CTS;

    if (modemStatusChanged & C0C_MSB_DSR)
      pIoPort->eventMask |= pIoPort->waitMask & SERIAL_EV_DSR;

    if (modemStatusChanged & C0C_MSB_RING)
      pIoPort->eventMask |= pIoPort->waitMask & SERIAL_EV_RING;

    if (modemStatusChanged & C0C_MSB_RLSD)
      pIoPort->eventMask |= pIoPort->waitMask & SERIAL_EV_RLSD;

    WaitComplete(pIoPort, pQueueToComplete);
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人手机在线视频| 午夜久久久久久久久久一区二区| 一色桃子久久精品亚洲| 97精品久久久午夜一区二区三区| 91久久一区二区| 日韩欧美一级精品久久| 欧美国产精品一区二区三区| 亚洲第一福利视频在线| 极品瑜伽女神91| 色综合天天综合给合国产| 欧美一区二区三区在线观看 | 亚洲第一福利一区| 韩国精品在线观看| 91成人免费网站| 欧美精品一区二区三| 亚洲激情六月丁香| 3d动漫精品啪啪1区2区免费| 国产欧美日本一区视频| 亚洲图片欧美综合| 粉嫩久久99精品久久久久久夜| 欧美视频在线观看一区二区| 久久久久久久一区| 午夜成人免费视频| 成人aaaa免费全部观看| 日韩一区二区三区四区| 亚洲蜜桃精久久久久久久| 国产中文字幕一区| 欧美精品九九99久久| 亚洲欧洲国产日本综合| 黑人精品欧美一区二区蜜桃 | 91久久精品一区二区| 精品日韩欧美一区二区| 亚洲午夜精品在线| 成人精品高清在线| 日韩一区二区免费在线电影 | 在线播放欧美女士性生活| 国产精品色在线| 国产在线精品一区二区不卡了| 欧美日韩一级视频| 亚洲欧美日韩国产手机在线| 国产成人精品免费视频网站| 日韩欧美一区二区视频| 色久综合一二码| 国产精品青草久久| 国产呦精品一区二区三区网站| 欧美日本在线播放| 亚洲日本一区二区三区| 国产成人99久久亚洲综合精品| 日韩三级精品电影久久久| 亚洲午夜久久久| 在线一区二区三区四区五区| 国产精品美女久久久久久2018| 国产一区欧美日韩| 日韩欧美在线影院| 日韩av电影天堂| 欧美精品三级在线观看| 色又黄又爽网站www久久| 亚洲国产高清不卡| 国产成人在线视频网站| 久久男人中文字幕资源站| 国内精品嫩模私拍在线| 日韩欧美123| 久久国产精品无码网站| 日韩欧美第一区| 久久精品国产秦先生| 欧美xfplay| 韩国三级中文字幕hd久久精品| 欧美xfplay| 国产精品综合视频| 国产日韩欧美一区二区三区乱码| 国产麻豆成人精品| 久久久久久久久久久电影| 欧美α欧美αv大片| 麻豆91在线观看| 日韩三级中文字幕| 激情综合网激情| 2020国产精品| 国产成人精品亚洲午夜麻豆| 国产精品午夜在线观看| 成人av免费网站| 亚洲欧美日韩国产一区二区三区 | 亚洲成a人片在线不卡一二三区| 欧美色老头old∨ideo| 天堂在线一区二区| 日韩天堂在线观看| 久久夜色精品一区| 国产成a人无v码亚洲福利| 国产精品拍天天在线| 91免费国产在线观看| 亚洲风情在线资源站| 91精品国产麻豆国产自产在线| 美女久久久精品| 国产亚洲精品超碰| 91亚洲午夜精品久久久久久| 亚洲午夜成aⅴ人片| 日韩欧美www| 成人av免费在线播放| 一区二区日韩av| 欧美一级高清大全免费观看| 国产乱码精品一区二区三区av | 久久精品亚洲麻豆av一区二区 | 国产精品国产精品国产专区不片| 麻豆91在线观看| 久久久午夜精品理论片中文字幕| 国产成人av福利| 亚洲婷婷在线视频| 欧美日韩高清一区| 国产乱人伦偷精品视频不卡| 日韩美女啊v在线免费观看| 亚洲精品你懂的| 日韩一级免费一区| 成人在线视频首页| 亚洲成人7777| 久久精品一区四区| 欧美午夜免费电影| 激情成人综合网| 一区二区三国产精华液| 91精品国产欧美一区二区成人 | 亚洲欧洲三级电影| 4438成人网| 99久久精品国产一区二区三区| 日韩国产欧美视频| 国产精品久久一级| 日韩一区国产二区欧美三区| 中文字幕精品—区二区四季| 欧美理论片在线| 成人av免费网站| 久久99日本精品| 亚洲一区中文日韩| 久久综合狠狠综合| 欧美日韩不卡在线| 91精品国产品国语在线不卡| 国产自产2019最新不卡| 一区二区三区波多野结衣在线观看| 日韩一卡二卡三卡四卡| 色婷婷综合视频在线观看| 激情文学综合丁香| 一区二区三区资源| 国产亚洲精品bt天堂精选| 51精品国自产在线| 亚洲婷婷在线视频| 日韩精品一区二区在线| 在线免费观看日本一区| 国产美女精品一区二区三区| 亚洲777理论| 亚洲欧美日韩一区| 中文字幕va一区二区三区| 欧美大片顶级少妇| 欧美日韩久久一区二区| 91在线免费播放| 国产成人精品影院| 久久99精品久久只有精品| 午夜精品久久久久久久99水蜜桃| 国产精品高潮呻吟久久| 久久久国产精品麻豆| 日韩精品一区二区在线观看| 777色狠狠一区二区三区| 在线观看视频91| 日韩伦理免费电影| 国产日本欧美一区二区| 日韩精品一区二区三区老鸭窝| 欧美裸体一区二区三区| 欧美色精品在线视频| 色噜噜狠狠成人网p站| 成人av网站免费观看| 国产福利91精品一区二区三区| 美女脱光内衣内裤视频久久网站| 午夜不卡av免费| 亚洲一区二区三区四区五区黄 | av一区二区三区| 国产ts人妖一区二区| 国产综合久久久久久鬼色| 久久99精品久久久久久动态图 | 日本中文字幕一区| 午夜亚洲福利老司机| 亚洲一区二区在线观看视频| 一个色综合网站| 亚洲色图欧洲色图| 亚洲欧美日韩人成在线播放| 成人欧美一区二区三区白人| 国产精品国产三级国产| 国产精品欧美极品| 亚洲欧美自拍偷拍色图| 国产精品久久久久精k8| 国产精品久久久久久久裸模| 中文字幕一区二区三区在线观看| 国产精品视频线看| 成人一区二区视频| 成人午夜av影视| 99国产精品99久久久久久| 91在线视频播放| 欧美性一二三区| 欧美日韩精品福利| 7777精品伊人久久久大香线蕉经典版下载 | 中文字幕日韩av资源站| 亚洲日本va午夜在线影院| 亚洲乱码日产精品bd| 亚洲成av人综合在线观看| 日本不卡的三区四区五区| 九一九一国产精品|