3

我有一个使用 Libusbdotnet 为我的 USB 设备生成的驱动程序 inf 和目录。

一切都很好,除了整个驱动程序安装真的很麻烦。因为我的驱动程序没有经过数字签名并且不在 WHQL 中……为我的设备安装驱动程序需要大量的用户交互。

因此,如果可能的话,我希望在没有签名和 WHQL 的情况下自动执行此操作。所以我做了一点研究,发现了 SetupCopyOEMInf 函数。

我有一个用 c# 和 .net 编写的应用程序,还有一个 MSI 包。

基本上我希望能够在安装过程中使用 SetupCopyOEMInf,以便它可以复制驱动程序,以便 Windows 可以在用户第一次插入设备时自动检测驱动程序。

但我找不到任何显示如何使用 SetupCopyOEMInf 的示例。

任何帮助表示赞赏。

谢谢,

4

3 回答 3

7

我不确定这是否会有所帮助,但这里有一些关于如何使用函数本身的示例代码。我几乎使用Microsoft 的 MSDNPinvoke来敲出一些快速代码。

[DllImport("setupapi.dll", SetLastError = true)]
public static extern bool SetupCopyOEMInf(

    string SourceInfFileName,
    string OEMSourceMediaLocation,
    OemSourceMediaType OEMSourceMediaType,
    OemCopyStyle CopyStyle,
    string DestinationInfFileName,
    int DestinationInfFileNameSize,
    ref int RequiredSize,
    string DestinationInfFileNameComponent

);

/// <summary>
/// Driver media type
/// </summary>
internal enum OemSourceMediaType
{
    SPOST_NONE = 0,
    //Only use the following if you have a pnf file as well
    SPOST_PATH = 1,
    SPOST_URL = 2,
    SPOST_MAX = 3
}

internal enum OemCopyStyle
{
    SP_COPY_NEWER = 0x0000004,   // copy only if source newer than or same as target
    SP_COPY_NEWER_ONLY = 0x0010000,   // copy only if source file newer than target
    SP_COPY_OEMINF_CATALOG_ONLY = 0x0040000,   // (SetupCopyOEMInf only) don't copy INF--just catalog
}

static void Main(string[] args)
{
    //Not really needed but I couldn't figure out how to not specify a ref parameter
    int size = 0;
    bool success = SetupCopyOEMInf("source.inf", "", OemSourceMediaType.SPOST_NONE, OemCopyStyle.SP_COPY_NEWER, null, 0,
                    ref size, null);
    if(!success)
    {
        var errorCode = Marshal.GetLastWin32Error();
        var errorString = new Win32Exception(errorCode).Message;
        Console.WriteLine(errorString);
        Console.ReadLine();
    }
}

假设您的 INF 文件在指定的正确目标目录下完全正确,此函数还将尝试将您通过 CopyFiles 指令(在 INF 文件中)指定的任何文件复制到这些目标目录。如果该文件不存在,该命令将失败。

我遇到的另一个问题是该函数应该将您的 INF 和 CAT 文件复制到指定的目标目录(我指定了一个 ID 为 12,记录为 %windir%\system32\drivers),而是将其复制到了 %windir% \system32\DriverStore\FileRepository\source.inf_amd64_neutral_blah。这可能是因为我正在使用手动创建的 inf 文件进行测试并且缺少所需的信息。

希望这对您有所帮助:)

于 2013-08-29T14:11:09.753 回答
2

就个人而言,我会考虑使用生成的自签名证书,而不是试图规避集成到 Windows 中以防止可能的安全风险的措施。司机签名在一定程度上是有用的。

由于您希望在本地计算机上安装这些驱动程序,因此据我所知,您可以执行以下 4 项操作:

  • 获得(付费)证书
  • 使用签名工具覆盖对特定未签名驱动程序的强制执行。我不知道这种行动的法律含义,因此我不会详细说明这一点。
  • 禁用 UAC 并使用 F8 启动以禁用强制执行(我认为这是一次性的,需要为每次安装或在任何情况下为每个会话重复,如果您正在寻找永久解决方案,可能不是首选)
  • 为您的机器使用可用于签署驱动程序的自签名证书。这是我更喜欢的解决方案,因为您可以围绕该过程编写一个小应用程序(生成证书或导入它,应用它,执行/启动驱动程序安装)

另一方面,我没有创建这样一个应用程序的经验。我只是认为您提出了一个有趣的问题,而我只是提出了我所知道和/或发现的内容。不过,这并不排除我完全失误击球的可能性:-)

很想知道你最终将如何解决这个问题。

于 2013-08-26T14:15:30.430 回答
1

我认为您可以避免编写自己的驱动程序安装程序,只需使用与 Microsoft Windows Vista 和更新版本捆绑在一起的pnputil 。

(以管理员身份运行)

pnputil /a mydriver.inf
于 2015-12-14T03:31:20.797 回答