sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:6415回复:13

如何制作虚拟设备驱动的自动安装程序

楼主#
更多 发布于:2004-05-09 10:01
我以前的虚拟设备驱动是通过“添加/删除硬件”->其它设备来添加的,工作正常。现在我想做一个自动安装的exe。但是我的虚拟设备没有hwID,UpdateDriverForPlugAndPlayDevices()和Devcon都没法用,请哪位大侠指点一下,虚拟设备的自动安装该如何做!

最新喜欢:

dregsdregs
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-09 14:31
我在installshield中使用了
szProgram = \"rundll.exe\";
szCmdLine = \"setupx.dll,InstallHinfSection DefaultInstall 132 \" + SUPPORTDIR + \"test.inf\";
LaunchAppAndWait(szProgram, szCmdLine, WAIT);
但是,installshield老是报错,“setupx.dll出错,项目丢失”,请问,该如何处理啊!
root60931
驱动大牛
驱动大牛
  • 注册日期2002-10-25
  • 最后登录2023-10-29
  • 粉丝2
  • 关注0
  • 积分1013分
  • 威望432点
  • 贡献值0点
  • 好评度311点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-05-10 17:08
关注中。。。。
好好学习,天天向上! root60931@gmail.com
fiily
驱动牛犊
驱动牛犊
  • 注册日期2004-05-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-11 09:17
请问,你是xp么?怎么使用,具体一点讲下,我比你还abc,是不是空的驱动程序框架也可以这么做?
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-11 09:04
关注
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-11 16:37
搂主:
Devcon是什么东东,从哪儿获得?
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-14 08:33
DDK XP带的安装程序的例子, 在src\setup里面
tigerL
驱动小牛
驱动小牛
  • 注册日期2003-12-24
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望23点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-25 22:09
愚见:

1、可以给虚拟设备指定一个硬件ID,即在其inf文件中的Models节中指定一个硬件id。

2、建议用DDK\\src\\setup\\install试试。

我曾经用它安装过“Writing Windows WDM Device Driver”中的wdm1.sys。
省元坊
zj0127
驱动牛犊
驱动牛犊
  • 注册日期2004-02-19
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-29 09:02
我在installshield中使用了
szProgram = "rundll.exe";
szCmdLine = "setupx.dll,InstallHinfSection DefaultInstall 132 " + SUPPORTDIR + "test.inf";
LaunchAppAndWait(szProgram, szCmdLine, WAIT);
但是,installshield老是报错,“setupx.dll出错,项目丢失”,请问,该如何处理啊!


 ;)强烈关注。
查看不少贴子,都没有说明白的,好遗憾。
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-09 10:56
1。在INF中总是指定一个HardwareID,这个ID可以随便起的,无所谓的,只是安装时用
2。通过HardwareID查找要安装的设备是否已安装
3。如果已安装过则直接调用UpdateWDM...函数
4.否则使用以下代码
/**************************************************************
*
* 名称:InstallWDMDriver
* 功能:安装WDM驱动
* 参数:HardwareId: 字符串描述的完整的设备ID
* INFFile: Inf安装文件
* RebootRequired: 是否需要重启的标志
* 返回:成功返回TRUE,失败返回FALSE
*
****************************************************************/
EXTERN_C BOOL  WINAPI
InstallWDMDriver(
IN  LPCTSTR HardwareId,
    IN  LPCTSTR INFFile,
    OUT PBOOL RebootRequired  OPTIONAL
    )
{
    HDEVINFO DeviceInfoSet = 0;
    SP_DEVINFO_DATA DeviceInfoData;
    GUID ClassGUID;
    TCHAR ClassName[MAX_CLASS_NAME_LEN];
BOOL bRet = FALSE;

AFX_MANAGE_STATE(AfxGetStaticModuleState());

    // 首先从Inf文件中得到设备类GUID
    if (!SetupDiGetINFClass((LPTSTR)INFFile,&ClassGUID,ClassName,sizeof(ClassName),0))
    {
TRACE( "Get INF Class GUID failedn" );
        return FALSE;
    }
    
    DeviceInfoSet = SetupDiCreateDeviceInfoList(&ClassGUID,0);
    if(DeviceInfoSet == INVALID_HANDLE_VALUE)
    {
TRACE( "Create DeviceInfoSet failed" );
        return FALSE;
    }

    // 打开该设备所属的类
    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    if (!SetupDiCreateDeviceInfo(DeviceInfoSet,
        ClassName,
        &ClassGUID,
        NULL,
        0,
        DICD_GENERATE_ID,
        &DeviceInfoData))
    {
        TRACE( "CreateDeviceInfo failedn" );
        SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return FALSE;
    }

    // 添加该设备
    if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
        &DeviceInfoData,
        SPDRP_HARDWAREID,
        (LPBYTE)HardwareId,
        (lstrlen(HardwareId)+1+1)*sizeof(TCHAR)))
    {
TRACE( "Add DeviceRegistryProperty failedn" );
        //SetupDiDestroyDeviceInfoList(DeviceInfoSet);
//return FALSE;
    }
    
// 建立关联
    if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE,
        DeviceInfoSet,
        &DeviceInfoData))
    {
        TRACE( "CallClassInstaller(REGISTERDEVICE)" );
        return FALSE;
    }

    // 关联信息都已建立,安装本驱动(以前相当于建立了一个未知的设备)
    if (!UpdateDriverForPlugAndPlayDevices(0,
        HardwareId,
        INFFile,
        INSTALLFLAG_FORCE,
        RebootRequired))
    {
// 安装失败,需要把以前的创建的信息删除,否则将会留下一个未知设备
        DWORD err = GetLastError();
        TRACE( "UpdateDriverForPlugAndPlayDevices failedn" );
TRACE( "the errcode is 0x%x", err );
        
        if (!SetupDiCallClassInstaller(
            DIF_REMOVE,
            DeviceInfoSet,
            &DeviceInfoData))
        {
            TRACE( "CallClassInstaller(REMOVE) failed " );
        }

    }
else
bRet = TRUE;
    
    SetupDiDestroyDeviceInfoList(DeviceInfoSet);
    
    return bRet;
}

[编辑 -  7/9/04 by  bingjie]

[编辑 -  7/9/04 by  bingjie]
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-07-09 13:11
虽然我已会了,但还是放分给你。
xuquanyong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-14
  • 最后登录2004-07-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-07-14 11:16
用这段代码就可以实现了吗?

希望sinking兄再详细介绍一下过程吧,谢谢
ubuntu_amateur
驱动牛犊
驱动牛犊
  • 注册日期2006-08-04
  • 最后登录2008-12-04
  • 粉丝0
  • 关注0
  • 积分970分
  • 威望98点
  • 贡献值0点
  • 好评度97点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-01-14 18:49
顶一下。对于虚拟设备来说,如上代码好像不行。。。
there is a will,there is a way
icboy591
驱动牛犊
驱动牛犊
  • 注册日期2009-05-26
  • 最后登录2010-04-13
  • 粉丝16
  • 关注1
  • 积分64分
  • 威望611点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2009-11-06 20:24
回 9楼(bingjie) 的帖子
能不能给我看看打印机驱动安装
我的程序报错:1797 未知打印机驱动程序
游客

返回顶部