如何在安装过程中使用SetupCopyOEMInf
本文关键字:SetupCopyOEMInf 过程中 安装 | 更新日期: 2023-09-27 18:28:50
我有一个驱动程序inf和目录,它是用Libusbdotnet为我的USB设备生成的。
一切都很好,除了整个驱动程序的安装非常麻烦。因为我的驱动程序没有数字签名,也不在WHQL中。。。为我的设备安装驱动程序需要大量的用户交互。
因此,如果可能的话,我希望在没有签名和WHQL的情况下自动完成这项工作。所以我做了一些研究,找到了SetupCopyOEMInf函数。
我有一个用c#和.net编写的应用程序,还有一个MSI包。
基本上,我希望能够在安装过程中使用SetupCopyOEMInf,这样它就可以复制驱动程序,这样当用户第一次插入设备时,windows就可以自动检测驱动程序。
但我找不到任何示例来展示如何使用SetupCopyOEMInf。
感谢您的帮助。
谢谢你,
我不确定这是否会有所帮助,但这里有一些关于如何使用函数本身的示例代码。我几乎用微软的MSDN和Pinvoke来编写一些快速代码。
[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文件进行测试缺少所需信息。
希望这能对你有所帮助:)
就我个人而言,我会考虑使用生成的自签名证书,而不是试图规避集成到Windows中的措施,以防止可能的安全风险。驱动程序签名在一定程度上是有用的。
既然你想在本地机器上安装这些驱动程序,就我所见,你可以做4件事中的任何一件:
- 获取(付费)证书
- 使用签名工具覆盖特定未签名驱动程序的强制执行。我不知道这一行动的法律含义,因此我不会对此进行详细说明
- 禁用UAC并用F8启动以禁用强制(我认为这是一次性的,每次安装或在任何情况下每次会话都需要重复,如果您正在寻找永久解决方案,可能不是首选)
- 为您的机器使用自签名证书,您可以使用该证书对驱动程序进行签名。这是我更喜欢的解决方案,因为您可以围绕这个过程编写一些应用程序(生成证书或导入证书、应用证书、执行/启动驱动程序安装)
另一方面,我没有创建这样一个应用程序的经验。我只是觉得你提出了一个有趣的问题,而我只是提出了我所知道和/或发现的。但这并不排除我完全没有击球的可能性:-)
很好奇你最终会如何解决这个问题。
我认为,只需使用与Microsoft Windows Vista及更新版本捆绑的pnputil,就可以避免编写自己的驱动程序安装程序。
(以管理员身份运行)
pnputil /a mydriver.inf