【问题标题】:Which api functions to install a file system driver in Windows?哪些 api 函数可以在 Windows 中安装文件系统驱动程序?
【发布时间】:2010-10-04 16:52:19
【问题描述】:

我想在 Windows XP 下为 Ext2 分区安装驱动程序,安装将使用自写的 Inno Setup 脚本完成。我需要为此调用哪些 API 函数?从我到目前为止搜索的内容来看,我似乎不需要 inf 文件,因此不需要调用 SetupCopyOEMInf。但我不知道该怎么做......

请赐教!

【问题讨论】:

  • 如果是您在网上找到的,不是附有说明吗?如果是你自己写的,你之前是怎么安装的,在开发的时候测试一下?
  • 它带有一个安装程序,但我想将它与其他一些东西一起打包到我自己的安装程序中,这样我就可以轻松地调整我家中的每个新 Windows 安装。
  • 这是 ext2cow 吗?我一直对此感兴趣,但我认为它仅适用于 linux。
  • 它被称为'Ext2 Installable File System For Windows',来自fs-driver.org

标签: winapi installation driver


【解决方案1】:

好的,我找到了更多信息:

MSDN 声明 '您应该使用 INF 文件安装文件系统驱动程序'(通过调用 SetupCopyOEMInf 等),但也指出在 Win2k 和旧系统上,'文件系统驱动程序通常由服务控制管理器安装'

我发现了另一个Ext2 driver at sourceforge,它带有 Inno Setup 安装脚本。他们只是在HKLM\SYSTEM\CurrentControlSet\Services\ 下添加了一些注册表项。

我相信添加这些条目等于使用sc.exe 工具创建服务,该工具在内部调用OpenSCManagerCreateService api。我更喜欢注册表方式,因为它更容易,而且我认为使用 api 调用没有任何优势,因为总是需要重新启动。

所以我最终得到了这个解决方案:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\YourService]
"ErrorControl"=dword:00000001
"Start"=dword:00000003
"Type"=dword:00000001
"DisplayName"="YourServiceDisplayName"
"ImagePath"="System32\Drivers\YourService.sys"

当然,根据相关驱动程序的具体情况,Parameters 子项中可能需要更多条目。

我仍然希望有人能够对这个问题有所了解,特别是有关如何使用 inf 文件进行安装的一些细节,因为这是 MS 推荐的方式。

来吧,伙计们!这里有不错的赏金!

【讨论】:

    【解决方案2】:

    正如你所问的,安装驱动程序需要哪些 API 函数,这是我用来在 C 中加载驱动程序的一些代码:

    bool LoadDriver( const char * cpDriverPath, const char * cpDriverName )
    {
        SC_HANDLE hSCService;
        SC_HANDLE hSCManager;
    
        hSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
        if( hSCManager == NULL )
            return false;
    
        hSCService = CreateService( hSCManager, cpDriverName, cpDriverName,
                                    SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
                                    SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
                                    cpDriverPath, NULL, NULL, NULL, NULL, NULL );
    
        if( hSCService == NULL && GetLastError() == ERROR_SERVICE_EXISTS )
            hSCService = OpenService( hSCManager, cpDriverName, SERVICE_ALL_ACCESS );
    
        if( hSCService == NULL )
            return false;
    
        if( !StartService( hSCService, 0, NULL ) )
        {
            if( GetLastError() != ERROR_SERVICE_ALREADY_RUNNING )
                return false;
        }
    
        CloseServiceHandle( hSCManager );
        CloseServiceHandle( hSCService );
    
        return true;
    }
    

    您可能希望对文件系统驱动程序使用 SERVICE_BOOT_START 而不是 SERVICE_DEMAND_START。如果您不能编写 Inno 脚本来执行上述操作,您可以随时从上面制作一个小型 EXE,并让 Inno 作为安装后运行它。

    如果你想走 INF 路线,请查看this Microsoft article

    【讨论】:

    • 我已经怀疑INF的方式比较复杂了……sigh 不知道你给的例子需要重启吗?
    • 我使用它的方式(使用SERVICE_DEMAND_START),它不需要重新启动。
    【解决方案3】:

    有很多方法可以解决这个问题。

    1/ 查看产品是否有静默安装模式(例如,使用配置文件进行安装)。然后您只需将其合并到您自己的安装中即可。

    2/ 有一些程序可以模拟用户,例如 Rational Robot(我不建议这样做,因为它是商业的,但周围可能有免费的)。我们主要将它们用于图形应用程序的自动化测试,但它们也可以很容易地使用它来运行安装程序。

    3/ 联系开发人员了解实际安装过程需要什么,然后复制。

    4/ Microsoft 有许多系统工具(此处)可以跟踪对文件系统、注册表等的更改。您可以使用它们对安装过程进行逆向工程,并在您自己的安装中执行相同的操作。

    就个人而言,我会先选择 3 号。开发人员会很高兴知道他们的产品正在被使用,并且可以很容易地提供信息。他们甚至可能会为您编写一个静默安装程序,因为这将是他们的产品在企业环境中的额外卖点(建议他们这样做)。

    【讨论】:

      【解决方案4】:

      我写了一个 TDI 过滤驱动。

      当我开始编写 .inf 文件时,我花了两个星期的痛苦才让某些东西起作用,但我仍然没有真正理解它,因为它没有真正的意义;你必须做的似乎很武断。当我尝试使用 INF 文件时,它们几乎完全没有文档记录,而且异常复杂。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2012-08-11
        • 2011-07-15
        • 1970-01-01
        • 2020-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多