// // 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 } } }
太长了如果设备从系统一开始就一直没有加载,那么可以安装成功,
如果已经加载过了,再升级,就死在那
如果已经加载过了,那么卸载之后(不管是设备管理器卸载,还是我的程序卸载),再进行升级,那么只能找到一个设备,而且加载上是错的,没有了硬件信息,类似: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.
}
不过你可以那样试一下:
1. 在安装之前先删除所有的设备,然后再用UpdateDriverForPlugAndPlayDevices来安装
2. 删除所有的设备,把INF考到系统INF目录下,把Driver拷到对应的目录下,调用CM_Reenumeate_DevNode,强迫系统重新检索所有的设备,系统会把驱动程序给安装上去。
。这个功能我能实现,就是不知道是不是加载的最新的。
2. 如果你的驱动版本是新的,而且不存在驱动认证的问题,那么你安装的会是新的驱动,你可以把两个INF都考到系统INF目录下,然后在设备管理器中删除设备,让系统自己找,看安装的是那个设备
如 原来是c:\driver,安装完毕,
然后我把它改成c:\driver1
再然后用我的驱动安装c:\driver1下的inf文件,结果系统就找不到c:\driver1下的sys了,也找不到system32\drivers下的sys
其实最关键的问题是为什么我update就得不到类似:PCI Slot 5 (PCI 总线 4、设备 0、功能 0)的信息,否则也不用这么麻烦了实在不行,如果检测到设备已经安装,我只复制一个最新得sys到system32\drivers下,然后提醒用户重启就完了,不过比较流氓,呵呵
SP_PROPCHANGE_PARAMS params;
memset(¶ms, 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) ¶ms,
sizeof(SP_PROPCHANGE_PARAMS)))
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return FALSE;
}
if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, DeviceInfoSet, &DeviceInfoData))
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return FALSE;
}
这段代码在Win2K和WINXP下有可能会没有反映(在Win9X下一定 会成功,所以如果你要用这段代码的话(在Win2K下)必须要判断设备是否有成功Reset。
刚才试过了,真的好了明天再研究研究,谢谢你
1。删除系统inf目录下所有与目前设备有关的inf和PNF文件,以及system下的sys文件。
2。用SetupCopyOEMInf安装inf
3.用CM_Reenumeate_DevNode刷新,就不会出现找文件的对话框了。但是也有问题,SetupCopyOEMInf安装时会提示没有数字签名,呵呵先这样吧,假如你有好的建议,希望继续讨论。
顺便问一下,你的名字theone是指老米的歌吗?
数字签名比较讨厌,想绕过他,我想除了交钱给MICROSOFT,那么只有直接写注册表,你可以试一下。
theone没有什么特别的来历^_^