65.9K
CodeProject 正在变化。 阅读更多。
Home

Pocket PC 的串行驱动程序

2006年3月7日

CPOL

2分钟阅读

viewsIcon

181127

downloadIcon

2548

如何向 Pocket PC 设备添加新的串行端口以及如何驱动该端口。

Sample Image - DemoDriver.jpg

引言

本文档展示了如何创建 Windows CE 串行驱动程序。这将向设备添加一个新的串行 (COM) 端口,允许应用程序以与标准硬件端口相同的方式使用此端口。新的虚拟端口提供与硬件端口相同的接口。

背景

创建虚拟端口的目的是允许应用程序(例如 Tomtom 和 Destinator)接收连接到硬件串行端口 (COM1) 的 GPS 天线的数据,并保存接收到的 GPS 信号以便在需要时回放并模拟实际驾驶。

使用代码

该驱动程序是一个 DLL,它导出以下函数:

  • COM_Init
  • COM_Deinit
  • COM_Open
  • COM_Close
  • COM_Read
  • COM_Write
  • COM_Seek
  • COM_IOControl
  • COM_PowerDown
  • COM_PowerUp
DEMODLL_API DWORD COM_Init(
     LPCTSTR pContext, LPCVOID lpvBusContext );
DEMODLL_API BOOL COM_Deinit(
     DWORD hDeviceContext );
DEMODLL_API DWORD COM_Open(
     DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode );
DEMODLL_API BOOL COM_Close(
     DWORD hOpenContext );
DEMODLL_API BOOL COM_IOControl(
     DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn,
     PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut );
DEMODLL_API void COM_PowerUp(
     DWORD hDeviceContext );
DEMODLL_API void COM_PowerDown(
     DWORD hDeviceContext );
DEMODLL_API DWORD COM_Read(
     DWORD hOpenContext, LPVOID pBuffer, DWORD Count );
DEMODLL_API DWORD COM_Write(
     DWORD hOpenContext, LPCVOID pBuffer, DWORD Count );
DEMODLL_API DWORD COM_Seek(
     DWORD hOpenContext, long Amount, WORD Type );

在当前的示例驱动程序中,我们将新的串行端口映射到硬件端口(管理的端口),因此对新端口的所有操作都将在管理的端口上执行相同的操作。我们还会打开一个日志文件,并将所有执行的操作写入此日志。

另一个重要部分是如何将驱动程序安装到 Pocket PC 设备上。DLL 文件必须放置在 \Windows 目录中,并且注册表必须使用以下信息进行更新:

HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial6
    Dll = DemoDriver.dll
    FriendlyName = Demo Driver
    Index = 6
    Order = 2
    Prefix = COM
    ManagePort = 1

在此示例中,我们创建了一个虚拟端口 COM6,但这可以是 1 到 9 之间的任何数字。ManagePort 条目不是操作系统创建串行端口所必需的。此条目由我们的演示驱动程序用于定义要映射到的硬件端口号。

安装驱动程序的 easiest 方法是创建一个 CAB 文件,该文件会将 DemoDriver.dll 文件复制到 \Windows 目录并更新所有注册表设置。我们提供了一个示例 .inf 文件,可与 CabWiz 一起用于创建 CAB 文件。

[Version]
Signature    = "$Windows NT$"
Provider    = "Code Project"
CESignature    = "$Windows CE$"

[CEStrings]
AppName = "DemoDriver"
InstallDir = %CE2%

[Strings]
reg_path = Drivers\Builtin\Serial6

[DefaultInstall]
CopyFiles    = Dllfiles
Addreg        = Regkeys

[SourceDisksNames]
1 =, "Common Files",, .

[SourceDisksFiles]
DemoDriver.dll    = 1

[DestinationDirs]
Dllfiles = 0, %CE2%

[Dllfiles]
"DemoDriver.dll"

[Regkeys]
HKLM,%reg_path%,Dll,0x00000000,DemoDriver.dll
HKLM,%reg_path%,Prefix,0x00000000,COM
HKLM,%reg_path%,FriendlyName,0x00000000,Demo Driver
HKLM,%reg_path%,Index,0x00010001,6
HKLM,%reg_path%,Order,0x00010001,2
HKLM,%reg_path%,ManagePort,0x00010001,1

有了 CAB 文件后,我们将其复制到设备并单击以安装。需要软重置才能使操作系统开始运行驱动程序。

为了使驱动程序在 WM5 设备上工作,我们必须对 DLL 进行签名。在此示例中,我们使用了本文档中提供的方法:在我们的应用程序的 CAB 中部署自己的内置证书(感谢作者)。我们的示例包含一个自签名证书,名为 MyCert.pfx,以及我们在创建 cab 文件时提供给 CabWiz 的 Cab\PreXML_MyCert.xml 文件。

要对驱动程序进行签名,我们调用:

signtool.exe sign /f MyCert.pfx DemoDriver.dll

要创建 CAB 文件,我们运行:

CabWiz.exe driver.inf /prexml PreXML_MyCert.xml

历史

  • 2006 年 3 月 7 日 - 首次发布。
  • 2006 年 3 月 27 日 - 添加了代码签名以支持 WM5。
© . All rights reserved.