打印机 Driver 开发使用 Windows DDK 错误

Printer Driver Development Using Windows DDK error

我是打印机制造商的软件开发人员。最近问了一个driver。所以我开始挖掘教程、样本、文章。

首先,我下载了 Windows Driver 套件 7600.16385.1。我安装它,用一些示例 drivers 构建它(例如,仅 generic/text)。我更改了 inf 文件中的制造商部分并且工作正常。但我要求做更具体的 driver,从任何可以打印的应用程序获取数据并将其发送到我们的打印机。

此时我做了一些额外的挖掘,安装了 Visual Studio 2013 和 winddk 8.1。我尝试开箱即用的 v4 打印机 driver 样本。我设法构建了它(Inf to cat 表现得很奇怪,所以我禁用了它的项目属性)。然后我尝试使用新 driver 安装打印机。 Driver 根本没有安装软件。我通过了 inf 语法,发现了一些错误并解决了问题。之后我不断收到 0x00000002 错误。我设法解决了问题,然后出现 0x0000003 错误。

所以,我写下了一个 inf intaller c# 项目,设法安装 driver。 Driver 出现在打印机 driver 部分,但我尝试安装一台新打印机,安装一直失败,错误为 0x0000003。我做了一些关于错误的搜索,我发现它是 path_not_found 错误。我检查我的 inf 文件,做一些语法检查。我在那里付出了一些努力,但我不断收到错误 0x0000003。

我是怎么解决这个问题的?

  1. 在论坛上,人们说这是导致 windows 凭据出现此错误的权限问题。我设置了新的管理员帐户并安装了 driver。但是当尝试设置时,打印机错误是相同的。

  2. 我调查了 windows 文件夹下的 windows 日志:setupapi.dev.log 和 setupact.log。在本节中,我发现 0x0000002 错误,但未发现 0x000003 错误。这对我没有帮助。

  3. 论坛上有些人说可能是预装的 drivers 和打印机导致了问题。我卸载了 system32 driverstore 下的 drivers 和打印机。同时卸载控制面板下的打印机服务和打印机部分。结果一样。

  4. 我找到了 channel9,它是某种 Microsoft 开发网络。我找到了一些关于开发的视频教程和幻灯片。我看了 HW-328T、HW-238T、HW-979P、HW-981P、HW-903T、HW-322T。这些视频给了我一些见解,但仅此而已。

  5. 所以我一直在挖掘问题,使用 windows 的 eventwiever 工具。发现 HRESULT 0x80070003 错误。这是一个打印机假脱机程序错误日志说。我重新启动后台处理程序,错误继续,我重新启动服务并重新启动计算机,错误继续。

  6. 我尝试使用 driver 注册表编辑器的旧条目。结果是一样的。我设法获得了 windows 文件夹的管理员权限,但没有任何区别。

  7. 我尝试使用具有管理员权限的命令行安装新打印机,结果是一样的。

  8. 多次尝试在 64 位和 32 位上安装 windows。

  9. 我也尝试使用 GPD、PPD 类型。

我的代码示例

  1. INF 文件

    [Version]
    Signature="$Windows NT$"
    Class=Printer
    ClassGuid={4D36E979-E325-11CE-BFC1-08002BE10318}
    Provider=%ManufacturerName%
    CatalogFile=Ali.cat
    ClassVer=4.0
    DriverVer=08/01/2012,1.0.0.0
    
    [DestinationDirs]
    DefaultDestDir = 66000
    
    
    
    [Manufacturer]
    %ManufacturerName%=Ali,NTia64,NTamd64
    
    [Ali]
    "Ali V1" = Ali.GPD
    
    [Ali.NTia64]
    "Ali V1" = Ali.GPD
    
    [Ali.NTamd64]
    "Ali V1" = Ali.GPD
    
    [SourceDisksNames.amd64]
    1= %DiskName%,,,
    
    [SourceDisksFiles.amd64]
    Ali.gpd = 1
    
    [SourceDisksNames.ia64]
    1= %DiskName%,,,
    
    [SourceDisksFiles.ia64]
    Ali.gpd = 1
    
    [Strings]
    ManufacturerName="Ali"
    DiskName="Ali Installation Disk"
    
  2. 我的安装inf文件的C#函数代码

    if (SetupCopyOEMInf(inf_path, "", 2, 0x0000400, null, 0, 0, null))
    

提前致谢。

注意:如果需要,我也可以postgpd文件。

您的 INF 文件中似乎没有类似于以下内容的复制部分:

[Ali.GPD]
CopyFiles=@Ali.gpd

Inf 文件需要它来知道要复制哪些文件。 这里是相关的 MSDN doc on this topic.

希望对您有所帮助。

首先,您必须考虑您的处理器架构。您的驱动程序绝对不能在基于 x86 或 ARM 的体系结构上运行,因为相关部分未包含在您的示例 .inf 文件中。

此外,您的 .inf 文件中没有安装部分(复制文件指令),但必须包含(特别是如果您打算使用基于 INF 的安装 API)。要创建最小工作 .inf 文件,请参阅 here.

最后,打印机驱动怎么安装呢?您是否使用驱动程序包?如果是,当您提到在您的工作中绕过 inf2cat 进程时,您是如何签名的? (可能你正在 "Disabled Driver Signature Enforcement" 模式下开发!)。否则,如果没有任何 .gpd 或 .ppt 文件,您将如何安装打印机?您对打印机有何期望?

通过添加一些代码片段,人们可能会提供更多帮助。