无忧启动论坛

标题: 请问各位大侠,老九兄,老毛桃兄,怎样为WinPE添加串行端口驱动? [打印本页]

作者: efly    时间: 2007-3-30 11:45
标题: 请问各位大侠,老九兄,老毛桃兄,怎样为WinPE添加串行端口驱动?
已知问题
-----------

* 需要将串行端口的符号名称添加到 Windows PE

Windows PE 不为串行端口创建符号名称,如 COM1 和 COM2。这意味着应用程序无法
检测和使用这些串行端口。

解决方法:要为串行端口创建符号名称,可以编写一个调用 DefineDosDevice 函数
并使用该端口的完整设备名称的应用程序。然后将该应用程序添加到 Startnet.cmd
中,以便其作为 Windows PE 启动过程的一部分运行。该应用程序结束后,其他应用
程序就能够根据串行端口的符号名称检测到相应的串行端口。

在部署该应用程序之前,必须在脱机 Windows PE 映像中添加相应的注册表项,之后
才能使用串行端口。

1. 使用 Regedit 将脱机映像中的 Setupreg.hiv 装入 HKLM\test。

2. 添加以下注册表项:

HKLM\test\ControlSet001\Services\serial\Parameters

3. 卸载 Setupreg.hiv。

使用 ACPI HAL 时,COM1 的完整设备名称是:

\\?\ACPI#PNP0501#1#{4D36E978-E325-11CE-BFC1-08002BE10318}

要在其他 HAL 上识别串行端口的完整设备名称,请使用 QueryDosDevice 函数搜索
字符串“PNP0501”。

要在自定义应用程序中使用串行端口,请使用串行端口的完整设备名称,或者使用
DefineDosDevice 来创建符号名称,如下例所示:

#define COM_PORT_DEV_NAME(n) \
TEXT("\\\\?\\ACPI#PNP0501#") TEXT(#n) TEXT("#{4D36E978-E325
-11CE-BFC1-08002BE10318}")

#define COM_PORT_NAME(n) \
TEXT("COM") TEXT(#n)

DefineDosDevice( 0, COM_PORT_NAME(1), COM_PORT_DEV_NAME(1) );
作者: efly    时间: 2007-3-30 11:47
标题: INFO: 了解设备名和符号链接
INFO: 了解设备名和符号链接
察看本文应用于的产品
注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。
文章编号 : 235128
最后修改 : 2006年11月21日
修订 : 4.1
本页

概要

更多信息

内部 NT 设备名称

MS-DOS 设备名

符号链接
概要
像硬盘、 串行端口, 和并行端口有内部 Windows NT 设备名称并且可能选择设备有一个 MS-DOS 设备名。 这些名称位于 WindowsNT 对象管理器的空间。 虽然 WindowsNT 本身和内核模式驱动程序使用 NT 设备名称, Win 32 程序必须使用 MS-DOS 设备名。 MS-DOS 设备名称是符号链接到基础 NT 设备名称。 本文介绍设备名称、 符号链接, 和 Win 32 程序如何创建和删除符号链接。
回到顶端

更多信息
内部 NT 设备名称
与 WindowsNT 的对象管理器, 内核模式设备驱动程序加载时其初始化例程注册设备名称。 此名称被称为 WindowsNT 设备名。 WindowsNT 内核模式驱动程序和内核模式组件通过其 Windows NT 设备名称引用设备。 这些名称格式, 如 \Device\CDRom0 和 \Device\Serial0, 也是对象管理器空间 \device 目录中存在。

Win 32 程序无法使用内部 Windows NT 设备名称来访问设备因为 Win 32 子系统和 Win32API 需要更熟悉驱动器号和 MS-DOS 设备名 (如 COM 答, C, 1,:, 和 LPT 1: 虽然 Win 32 程序可能不使用 Windows NT 设备名称, 但是, 它们可定义和删除 MS-DOS 设备名来访问设备。 它们可还检索内部 Windows NT 设备名称与 MS-DOS 设备名称。 描述如何执行此于本文 " SymbolicLinks " 部分中示例代码。

PlatformSDK 中以获得更好地理解是如何对象管理跟踪名称对设备和其他系统对象, 您可以查看用 WinObj.exe 工具对象管理器空间


回到顶端

MS-DOS 设备名
Win 32 程序使用设备 (如驱动器、 串行端口, 和并行端口通过其 MS-DOS 设备名。 对于磁盘驱动器, 这些是如答和 C 驱动器号。 串行和并行端口对于这些是像 COM 1 名称:, COM 2 和 LPT 1,:: 像 Windows NT 设备名称, 这些名称位于对象管理器空间, 但中 ? \ 目录, 对 Win 32 用户模式程序这是可见。

什么使 MS-DOS 设备名不同于 Windows NT 设备名称是由 WindowsNT 内核或内核模式驱动程序不使用它们。 其目的是为了以便 Win 32 程序可以使用熟悉驱动器号和设备名 ; Windows NT 设备名称引用:, 访问 WindowsNT 设备例如, COM 1。 因此, MS-DOS 设备名被称为 " 符号链接 " 到 Windows NT 设备名称。 也就是说, 一个 MS-DOS 设备名称存在对象管理器中的 \ ? 目录和指向对象管理器 \device 目录中 WindowsNT 设备名称。

每个 MS-DOS 设备名可以指向至多个内部 WindowsNT 设备。 但是, 多个 MS-DOS 设备名可以指向单个设备。 例如, C 可只指向单个分区, 时它是可以让两个或多个驱动器号, 如 D: 和 Z:, E, 指向同一分区。
回到顶端

符号链接
在重新启动计算机保持因为它们是存储在注册表中由系统创建符号链接。 程序可能也创建符号链接以 DefineDosDevice()。 这些链接仅到计算机启动或关闭除非更新注册表项包含链接信息是有效。

在可以有多个符号链接到 Windows NT 设备名称。 但是, 仅 MS-DOS 设备名称, 跨系统最初分配给内部 WindowsNT 设备保持重新启动。 因此, 是要创建其他符号链接, 分配到一个 CD-ROM 驱动器, 多个驱动器号可能但是其他驱动器号只保留, 直到计算机被关闭或重新。

Win 32 程序可检索 Windows NT 设备名称与特定 MS-DOS 设备名称相关联通过调用 QueryDosDevice() 与 MS-DOS 设备名称。 下面是该如何执行此代码: char szNtDeviceName[MAX_PATH];

if (QueryDosDevice ("C:", szNtDeviceName, MAX_PATH))
{
   printf ("C: is linked to %s\n", szNtDeviceName);
}
                               
Win 32 程序可以创建并通过调用 DefineDosDevice() 删除符号链接。 若要创建符号链接, DefineDosDevice 调用带有 DDD_RAW_TARGET_PATH 标志。 要删除符号链接, 以 DDD_REMOVE_DEFINITION 和 DDD_RAW_TARGET_PATH 调用。 下列示例程序说明两个操作: /*
   DDD

      This sample shows how to associate an MS-DOS device name with a
      Windows NT device name. The association is a symbolic link between
      device names stored in the Object Manager's namespace. Applications
      use the MS-DOS device name, but Windows NT and kernel-mode drivers
      use the Windows NT device name.  

   Usage:
      ddd <MS-DOS Device Name> <NT Device Name>
      ddd -r <MS-DOS Device Name>

   NOTE: If the MS-DOS device name is a driver letter, the trailing
   backlash is not accepted by DefineDosDevice or QueryDosDevice.

   NOTE: The MS-DOS device name is defined only until the computer is
   restarted.

   To make the drive letter associations permanent on Window NT 4.0, you
   have to update HKEY_LOCAL_MACHINE\SYSTEM\DISK\Information. However,
   the contents of the value are undocumented.

   On Windows 2000, you have to use the Volume Mount Point APIs.
*/

#define WIN32_LEAN_AND_MEAN /* Reduce number of system headers parsed */
                            /* during build. */

#include <windows.h>
#include <stdio.h>

void main (int argc, char **argv)
{
   char * pszDosDeviceName,
        * pszNtDeviceName;

   bool  fRemoveDeviceName = false;
   bool  fResult;

   /*
      Command-line parsing.
        1) Make sure correct number of arguments are supplied.
        2) See if you should add or remove the MS-DOS Device Name.
   */
   if (argc != 3)
   {
      printf("\nusage: %s <DOS device name> <NT device name>    to add\n",
             argv[0]);
      printf("usage: %s [-r] <DOS device name>                to remove\n",
             argv[0]);
      printf("\n\texample: %s d: \\device\\cdrom0\n", argv[0]);
      return;
   }

   fRemoveDeviceName = !lstrcmpi (argv[1], "-r");


   /* Now, add/remove the DOS device name. */
   if (fRemoveDeviceName)
   {
      /*
         Remove the MS-DOS device name. First, get the name of the Windows
         NT device from the symbolic link, then delete the symbolic link.
         
      */
      pszDosDeviceName = argv[2];

      pszNtDeviceName = (char *)LocalAlloc (LPTR, MAX_PATH);

      fResult = QueryDosDevice (pszDosDeviceName, pszNtDeviceName,
                                MAX_PATH);
      if (fResult)
      {
         fResult = DefineDosDevice (DDD_RAW_TARGET_PATH|
                                    DDD_REMOVE_DEFINITION|
                                    DDD_EXACT_MATCH_ON_REMOVE,
                                    pszDosDeviceName, pszNtDeviceName);
      }
      if (!fResult)
         printf("error %lu: could not remove %s\n",
                GetLastError(), pszDosDeviceName);

      LocalFree (pszNtDeviceName);
   }
   else
   {
      /* Add the DOS device name */

      pszDosDeviceName = argv[1];
      pszNtDeviceName  = argv[2];

      fResult = DefineDosDevice (DDD_RAW_TARGET_PATH, pszDosDeviceName,
                                 pszNtDeviceName);
      if (!fResult)
         printf("error %lu: could not link %s to %s\n",
                GetLastError(), pszDosDeviceName, pszNtDeviceName);
   }

}
作者: efly    时间: 2007-3-30 11:48
标题: 如何以编程方式确定是否串行端口重定向到终端服务器客户端计算机
如何以编程方式确定是否串行端口重定向到终端服务器客户端计算机
察看本文应用于的产品
注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。
文章编号 : 314354
最后修改 : 2006年11月21日
修订 : 2.3
概要
所附带 WindowsXP 远程桌面客户端使您能够启动情况下终端服务会话位置服务器串行端口 (COM 1、 COM 2 和等等) 重定向到本地客户串行端口。 本文解释客户会话中运行进程如何确定是否用于会话端口重定向到客户机。
更多信息
通过使用 QueryDosDevice 函数以确定是否已将 COM 端口重定向到终端服务客户机, 会话中运行的应用程序可以查询该 COM 端口。 如果对于 COM 端口目标开头 \Device\RdpDr\; , 重端口被定向到通过终端服务重定向器 (RdpDr) 客户端。

例如, 您可以使用以下代码以确定是否已重定向 COM 1: BOOL fRedirected = FALSE;
char szTarget[1024];
if (!QueryDosDevice("COM1", szTarget, 1024))
   printf("QueryDosDevice() failed with error %d\n", GetLastError());
else
   fRedirected = (0 == strnicmp(szTarget, "\\Device\\RdpDr\\;",
         strlen("\\Device\\RdpDr\\;")));
                               
通过调用 DefineDosDevice 函数如果与串行端口重定向客户端会话中运行应用程序需要访问终端服务器 (相对于客户计算机上重定向端口), 上物理串行端口程序必须创建新符号链接到该服务器的端口。 通过使用以下语法来调用 CreateFile 函数然后, 应用程序可打开句柄到串行端口:
\\ SymbolicLinkName \。
最后, 它可以使用句柄来访问串行端口。

下列代码演示如何创建符号链接 (ServerCOM1) 到终端服务器上首物理串行端口: // Map ServerCOM1 to the first physical serial port on the TS server.
// Before you create the new mapping, verify that it does not already exist.

char szTarget[MAX_PATH];
BOOL fMapped = FALSE;

if (!QueryDosDevice("ServerCOM1", szTarget, MAX_PATH))
   fMapped = DefineDosDevice(DDD_RAW_TARGET_PATH, "ServerCOM1",
         "\\Device\\Serial0");
else
   printf ("ServerCOM1 already mapped\n");
                               
管理设备驱动程序注册设备名称 ; 内置 Windows 串行驱动程序 \Device\Serial0 赋给首物理串行端口和 \Device\Serial1 到第二。 用于加载串行板定义供应商提供设备驱动程序也可能不相同。 此外, 虽然通常被映射到第一个物理串行端口, COM 1 此映射是不强制。 终端服务客户端会话中应用程序无法确定是否保留此映射协议。

客户端应用程序可以删除, 它通过调用 DefineDosDevice 函数, 如下它与端口完成后 (它应该这样做) 创建符号链接: fMapped = DefineDosDevice(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION,
      "ServerCOM1", "\\Device\\Serial0");
作者: efly    时间: 2007-3-30 14:01
标题: 怎么没人回答我?
郁闷中......
作者: efly    时间: 2007-3-31 08:42
标题: 请问各位大侠,老九兄,老毛桃兄,xypcmac兄,怎样为WinPE添加串行或并行端口驱动?
因为我家里和公司的很多设备都是串口和并口的,比如打印机(并口),扫描仪(并口),游戏控制杆(串口),指纹机(串口),仪表(串口),仿真器(串口)等......
要怎样在WinPE中直接驱动呢?请大家帮帮我.
好像要以下几个文件:
MsPorts.inf         \Inf
Hal.dll                 \System32
MsPorts.dll           \System32
Serial.sys              \System32\Driver
Serenum.sys          同上
Parport.sys            同上
作者: longteeth    时间: 2007-3-31 08:58
加进去的说
作者: allegro    时间: 2007-3-31 09:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: efly    时间: 2007-3-31 12:00
请问各位大侠,老九兄,老毛桃兄,xypcmac兄帮忙测试,谢谢.
作者: xypcmac    时间: 2007-3-31 12:10
我基本上都是USB设备啊!56K的旧 modem 也是卡式的。
作者: efly    时间: 2007-3-31 13:25
因为USB端口的稳定性不是很高,其实现在很多的工作设备都是通过串口进行通信的.
可以不用有设备就能进行测试的呀,比如串口调试助手什么的.
作者: hdxing    时间: 2007-3-31 20:49
硬盘系统下不可以调试吗??非得用PE来调试??有特别的要求??我觉得如果一天都要调试设备的话老老实实装个98或XP啊!
作者: adatsui    时间: 2007-3-31 22:19
唉, 以為省時間, 都偏愛用人家的作品修改.
自己動手, 用 pebuilder 加上 老外的 hwpnp 插件, 很多年前己解決了串口啦, 在 pe 上用打印機, 不知用了多少年.
第一次花點時間認識pebuilder, 以後增減插件重建一次 pe , 也花不了 30 分鐘.
作者: efly    时间: 2007-4-1 23:33
感谢adatsui大哥的回复,我试试先,谁还有其它的方法,请继续讨论!




欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3