kingcaiyao(akin
驱动牛犊
驱动牛犊
  • 注册日期2004-08-20
  • 最后登录2004-08-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2174回复:11

98下安装Modem的驱动。

楼主#
更多 发布于:2004-08-23 14:00
我现在需要为一张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下就会出错。请各位指教。
kingcaiyao(akin
驱动牛犊
驱动牛犊
  • 注册日期2004-08-20
  • 最后登录2004-08-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-24 16:27
难道没有人知道?
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-24 16:34
98系统和NT系统差别很大.
kingcaiyao(akin
驱动牛犊
驱动牛犊
  • 注册日期2004-08-20
  • 最后登录2004-08-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-24 16:53
谢谢您的回复,不知可否指点一下我需要对上述我写的程序作哪些改进?
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-24 20:17
上述的一些函数98下不支持的
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-24 21:15
你得查看98下的DDK的帮助呀。
kingcaiyao(akin
驱动牛犊
驱动牛犊
  • 注册日期2004-08-20
  • 最后登录2004-08-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-25 11:17
再次谢谢您的回复.98DDK我暂时没有,不过98DKK下是否有UpdateDriverForPlugAndPlayDevices函数呢?
lxxmmd
驱动牛犊
驱动牛犊
  • 注册日期2004-04-14
  • 最后登录2005-02-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-26 11:10
得用98DDK和早期的VC编译器,因为98下的安装程序得用16位程序实现。
kingcaiyao(akin
驱动牛犊
驱动牛犊
  • 注册日期2004-08-20
  • 最后登录2004-08-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-27 10:17
To lxxmd:
首先谢谢您的回复,不过我所贴出的代码已经可以成功实现MODEM的安装。您可能没有明白我的意思,我需要的是98下的安装程序,你发给的fastinst我看了,很明显, 它是不支持98的,因为其中的一个函数UpdateDriverForPlugAndPlayDevices在98下就不支持,98下也没有newdev.dll
kingcaiyao(akin
驱动牛犊
驱动牛犊
  • 注册日期2004-08-20
  • 最后登录2004-08-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-27 10:21
看来没有办法了,只能用新建标准的调制解调器33600了。
smalldou
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-09-07 00:40
很多人问过这个问题了,那个FansInstall应该是可以的。

据说98下的安装必须用SetupXApi,那是一套16位的API,本是属于win95DDK的,需要用VC1.5或更早的版本来编译.

所以,大部分人做的win98驱动安装都是直接写注册表了,但是这样会带来很多其他问题, 郁闷...
lzqxx
驱动牛犊
驱动牛犊
  • 注册日期2004-12-27
  • 最后登录2005-01-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-31 14:16
98系统和NT系统差别很大.

上面的程序,为什么要重启才能拔号????
游客

返回顶部