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

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

?? adddev.c

?? 這個是一個開源項(xiàng)目, 有能力的人可以一起來寫
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * $Id: adddev.c,v 1.23 2006/11/23 11:10:10 vfrolov Exp $
 *
 * Copyright (c) 2004-2006 Vyacheslav Frolov
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *
 * $Log: adddev.c,v $
 * Revision 1.23  2006/11/23 11:10:10  vfrolov
 * Strict usage fixed port numbers
 *
 * Revision 1.22  2006/11/03 13:13:26  vfrolov
 * CopyStrW() now gets size in characters (not in bytes)
 *
 * Revision 1.21  2006/11/02 16:04:50  vfrolov
 * Added using fixed port numbers
 *
 * Revision 1.20  2006/10/16 08:30:45  vfrolov
 * Added the device interface registration
 *
 * Revision 1.19  2006/10/13 10:22:22  vfrolov
 * Changed name of device object (for WMI)
 *
 * Revision 1.18  2006/10/10 15:18:15  vfrolov
 * Added PortName value setting for WMI
 *
 * Revision 1.17  2006/08/23 13:48:12  vfrolov
 * Implemented WMI functionality
 *
 * Revision 1.16  2006/06/23 11:44:52  vfrolov
 * Mass replacement pDevExt by pIoPort
 *
 * Revision 1.15  2006/06/21 16:23:57  vfrolov
 * Fixed possible BSOD after one port of pair removal
 *
 * Revision 1.14  2006/03/29 09:39:28  vfrolov
 * Fixed possible usage uninitialized portName
 *
 * Revision 1.13  2006/03/27 09:38:23  vfrolov
 * Utilized StrAppendDeviceProperty()
 *
 * Revision 1.12  2006/02/26 08:35:55  vfrolov
 * Added check for start/stop queue matching
 *
 * Revision 1.11  2006/01/10 10:17:23  vfrolov
 * Implemented flow control and handshaking
 * Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF
 * Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue
 *   fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS
 *
 * Revision 1.10  2005/09/27 16:41:01  vfrolov
 * Fixed DeviceType
 *
 * Revision 1.9  2005/09/06 07:23:44  vfrolov
 * Implemented overrun emulation
 *
 * Revision 1.8  2005/08/23 15:49:21  vfrolov
 * Implemented baudrate emulation
 *
 * Revision 1.7  2005/08/16 16:36:33  vfrolov
 * Hidden timeout functions
 *
 * Revision 1.6  2005/07/14 13:51:08  vfrolov
 * Replaced ASSERT by HALT_UNLESS
 *
 * Revision 1.5  2005/07/13 16:12:36  vfrolov
 * Added c0cGlobal struct for global driver's data
 *
 * Revision 1.4  2005/06/28 12:17:12  vfrolov
 * Added pBusExt to C0C_PDOPORT_EXTENSION
 *
 * Revision 1.3  2005/05/20 12:06:05  vfrolov
 * Improved port numbering
 *
 * Revision 1.2  2005/05/12 07:41:27  vfrolov
 * Added ability to change the port names
 *
 * Revision 1.1  2005/01/26 12:18:54  vfrolov
 * Initial revision
 *
 */

#include "precomp.h"
#include <initguid.h>
#include <ntddser.h>
#include "timeout.h"
#include "delay.h"
#include "strutils.h"

/*
 * FILE_ID used by HALT_UNLESS to put it on BSOD
 */
#define FILE_ID 6

NTSTATUS InitCommonExt(
    PC0C_COMMON_EXTENSION pDevExt,
    IN PDEVICE_OBJECT pDevObj,
    short doType,
    PWCHAR pPortName)
{
  pDevExt->pDevObj = pDevObj;
  pDevExt->doType = doType;
  return CopyStrW(pDevExt->portName, sizeof(pDevExt->portName)/sizeof(pDevExt->portName[0]), pPortName);
}

VOID RemoveFdoPort(IN PC0C_FDOPORT_EXTENSION pDevExt)
{
  if (pDevExt->pIoPortLocal) {
    FreeTimeouts(pDevExt->pIoPortLocal);
    FreeWriteDelay(pDevExt->pIoPortLocal);
    pDevExt->pIoPortLocal->pDevExt = NULL;
  }

  IoWMIRegistrationControl(pDevExt->pDevObj, WMIREG_ACTION_DEREGISTER);

  if (pDevExt->symbolicLinkName.Buffer) {
    IoSetDeviceInterfaceState(&pDevExt->symbolicLinkName, FALSE);
    RtlFreeUnicodeString(&pDevExt->symbolicLinkName);
  }

  if (pDevExt->ntDeviceName.Buffer) {
    RtlDeleteRegistryValue(RTL_REGISTRY_DEVICEMAP, C0C_SERIAL_DEVICEMAP,
                           pDevExt->ntDeviceName.Buffer);
    StrFree(&pDevExt->ntDeviceName);
  }

  if (pDevExt->win32DeviceName.Buffer) {
    IoDeleteSymbolicLink(&pDevExt->win32DeviceName);
    StrFree(&pDevExt->win32DeviceName);
  }

  if (pDevExt->pLowDevObj)
    IoDetachDevice(pDevExt->pLowDevObj);

  Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"RemoveFdoPort");

  IoDeleteDevice(pDevExt->pDevObj);
}

NTSTATUS AddFdoPort(IN PDRIVER_OBJECT pDrvObj, IN PDEVICE_OBJECT pPhDevObj)
{
  NTSTATUS status;
  UNICODE_STRING portName;
  PDEVICE_OBJECT pNewDevObj;
  PC0C_FDOPORT_EXTENSION pDevExt;
  PC0C_PDOPORT_EXTENSION pPhDevExt;
  ULONG emuBR, emuOverrun;
  UNICODE_STRING ntDeviceName;
  PWCHAR pPortName;

  status = STATUS_SUCCESS;
  pDevExt = NULL;
  RtlInitUnicodeString(&portName, NULL);
  RtlInitUnicodeString(&ntDeviceName, NULL);

  StrAppendDeviceProperty(&status, &ntDeviceName, pPhDevObj, DevicePropertyPhysicalDeviceObjectName);

  if (!NT_SUCCESS(status)) {
    SysLog(pPhDevObj, status, L"AddFdoPort IoGetDeviceProperty FAIL");
    goto clean;
  }

  pPhDevExt = (PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension;

  if (pPhDevExt->doType != C0C_DOTYPE_PP) {
    status = STATUS_UNSUCCESSFUL;
    SysLog(pPhDevObj, status, L"AddFdoPort FAIL. Type  of PDO is not PP");
    goto clean;
  }

  Trace00((PC0C_COMMON_EXTENSION)pPhDevExt, L"AddFdoPort for ", ntDeviceName.Buffer);

  pPortName = pPhDevExt->portName;

  if (!*pPortName) {
    status = STATUS_UNSUCCESSFUL;
    SysLog(pPhDevObj, status, L"AddFdoPort FAIL. The PDO has invalid port name");
    goto clean;
  }

  {
    UNICODE_STRING portRegistryPath;

    RtlInitUnicodeString(&portRegistryPath, NULL);
    StrAppendStr(&status, &portRegistryPath, c0cGlobal.registryPath.Buffer, c0cGlobal.registryPath.Length);
    StrAppendStr0(&status, &portRegistryPath, L"\\Parameters\\");
    StrAppendStr0(&status, &portRegistryPath, pPortName);

    if (NT_SUCCESS(status)) {
      WCHAR portNameBuf[C0C_PORT_NAME_LEN + 1];
      UNICODE_STRING portNameTmp;
      RTL_QUERY_REGISTRY_TABLE queryTable[2];

      RtlZeroMemory(queryTable, sizeof(queryTable));

      portNameTmp.Length = 0;
      portNameTmp.MaximumLength = sizeof(portNameBuf);
      portNameTmp.Buffer = portNameBuf;

      queryTable[0].Flags        = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
      queryTable[0].Name         = L"PortName";
      queryTable[0].EntryContext = &portNameTmp;

      status = RtlQueryRegistryValues(
          RTL_REGISTRY_ABSOLUTE,
          portRegistryPath.Buffer,
          queryTable,
          NULL,
          NULL);

      if (!NT_SUCCESS(status) || !portNameTmp.Length) {
        status = STATUS_SUCCESS;
        StrAppendStr0(&status, &portName, pPortName);
      } else {
        StrAppendStr(&status, &portName, portNameTmp.Buffer, portNameTmp.Length);
        Trace00((PC0C_COMMON_EXTENSION)pPhDevExt, L"PortName set to ", portName.Buffer);
      }
    }

    emuBR = emuOverrun = 0;

    if (NT_SUCCESS(status)) {
      RTL_QUERY_REGISTRY_TABLE queryTable[3];
      ULONG zero = 0;

      RtlZeroMemory(queryTable, sizeof(queryTable));

      queryTable[0].Flags         = RTL_QUERY_REGISTRY_DIRECT;
      queryTable[0].Name          = L"EmuBR";
      queryTable[0].EntryContext  = &emuBR;
      queryTable[0].DefaultType   = REG_DWORD;
      queryTable[0].DefaultData   = &zero;
      queryTable[0].DefaultLength = sizeof(ULONG);

      queryTable[1].Flags         = RTL_QUERY_REGISTRY_DIRECT;
      queryTable[1].Name          = L"EmuOverrun";
      queryTable[1].EntryContext  = &emuOverrun;
      queryTable[1].DefaultType   = REG_DWORD;
      queryTable[1].DefaultData   = &zero;
      queryTable[1].DefaultLength = sizeof(ULONG);

      RtlQueryRegistryValues(
          RTL_REGISTRY_ABSOLUTE,
          portRegistryPath.Buffer,
          queryTable,
          NULL,
          NULL);
    }

    StrFree(&portRegistryPath);
  }

  if (!NT_SUCCESS(status)) {
    SysLog(pPhDevObj, status, L"AddFdoPort FAIL");
    goto clean;
  }

  {
    HANDLE hKey;

    status = IoOpenDeviceRegistryKey(pPhDevObj,
                                     PLUGPLAY_REGKEY_DEVICE,
                                     STANDARD_RIGHTS_READ,
                                     &hKey);

    if (status == STATUS_SUCCESS) {
      UNICODE_STRING keyName;

      RtlInitUnicodeString(&keyName, L"PortName");

      status = ZwSetValueKey(hKey, &keyName, 0, REG_SZ, portName.Buffer, portName.Length + sizeof(WCHAR));

      if (!NT_SUCCESS(status))
        SysLog(pPhDevObj, status, L"ZwSetValueKey(PortName) FAIL");

      ZwClose(hKey);
    } else {
      SysLog(pPhDevObj, status, L"IoOpenDeviceRegistryKey(PLUGPLAY_REGKEY_DEVICE) FAIL");
    }
  }

  status = IoCreateDevice(pDrvObj,
                          sizeof(*pDevExt),
                          NULL,
                          FILE_DEVICE_SERIAL_PORT,
                          FILE_DEVICE_SECURE_OPEN,
                          TRUE,
                          &pNewDevObj);

  if (!NT_SUCCESS(status)) {
    SysLog(pPhDevObj, status, L"AddFdoPort IoCreateDevice FAIL");
    goto clean;
  }

  HALT_UNLESS(pNewDevObj);
  pDevExt = pNewDevObj->DeviceExtension;
  RtlZeroMemory(pDevExt, sizeof(*pDevExt));
  status = InitCommonExt((PC0C_COMMON_EXTENSION)pDevExt, pNewDevObj, C0C_DOTYPE_FP, portName.Buffer);

  if (!NT_SUCCESS(status)) {
    SysLog(pPhDevObj, status, L"AddFdoPort FAIL");
    goto clean;
  }

  pDevExt->pIoPortLocal = pPhDevExt->pIoPortLocal;
  pDevExt->pIoPortLocal->pDevExt = pDevExt;

  if (emuBR) {
    if (NT_SUCCESS(AllocWriteDelay(pDevExt->pIoPortLocal)))
      Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled baudrate emulation");
    else
      SysLog(pPhDevObj, status, L"AddFdoPort AllocWriteDelay FAIL");
  } else {
    Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled baudrate emulation");
  }

  if (emuOverrun) {
    pDevExt->pIoPortLocal->emuOverrun = TRUE;
    Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled overrun emulation");
  } else {
    pDevExt->pIoPortLocal->emuOverrun = FALSE;
    Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled overrun emulation");
  }

  AllocTimeouts(pDevExt->pIoPortLocal);

  KeInitializeSpinLock(&pDevExt->controlLock);

  RtlZeroMemory(&pDevExt->pIoPortLocal->specialChars, sizeof(pDevExt->pIoPortLocal->specialChars));
  pDevExt->pIoPortLocal->specialChars.XonChar      = 0x11;
  pDevExt->pIoPortLocal->specialChars.XoffChar     = 0x13;

  RtlZeroMemory(&pDevExt->pIoPortLocal->handFlow, sizeof(pDevExt->pIoPortLocal->handFlow));
  pDevExt->pIoPortLocal->handFlow.ControlHandShake = SERIAL_DTR_CONTROL;
  pDevExt->pIoPortLocal->handFlow.FlowReplace      = SERIAL_RTS_CONTROL;

  pDevExt->lineControl.WordLength    = 7;
  pDevExt->lineControl.Parity        = EVEN_PARITY;
  pDevExt->lineControl.StopBits      = STOP_BIT_1;
  pDevExt->baudRate.BaudRate         = 1200;

  SetWriteDelay(pDevExt->pIoPortLocal);

  pDevExt->pPhDevObj = pPhDevObj;
  pDevExt->pLowDevObj = IoAttachDeviceToDeviceStack(pNewDevObj, pPhDevObj);

  if (!pDevExt->pLowDevObj) {
    status = STATUS_NO_SUCH_DEVICE;
    SysLog(pPhDevObj, status, L"AddFdoPort IoAttachDeviceToDeviceStack FAIL");
    goto clean;
  }

  pNewDevObj->Flags &= ~DO_DEVICE_INITIALIZING;
  pNewDevObj->Flags |= DO_BUFFERED_IO;

  /* Create symbolic links to device */

  RtlInitUnicodeString(&pDevExt->ntDeviceName, NULL);
  StrAppendStr0(&status, &pDevExt->ntDeviceName, ntDeviceName.Buffer);

  RtlInitUnicodeString(&pDevExt->win32DeviceName, NULL);
  StrAppendStr0(&status, &pDevExt->win32DeviceName, C0C_PREF_WIN32_DEVICE_NAME);
  StrAppendStr0(&status, &pDevExt->win32DeviceName, portName.Buffer);

  if (NT_SUCCESS(status)) {
    status = IoCreateSymbolicLink(&pDevExt->win32DeviceName, &pDevExt->ntDeviceName);

    if (NT_SUCCESS(status)) {
      status = RtlWriteRegistryValue(RTL_REGISTRY_DEVICEMAP, C0C_SERIAL_DEVICEMAP,
                                     pDevExt->ntDeviceName.Buffer, REG_SZ,
                                     portName.Buffer,
                                     portName.Length + sizeof(WCHAR));

      if (!NT_SUCCESS(status)) {
        StrFree(&pDevExt->ntDeviceName);

        SysLog(pPhDevObj, status, L"AddFdoPort RtlWriteRegistryValue" C0C_SERIAL_DEVICEMAP L" FAIL");
      }
    } else {
      StrFree(&pDevExt->win32DeviceName);
      StrFree(&pDevExt->ntDeviceName);

      SysLog(pPhDevObj, status, L"AddFdoPort IoCreateSymbolicLink FAIL");
    }
  } else {
    StrFree(&pDevExt->win32DeviceName);
    StrFree(&pDevExt->ntDeviceName);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品国产视频| 亚洲伦理在线精品| 欧美一区二区三区成人| 欧美日韩免费观看一区二区三区| 99久久久精品免费观看国产蜜| 国产精品一区二区久久不卡| 激情偷乱视频一区二区三区| 国产在线国偷精品产拍免费yy| 美女视频第一区二区三区免费观看网站 | 91精品国产手机| 宅男噜噜噜66一区二区66| 欧美日本一区二区| 7777精品伊人久久久大香线蕉 | 久久久久久久综合日本| 久久亚洲影视婷婷| 欧美韩日一区二区三区| 欧美国产精品一区二区三区| 一区精品在线播放| 洋洋av久久久久久久一区| 亚洲成av人片在线观看无码| 亚洲.国产.中文慕字在线| 日本最新不卡在线| 国产久卡久卡久卡久卡视频精品| 国产成人一级电影| 波波电影院一区二区三区| 色综合色综合色综合色综合色综合| 欧美亚洲动漫精品| 欧美一卡二卡在线| 国产亚洲综合性久久久影院| 成人欧美一区二区三区黑人麻豆| 一区二区三区 在线观看视频| 亚洲成年人网站在线观看| 九九九精品视频| 成人午夜激情片| 欧美日韩一区高清| 精品国产一区二区三区忘忧草 | 久久精品免费在线观看| 亚洲男人的天堂一区二区| 午夜精品视频一区| 国产一区激情在线| 91高清视频在线| 精品国产成人系列| 亚洲免费成人av| 青青草国产成人av片免费| 成人午夜av电影| 欧美日韩免费观看一区二区三区| 久久―日本道色综合久久| 亚洲视频你懂的| 久久国产精品第一页| 色综合久久88色综合天天| 日韩美一区二区三区| 亚洲视频图片小说| 国产一区二三区| 欧美性受xxxx黑人xyx| 精品国产成人在线影院 | 国产乱一区二区| 欧美视频在线不卡| 久久麻豆一区二区| 五月天激情综合网| av在线一区二区三区| 欧美一区二区三区的| 亚洲精品水蜜桃| 国内一区二区在线| 欧美午夜精品免费| 欧美韩国一区二区| 韩国成人福利片在线播放| 一区在线中文字幕| 韩国v欧美v日本v亚洲v| 欧美理论片在线| 亚洲免费毛片网站| 国产成人一级电影| 日韩精品一区二区三区在线播放 | 久久精品国产99国产| 欧美视频完全免费看| 国产精品不卡在线| 国产一区二区主播在线| 欧美一区二区久久久| 亚洲一区二区视频在线观看| 成人av网站免费观看| 精品国精品国产尤物美女| 亚洲成av人片| 欧美性猛交xxxx乱大交退制版| 中文一区在线播放| 韩国女主播一区二区三区| 欧美一区二区啪啪| 水野朝阳av一区二区三区| 在线亚洲人成电影网站色www| 中文字幕色av一区二区三区| 成人深夜视频在线观看| 久久久精品国产免大香伊| 久久99精品久久久久久国产越南| 欧美疯狂性受xxxxx喷水图片| 亚洲影院理伦片| 欧美午夜在线观看| 亚洲一区二区在线免费看| 一本一道波多野结衣一区二区| 国产精品国产三级国产a| 成人国产精品免费观看动漫| 国产亚洲一区二区三区| 国产一区 二区 三区一级| 精品久久久久久久人人人人传媒 | 国产精品伦一区二区三级视频| 国产一区欧美一区| 久久精品视频免费观看| 国产美女精品在线| 国产亚洲va综合人人澡精品| 国产精品资源网| 国产欧美1区2区3区| 成人黄色在线视频| 国产精品色哟哟| a级高清视频欧美日韩| 国产精品国产三级国产普通话蜜臀| 成人av资源站| 樱花影视一区二区| 欧美三级视频在线| 婷婷国产在线综合| 欧美xxxxxxxx| 国产精品911| 国产精品成人在线观看| 在线观看亚洲精品视频| 午夜国产不卡在线观看视频| 91精品国产综合久久蜜臀| 裸体健美xxxx欧美裸体表演| 2020日本不卡一区二区视频| 成人性色生活片免费看爆迷你毛片| 中文字幕一区二区三区四区| 色欲综合视频天天天| 午夜视频在线观看一区| 欧美一区二区免费| 欧美一区二区三区色| 精品综合久久久久久8888| 欧美激情在线免费观看| 91麻豆成人久久精品二区三区| 亚洲综合久久av| 日韩欧美不卡一区| 懂色一区二区三区免费观看| 一区二区三区小说| 欧美一区二区三区不卡| 成人午夜视频免费看| 亚洲va国产天堂va久久en| 精品不卡在线视频| 91在线一区二区| 日本午夜精品一区二区三区电影 | 国产一区二区免费看| 亚洲视频免费在线| 精品日韩在线观看| 色综合久久久久综合99| 久久精品二区亚洲w码| 中文字幕一区二区三区四区不卡 | 日韩写真欧美这视频| 99久久免费视频.com| 天天射综合影视| 欧美国产精品专区| 欧美一级精品大片| 成人aa视频在线观看| 日本在线不卡视频| 日韩理论片一区二区| 欧美一级黄色大片| 91福利国产精品| 国产福利91精品| 午夜精品一区在线观看| 国产精品午夜久久| 日韩一二三区视频| 色综合中文字幕国产| 国产在线精品免费| 亚洲国产精品麻豆| 国产精品理论片| 精品乱人伦小说| 欧美日韩久久久一区| 97久久久精品综合88久久| 国产制服丝袜一区| 日韩精品色哟哟| 亚洲综合久久久| 日韩一区欧美一区| 久久综合中文字幕| 91精品国产综合久久久蜜臀粉嫩| 99精品在线观看视频| 国产成人亚洲综合a∨婷婷图片| 日本亚洲免费观看| 亚洲福利视频一区二区| 中文字幕亚洲不卡| 国产视频一区在线播放| 欧美电影免费观看高清完整版在线观看 | 99精品视频在线免费观看| 国产一区二区三区在线观看精品| 天涯成人国产亚洲精品一区av| 中文文精品字幕一区二区| 精品奇米国产一区二区三区| 91精品国产一区二区| 欧美久久久久久蜜桃| 欧美在线观看你懂的| 一本大道久久精品懂色aⅴ| 成a人片国产精品| 国产91富婆露脸刺激对白| 国产一区亚洲一区| 狠狠色2019综合网| 精品夜夜嗨av一区二区三区| 麻豆一区二区三区| 美女脱光内衣内裤视频久久网站| 日韩成人一级大片|