用DDK的例子install和remove也一样如果是安装就可以,但是只能一个一个装上,如果是已经有驱动了,就会死在UpdateDriverForPlugAndPlayDevices。但如果只有一个设备就可以请高手指教

解决方案 »

  1.   

    刚才说的好像不对,remove好像可以都删了
      

  2.   

    代码基本就是windows ddk(w2k)的install里的
    太长了如果设备从系统一开始就一直没有加载,那么可以安装成功,
    如果已经加载过了,再升级,就死在那
    如果已经加载过了,那么卸载之后(不管是设备管理器卸载,还是我的程序卸载),再进行升级,那么只能找到一个设备,而且加载上是错的,没有了硬件信息,类似:PCI Slot 5 (PCI 总线 4、设备 0、功能 0),如果这时重新启动w2k,就会蓝屏,但是如果是设备管理器扫描的就是好的,怪呀我说的乱不乱?:(
    郁闷中int InstallDriver(LPCSTR hardID,LPCSTR infFile)
    {
        WIN32_FIND_DATA FindFileData;
        BOOL RebootRequired = 0; // Must be cleared.
        
        //
        // Verify the Arguments.
        //
        HANDLE hFile=FindFirstFile(infFile,&FindFileData);    if (hFile==INVALID_HANDLE_VALUE)
        {
            _tprintf(TEXT("  File not found.\n"));
            _tprintf(TEXT("usage: install <INF_File> <Hardware_ID>\n"));
            return 2; // Install Failure
        }
        FindClose(hFile);    //
        // Look to see if this device allready exists.
        //
    //Uninstall(hardID);
        if (FindExistingDevice(hardID))
        {
    // MessageBox(NULL,"111","111",MB_OK);
            //
            // No Need to Create a Device Node, just call our API.
            //
            if (!UpdateDriverForPlugAndPlayDevices(0, // No Window Handle
                hardID, // Hardware ID
                infFile, // FileName
                INSTALLFLAG_FORCE,
                &RebootRequired))
            {
                DisplayError(TEXT("UpdateDriverForPlugAndPlayDevices..."));
                return 2; // Install Failure
            }
    _tprintf(TEXT("ll\n"));
    //ScanForHardwareChange();
        }
        else
        {
            if (GetLastError()!= ERROR_NO_MORE_ITEMS)
            {
                //
                // An unknown failure from FindExistingDevice()
                //
                return 2; // Install Failure
            }
            
            // 
            // Driver Does not exist, Create and call the API.
            // HardwareID must be a multi-sz string, which argv[2] is.
            //
            if (!InstallRootEnumeratedDriver(hardID, // HardwareID
                infFile, // FileName
                &RebootRequired))
            {
            DisplayError(TEXT("InstallRootEnumeratedDriver..."));
    if (GetLastError()!= ERROR_NO_MORE_ITEMS)
    {
                return 2; // Install Failure
    }
            }
        }
        
        _tprintf(TEXT("Driver Installed successfully.\n"));
        
        if (RebootRequired)
        {
            _tprintf(TEXT("(Reboot Required)\n"));
            return 1; // Install Success, reboot required.
        }
        
        return 0; // Install Success, no reboot required.
    }
      

  3.   

    看这段代码似乎没有问题,我曾试过给八个一样的设备更新Driver,没有发现问题。
    不过你可以那样试一下:
    1. 在安装之前先删除所有的设备,然后再用UpdateDriverForPlugAndPlayDevices来安装
    2. 删除所有的设备,把INF考到系统INF目录下,把Driver拷到对应的目录下,调用CM_Reenumeate_DevNode,强迫系统重新检索所有的设备,系统会把驱动程序给安装上去。
      

  4.   

    1.我先删除设备,然后InstallRootEnumeratedDriver或者只用UpdateDriverForPlugAndPlayDevices安装的结果都是错的,就是设备安装完了没有类似:PCI Slot 5 (PCI 总线 4、设备 0、功能 0)的信息,若重启就死机。是不是我的inf文件有问题啊?不能在加载的时候自动读取PCI卡在主板的位置信息?该怎么办?2.假设我以前安装过这个设备的旧驱动,那么系统会记住安装目录(例如,卸载板卡后重新启动,系统会自动跑到这个目录把驱动安装上),把INF考到系统INF目录下,把Driver拷到对应的目录下之后,再刷新,系统加载的会是老驱动,还是刚拷贝的新驱动?如果是新驱动就好了
    。这个功能我能实现,就是不知道是不是加载的最新的。
      

  5.   

    1. 看看驱动信息,驱动是否被正确加载,把INF和驱动程序换成你以前可以正确安装的INF和驱动程序试一下,看可不可以正确work
    2. 如果你的驱动版本是新的,而且不存在驱动认证的问题,那么你安装的会是新的驱动,你可以把两个INF都考到系统INF目录下,然后在设备管理器中删除设备,让系统自己找,看安装的是那个设备
      

  6.   

    刚试过,装的是老的,我把原来的目录改名字了,结果出来个对话框找sys:(
      

  7.   

    改的是上一次安装驱动的目录,
    如 原来是c:\driver,安装完毕,
    然后我把它改成c:\driver1
    再然后用我的驱动安装c:\driver1下的inf文件,结果系统就找不到c:\driver1下的sys了,也找不到system32\drivers下的sys
      

  8.   

    inf文件可以加入sys文件的path吗?呵呵
    其实最关键的问题是为什么我update就得不到类似:PCI Slot 5 (PCI 总线 4、设备 0、功能 0)的信息,否则也不用这么麻烦了实在不行,如果检测到设备已经安装,我只复制一个最新得sys到system32\drivers下,然后提醒用户重启就完了,不过比较流氓,呵呵
      

  9.   

    把INF中关于copyfile的节都Mark掉,自己把驱动拷到相应目录下,就不会出来这些东西
      

  10.   

    如果只是驱动改变的话,你可以对设备做reset的动作,
    SP_PROPCHANGE_PARAMS params;
    memset(&params, 0, sizeof(SP_PROPCHANGE_PARAMS));
    params.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
    params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
    params.StateChange = DICS_PROPCHANGE;
    params.Scope       = DICS_FLAG_CONFIGSPECIFIC;
    params.HwProfile   = 0;
    if(!SetupDiSetClassInstallParams(DeviceInfoSet,&DeviceInfoData,
    (PSP_CLASSINSTALL_HEADER) &params,
    sizeof(SP_PROPCHANGE_PARAMS)))
    {
    SetupDiDestroyDeviceInfoList(DeviceInfoSet);
    return FALSE;
    }
    if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, DeviceInfoSet, &DeviceInfoData))
    {
    SetupDiDestroyDeviceInfoList(DeviceInfoSet);
    return FALSE;
    }
    这段代码在Win2K和WINXP下有可能会没有反映(在Win9X下一定 会成功,所以如果你要用这段代码的话(在Win2K下)必须要判断设备是否有成功Reset。
      

  11.   

    "把INF中关于copyfile的节都Mark掉,自己把驱动拷到相应目录下,就不会出来这些东西"
    刚才试过了,真的好了明天再研究研究,谢谢你
      

  12.   

    你的第二种方法试过了,不行"把INF中关于copyfile的节都Mark掉"也不行,因为CM_Reenumeate_DevNode会立即返回,我如果马上返回再把没有Mark掉copyfile的inf拷到系统inf目录下,就有可能一部分设备安装时又要找文件,如果就保留着那个Mark掉copyfile的inf,那么以后客户不用我的安装程序,而直接用设备管理器更新时,就会有问题。我现在的解决办法是:
    1。删除系统inf目录下所有与目前设备有关的inf和PNF文件,以及system下的sys文件。
    2。用SetupCopyOEMInf安装inf
    3.用CM_Reenumeate_DevNode刷新,就不会出现找文件的对话框了。但是也有问题,SetupCopyOEMInf安装时会提示没有数字签名,呵呵先这样吧,假如你有好的建议,希望继续讨论。
    顺便问一下,你的名字theone是指老米的歌吗?
      

  13.   

    可以试一下把INF和SYS放到一个目录下,保存所有的COPYFILE节,这样应该也不会有找文件的对话框。
    数字签名比较讨厌,想绕过他,我想除了交钱给MICROSOFT,那么只有直接写注册表,你可以试一下。
    theone没有什么特别的来历^_^