Quakexg
驱动小牛
驱动小牛
  • 注册日期2001-11-21
  • 最后登录2012-02-29
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望56点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
阅读:2235回复:11

谁会Installshield 啊?还有关于驱动安装100分

楼主#
更多 发布于:2004-05-12 10:08
1。如何在卸载前执行下我自己的程序,比如,安装时我把a.exe 安装到了安装目录,在卸载前我要先执行一下a.exe 然后再卸载。
2。我做的是网卡驱动程序,已有INF和SYS,且插卡后,WINDOWS认出,要求驱动程序,选择INF,这样的安装是可以的。问题是,怎么样才能先不插卡,先执行我的安装程序,安装完了后再插卡,这时驱动已经正确安装!

好像只能20分,我只能多开几个贴给分!
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-12 10:22
1。如何在卸载前执行下我自己的程序,比如,安装时我把a.exe 安装到了安装目录,在卸载前我要先执行一下a.exe 然后再卸载。
2。我做的是网卡驱动程序,已有INF和SYS,且插卡后,WINDOWS认出,要求驱动程序,选择INF,这样的安装是可以的。问题是,怎么样才能先不插卡,先执行我的安装程序,安装完了后再插卡,这时驱动已经正确安装!

好像只能20分,我只能多开几个贴给分!

1.好像Installshield里有脚本可以执行的,具体的你看帮助吧 :P
2.你在硬件向导里添加新硬件选择网卡,驱动选择自己的驱动应该可以的,我安装过NE2000的驱动(没有硬件的)成功过!
祝你好运
好好过日子
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-12 10:27
用通知对象,DDK里的FILTER就是这样一个例子,但要达到你的要求还要该改。
Quakexg
驱动小牛
驱动小牛
  • 注册日期2001-11-21
  • 最后登录2012-02-29
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望56点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-12 11:05
很感谢你的关注,
1.我也知道,肯定是用Installshield的内部函数,应该就可以做到了,可是我就是不知道该用哪个函数。
2。我的要求是执行我的SETUP这个程序,而不是用添加新硬件,因为这样对用户来说太不友好了。
还是非常谢谢你。



[quote]1。如何在卸载前执行下我自己的程序,比如,安装时我把a.exe 安装到了安装目录,在卸载前我要先执行一下a.exe 然后再卸载。
2。我做的是网卡驱动程序,已有INF和SYS,且插卡后,WINDOWS认出,要求驱动程序,选择INF,这样的安装是可以的。问题是,怎么样才能先不插卡,先执行我的安装程序,安装完了后再插卡,这时驱动已经正确安装!

好像只能20分,我只能多开几个贴给分!

1.好像Installshield里有脚本可以执行的,具体的你看帮助吧 :P
2.你在硬件向导里添加新硬件选择网卡,驱动选择自己的驱动应该可以的,我安装过NE2000的驱动(没有硬件的)成功过!
祝你好运 [/quote]
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-12 14:18
你在硬件向导里添加新硬件选择网卡,驱动选择自己的驱动应该可以的,我安装过NE2000的驱动(没有硬件的)成功过!
祝你好运

NE2000是ISA的驱动,不支持PNP,所以可以没有硬件安装成功。
对于一个支持PNP的设备,好像只能是先插卡再安装驱动。不过可以这样做,在系统弹出对话框要求安装驱动时可以点击取消,然后运行自己的安装程序安装。或者安装程序先把inf文件拷贝到系统目录下的Inf目录下,这样在系统发现新硬件时会找到该INF。下面是自动安装驱动的代码:
/**************************************************************
*
* 名称: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 failed\\n\" );
        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 failed\\n\" );
        SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return FALSE;
    }

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

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

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

[编辑 -  5/12/04 by  bingjie]
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-12 14:59
惭愧啊!
努力学习!!!
好好过日子
Quakexg
驱动小牛
驱动小牛
  • 注册日期2001-11-21
  • 最后登录2012-02-29
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望56点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-05-12 15:33
不论怎么样,谢谢各位的关注。
我先试下。
Quakexg
驱动小牛
驱动小牛
  • 注册日期2001-11-21
  • 最后登录2012-02-29
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望56点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-05-12 17:08
[quote]你在硬件向导里添加新硬件选择网卡,驱动选择自己的驱动应该可以的,我安装过NE2000的驱动(没有硬件的)成功过!
祝你好运

NE2000是ISA的驱动,不支持PNP,所以可以没有硬件安装成功。
对于一个支持PNP的设备,好像只能是先插卡再安装驱动。不过可以这样做,在系统弹出对话框要求安装驱动时可以点击取消,然后运行自己的安装程序安装。或者安装程序先把inf文件拷贝到系统目录下的Inf目录下,这样在系统发现新硬件时会找到该INF。下面是自动安装驱动的代码:
/**************************************************************
*
* 名称: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 failed\\n\" );
        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 failed\\n\" );
        SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return FALSE;
    }

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

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

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

不好意思,虽然我写NDIS驱动也有年头了,也用过像snetcfg这样的DDK例子程序,但是却没有调试过DDK中应用层的程序,我把函数放在VC工程里,然后把.h.lib 复制到当前目录,可是还是编译不能通过,好像是找不到函数体(SetupDiCallClassInstaller等),不知道你的这个函数怎么调试的?
还有,我没有插卡时,把INF和SYS放到WINDOWS的INF,SYS32里(SetupCopyOEMInf),关机,可是插上硬件后起来,却还是有“Found New Hardware” wizard 出来。不知道有谁知道这是怎么回事?我的卡是PCI的网卡。

Lonny McMichael的书上好像说,应该如下做,可是我第一步和第4步没有完全弄明白,谁能解释下,万分感谢。
Device-specific co-installer
1。SetupCopyOEMInf
2。UpdateDriverForPlugAndPlayDevices
3。CMP_WaitNoPendingInstallEvents
    Suppress autorun when CD is inserted for Found New Hardware” wizard
4。Supply “finish-install” wizard page(s)
5。Separate core driver files from value-add software
    Core driver files installed via stand-alone Plug and Play device INF
    Value-add software authored in MSI






[编辑 -  5/12/04 by  bingjie] [/quote]
Quakexg
驱动小牛
驱动小牛
  • 注册日期2001-11-21
  • 最后登录2012-02-29
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望56点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-05-12 17:09
不好意思,虽然我写NDIS驱动也有年头了,也用过像snetcfg这样的DDK例子程序,但是却没有调试过DDK中应用层的程序,我把函数放在VC工程里,然后把.h.lib 复制到当前目录,可是还是编译不能通过,好像是找不到函数体(SetupDiCallClassInstaller等),不知道你的这个函数怎么调试的?
还有,我没有插卡时,把INF和SYS放到WINDOWS的INF,SYS32里(SetupCopyOEMInf),关机,可是插上硬件后起来,却还是有“Found New Hardware” wizard 出来。不知道有谁知道这是怎么回事?我的卡是PCI的网卡。

Lonny McMichael的书上好像说,应该如下做,可是我第一步和第4步没有完全弄明白,谁能解释下,万分感谢。
Device-specific co-installer
1。SetupCopyOEMInf
2。UpdateDriverForPlugAndPlayDevices
3。CMP_WaitNoPendingInstallEvents
Suppress autorun when CD is inserted for Found New Hardware” wizard
4。Supply “finish-install” wizard page(s)
5。Separate core driver files from value-add software
Core driver files installed via stand-alone Plug and Play device INF
Value-add software authored in MSI
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-05-12 17:21
不好意思,虽然我写NDIS驱动也有年头了,也用过像snetcfg这样的DDK例子程序,但是却没有调试过DDK中应用层的程序,我把函数放在VC工程里,然后把.h.lib 复制到当前目录,可是还是编译不能通过,好像是找不到函数体(SetupDiCallClassInstaller等),不知道你的这个函数怎么调试的?
还有,我没有插卡时,把INF和SYS放到WINDOWS的INF,SYS32里(SetupCopyOEMInf),关机,可是插上硬件后起来,却还是有“Found New Hardware” wizard 出来。不知道有谁知道这是怎么回事?我的卡是PCI的网卡。

Lonny McMichael的书上好像说,应该如下做,可是我第一步和第4步没有完全弄明白,谁能解释下,万分感谢。
Device-specific co-installer
1。SetupCopyOEMInf
2。UpdateDriverForPlugAndPlayDevices
3。CMP_WaitNoPendingInstallEvents
Suppress autorun when CD is inserted for Found New Hardware” wizard
4。Supply “finish-install” wizard page(s)
5。Separate core driver files from value-add software
Core driver files installed via stand-alone Plug and Play device INF
Value-add software authored in MSI
 

需要链接setupapi.lib newdev.lib ,这两个lib文件在DDK里可以找到
smalldou
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-05-14 15:02
求教:我和前面的有一样的问题,可是是在98上安装modem,我也有inf,可是我在98上找不到newdev.lib,所以用不了UpdateDriverForPlugAndPlayDevices这个函数,各位大侠有没有对应的函数可以用在win98上呀??
Quakexg
驱动小牛
驱动小牛
  • 注册日期2001-11-21
  • 最后登录2012-02-29
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望56点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-05-17 08:34
[quote]不好意思,虽然我写NDIS驱动也有年头了,也用过像snetcfg这样的DDK例子程序,但是却没有调试过DDK中应用层的程序,我把函数放在VC工程里,然后把.h.lib 复制到当前目录,可是还是编译不能通过,好像是找不到函数体(SetupDiCallClassInstaller等),不知道你的这个函数怎么调试的?
还有,我没有插卡时,把INF和SYS放到WINDOWS的INF,SYS32里(SetupCopyOEMInf),关机,可是插上硬件后起来,却还是有“Found New Hardware” wizard 出来。不知道有谁知道这是怎么回事?我的卡是PCI的网卡。

Lonny McMichael的书上好像说,应该如下做,可是我第一步和第4步没有完全弄明白,谁能解释下,万分感谢。
Device-specific co-installer
1。SetupCopyOEMInf
2。UpdateDriverForPlugAndPlayDevices
3。CMP_WaitNoPendingInstallEvents
Suppress autorun when CD is inserted for Found New Hardware” wizard
4。Supply “finish-install” wizard page(s)
5。Separate core driver files from value-add software
Core driver files installed via stand-alone Plug and Play device INF
Value-add software authored in MSI
 

需要链接setupapi.lib newdev.lib ,这两个lib文件在DDK里可以找到 [/quote]

周末过的真快,我使用了这2个LIB和.H,可是还是不行,好像是连接时出错了,找不到函数体!不知道你是怎么弄得?
游客

返回顶部