阅读:2249回复:11
98下安装Modem的驱动。
我现在需要为一张PCMCIA的CDMA无线上网卡在98下做一个驱动安装包,我这张P卡的手动安装过程是先将P卡虚拟成一个串口,然后再新建一个标准的调制解调器33600,然后绑定到这个串口上。我已经完成2000下的驱动安装包。但由于98下对DDK的支持有限,很多SETUPAPI函数执行时会出错,最为严重的是98下没有newdev.dll,因此UpdateDriverForPlugAndPlayDevices就无法执行,不知那位大侠可以给我指点迷津。下面是我的2000下的驱动安装代码,敬请各位关注:
CString m_strDll(""),m_strDriver(""); ::GetSystemDirectory(szBuf,255); m_strDll=(CString)szBuf+"\\newdev.dll"; m_strDriver=m_strPath+"\\Driver\\oxser.inf"; HINSTANCE hInst=::LoadLibrary((LPCTSTR)m_strDll); if(!hInst){ ::MessageBox(m_hWnd,"Failed to load river!","Error",MB_OK+MB_ICONERROR+MB_TOPMOST+MB_APPLMODAL); return; } typedef BOOL (WINAPI* PFNUPDATEDRIVERA)(HWND, LPCSTR, PCSTR, DWORD, PBOOL); PFNUPDATEDRIVERA pfnUpdateDriver=(PFNUPDATEDRIVERA)::GetProcAddress(hInst,"UpdateDriverForPlugAndPlayDevicesA"); if(!pfnUpdateDriver){ ::MessageBox(m_hWnd,"Failed to locate function 'UpdateDriverForPlugAndPlayDevicesA'!","Error",MB_OK+MB_ICONERROR+MB_TOPMOST+MB_APPLMODAL); ::FreeLibrary(hInst); CDialog::OnCancel(); return; } if(!pfnUpdateDriver(m_hWnd,"PCMCIA\\CHPTX-CHPTX-8608",(LPCTSTR)m_strDriver,1,NULL)){ ::MessageBox(m_hWnd,"Failed to load driver for port mapping!","Error",MB_OK+MB_ICONERROR+MB_TOPMOST+MB_APPLMODAL); ::FreeLibrary(hInst); CDialog::OnCancel(); return; } else{ //Load Modem Driver BOOL error=FALSE; HKEY hkResult; LPSTR strport = TEXT("COM4"); unsigned long err = RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SYSTEM\\CurrentControlSet\\Enum\\PCMCIA\\YCIGTX-YCIGTX-8608\\1\\Device Parameters"),0,KEY_QUERY_VALUE,&hkResult); unsigned char PortName[32]; DWORD dwType=REG_SZ,dwSize=32; err=::RegQueryValueEx(hkResult,"PortName",NULL,&dwType,(LPBYTE)PortName,&dwSize); if(err!=ERROR_SUCCESS){ return; } ::RegCloseKey(hkResult); strport = (LPSTR)(LPCTSTR)PortName; LPTSTR HardWareID = TEXT("ChptxE2PROM336"); HDEVINFO DeviceInfoSet2 = SetupDiGetClassDevs(NULL,0,0,DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices present on system SP_DEVINFO_DATA DeviceInfoData2; DeviceInfoData2.cbSize = sizeof(SP_DEVINFO_DATA); for(int i=0;SetupDiEnumDeviceInfo(DeviceInfoSet2,i,&DeviceInfoData2);i++){ DWORD DataT; LPTSTR p,buffer = NULL; DWORD buffersize = 0; while (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet2,&DeviceInfoData2,SPDRP_HARDWAREID,&DataT,(PBYTE)buffer,buffersize,&buffersize)){ if (GetLastError() == ERROR_INVALID_DATA) { break; } else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { if (buffer) LocalFree(buffer); buffer = (LPTSTR)LocalAlloc(LPTR,(SIZE_T)buffersize); } else { error = true; goto cleanup_DeviceInfo2; } } if (GetLastError() == ERROR_INVALID_DATA) continue; for (p=buffer;*p&&(p<&buffer[buffersize]);p+=lstrlen(p)+sizeof(TCHAR)) { if (!_tcscmp(HardWareID,p)) { if (!SetupDiCallClassInstaller(DIF_REMOVE,DeviceInfoSet2,&DeviceInfoData2)) { } break; } } if (buffer) LocalFree(buffer); } cleanup_DeviceInfo2: SetupDiDestroyDeviceInfoList(DeviceInfoSet2); BOOL RebootRequired = FALSE; HardWareID = TEXT("ChptxE2PROM336"); char CurDir[255]; GetCurrentDirectory(255,CurDir); DWORD qq = strlen(CurDir); char s[MAX_PATH]; strcpy(s,CurDir); if (strcmp(&s[qq-1],_T("\\")) == 0 ) strcat((char *)CurDir,_T("Driver\\chptx.inf")); else strcat(CurDir,_T("\\Driver\\chptx.inf")); //StrCat(CurDir,AddDir); LPTSTR INFFile = CurDir; //MessageBox((TEXT("%s"),INFFile),NULL,MB_OK); GUID ClassGUID; char ClassName[128]; if (!SetupDiGetINFClass(INFFile,&ClassGUID,ClassName,sizeof(ClassName),0)){ error = TRUE; SetupDiDestroyDeviceInfoList(DeviceInfoSet2); ::MessageBox(m_hWnd,"Failed to load driver!","Error",MB_OK+MB_ICONERROR+MB_TOPMOST+MB_APPLMODAL); CDialog::OnCancel(); return; } DeviceInfoSet2 = SetupDiCreateDeviceInfoList(&ClassGUID,0); if(DeviceInfoSet2 == INVALID_HANDLE_VALUE){ error = TRUE; SetupDiDestroyDeviceInfoList(DeviceInfoSet2); ::MessageBox(m_hWnd,"Failed to load driver!","Error",MB_OK+MB_ICONERROR+MB_TOPMOST+MB_APPLMODAL); CDialog::OnCancel(); return; } DeviceInfoData2.cbSize = sizeof(SP_DEVINFO_DATA); if (!SetupDiCreateDeviceInfo(DeviceInfoSet2,ClassName,&ClassGUID,NULL,0,DICD_GENERATE_ID,&DeviceInfoData2)){ error = TRUE; SetupDiDestroyDeviceInfoList(DeviceInfoSet2); ::MessageBox(m_hWnd,"Failed to load driver!","Error",MB_OK+MB_ICONERROR+MB_TOPMOST+MB_APPLMODAL); CDialog::OnCancel(); return; } if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet2,&DeviceInfoData2,SPDRP_HARDWAREID,(LPBYTE)HardWareID,(lstrlen(HardWareID)+1+1)*sizeof(TCHAR))){ error = TRUE; SetupDiDestroyDeviceInfoList(DeviceInfoSet2); ::MessageBox(m_hWnd,"Failed to load driver!","Error",MB_OK+MB_ICONERROR+MB_TOPMOST+MB_APPLMODAL); CDialog::OnCancel(); return; } if (!SetupDiRegisterDeviceInfo(DeviceInfoSet2,&DeviceInfoData2,0,0,0,0)){ error = TRUE; SetupDiDestroyDeviceInfoList(DeviceInfoSet2); ::MessageBox(m_hWnd,"Failed to load driver!","Error",MB_OK+MB_ICONERROR+MB_TOPMOST+MB_APPLMODAL); CDialog::OnCancel(); return; } HKEY ClassKey; if (!pfnUpdateDriver(0,HardWareID,INFFile,1,&RebootRequired)){ error = TRUE; if (!SetupDiCallClassInstaller(DIF_REMOVE,DeviceInfoSet2,&DeviceInfoData2)){ error = TRUE; SetupDiDestroyDeviceInfoList(DeviceInfoSet2); ::MessageBox(m_hWnd,"Failed to load driver!","Error",MB_OK+MB_ICONERROR+MB_TOPMOST+MB_APPLMODAL); CDialog::OnCancel(); return; } } ClassKey = SetupDiOpenDevRegKey(DeviceInfoSet2,&DeviceInfoData2,DICS_FLAG_GLOBAL,0,DIREG_DRV,KEY_ALL_ACCESS); if (ClassKey == INVALID_HANDLE_VALUE){ error = TRUE; SetupDiDestroyDeviceInfoList(DeviceInfoSet2); ::MessageBox(m_hWnd,"Failed to load driver!","Error",MB_OK+MB_ICONERROR+MB_TOPMOST+MB_APPLMODAL); CDialog::OnCancel(); return; } ::RegSetValueEx(ClassKey,"AttachedTo",0,REG_SZ,(BYTE *)strport , strlen(strport) + 1); ::RegCloseKey(ClassKey); SetupDiDestroyDeviceInfoList(DeviceInfoSet2); ::MessageBox(m_hWnd,"Failed to load driver!","Congratulations",MB_OK+MB_ICONWARNING+MB_TOPMOST+MB_APPLMODAL); ::FreeLibrary(hInst); int nAck=::MessageBox(m_hWnd,"YCIG M6E2PROM PCMCIA调制解调器已经安装完毕,您需重启计算机,现在重启吗?","Confirmation",MB_YESNO+MB_ICONWARNING+MB_TOPMOST+MB_APPLMODAL+MB_DEFBUTTON1); if(nAck==IDYES){ HANDLE hToken; TOKEN_PRIVILEGES tkp; if(!::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken)) return; //Get the LUID ::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); tkp.PrivilegeCount=1; tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; ::AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0); if(::GetLastError()!=ERROR_SUCCESS) return; if(!::ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0)) return; return; } else CDialog::OnOK(); } 上面的这段代码在2000/XP/2003上可以成功地对P卡驱动进行安装。但在98下就会出错。请各位指教。 |
|
沙发#
发布于:2004-08-24 16:27
难道没有人知道?
|
|
板凳#
发布于:2004-08-24 16:34
98系统和NT系统差别很大.
|
|
地板#
发布于:2004-08-24 16:53
谢谢您的回复,不知可否指点一下我需要对上述我写的程序作哪些改进?
|
|
地下室#
发布于:2004-08-24 20:17
上述的一些函数98下不支持的
|
|
|
5楼#
发布于:2004-08-24 21:15
你得查看98下的DDK的帮助呀。
|
|
6楼#
发布于:2004-08-25 11:17
再次谢谢您的回复.98DDK我暂时没有,不过98DKK下是否有UpdateDriverForPlugAndPlayDevices函数呢?
|
|
7楼#
发布于:2004-08-26 11:10
得用98DDK和早期的VC编译器,因为98下的安装程序得用16位程序实现。
|
|
8楼#
发布于:2004-08-27 10:17
To lxxmd:
首先谢谢您的回复,不过我所贴出的代码已经可以成功实现MODEM的安装。您可能没有明白我的意思,我需要的是98下的安装程序,你发给的fastinst我看了,很明显, 它是不支持98的,因为其中的一个函数UpdateDriverForPlugAndPlayDevices在98下就不支持,98下也没有newdev.dll |
|
9楼#
发布于:2004-08-27 10:21
看来没有办法了,只能用新建标准的调制解调器33600了。
|
|
10楼#
发布于:2004-09-07 00:40
很多人问过这个问题了,那个FansInstall应该是可以的。
据说98下的安装必须用SetupXApi,那是一套16位的API,本是属于win95DDK的,需要用VC1.5或更早的版本来编译. 所以,大部分人做的win98驱动安装都是直接写注册表了,但是这样会带来很多其他问题, 郁闷... |
|
11楼#
发布于:2004-12-31 14:16
98系统和NT系统差别很大. 上面的程序,为什么要重启才能拔号???? |
|