hyzimbtb
驱动牛犊
驱动牛犊
  • 注册日期2004-08-27
  • 最后登录2010-11-10
  • 粉丝2
  • 关注0
  • 积分387分
  • 威望216点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
阅读:2287回复:11

怎么在程序中实现对passthru的动态安装和卸载?

楼主#
更多 发布于:2007-11-19 09:47
怎么在程序中实现对passthru的动态安装和卸载?刚刚接触驱动,希望各位帮忙
hyzimbtb
驱动牛犊
驱动牛犊
  • 注册日期2004-08-27
  • 最后登录2010-11-10
  • 粉丝2
  • 关注0
  • 积分387分
  • 威望216点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-11-19 15:43
我的意思是不用inf文件实现对passthru驱动的安装,卸载已经知道
herolib
驱动牛犊
驱动牛犊
  • 注册日期2005-03-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分531分
  • 威望86点
  • 贡献值0点
  • 好评度51点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-11-19 15:50
驱动 安装 当然要 info 了

你的想法太牛,我帮不到你
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地板#
发布于:2007-11-19 16:04
应该用inf,否则就自己去做ms为你做的所有的事情,只要你能知道
走走看看开源好 Solaris vs Linux
hyzimbtb
驱动牛犊
驱动牛犊
  • 注册日期2004-08-27
  • 最后登录2010-11-10
  • 粉丝2
  • 关注0
  • 积分387分
  • 威望216点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-11-19 22:56
利用inf文件的话,怎么在程序中实现安装呢?还有如何在程序中卸载呢?
yingdi
驱动牛犊
驱动牛犊
  • 注册日期2007-11-15
  • 最后登录2008-08-14
  • 粉丝0
  • 关注0
  • 积分192分
  • 威望46点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-11-19 23:17
强烈关注.!!!!!!!!!
这个问题不止一个人想知道答案。
如果哪位愿意慷慨赐教,把自己的经验和大家一起分享。真的非常感激。
yingdi
驱动牛犊
驱动牛犊
  • 注册日期2007-11-15
  • 最后登录2008-08-14
  • 粉丝0
  • 关注0
  • 积分192分
  • 威望46点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-11-19 23:48
这位兄台,我刚从别的网站看到有这末个帖子,给你贴一下看有没有帮助。
同时请各位高手给把下关,下面的代码真的可以嘛?


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DWORD GetServiceInfFilePath_Passthru(
     LPTSTR lpFilename,
     DWORD nSize
     )
{
     // Get Path to This Module
     DWORD    nResult;
     TCHAR    szDrive[ _MAX_DRIVE ];
     TCHAR    szDir[ _MAX_DIR ];

     nResult = GetModuleFileName( NULL, lpFilename, nSize );

     if( nResult == 0 )
     {
         return 0;
     }

     _tsplitpath( lpFilename, szDrive, szDir, NULL, NULL );

     _tmakepath( lpFilename, szDrive, szDir, _T ("netsf"), _T(".inf") );

     return (DWORD )_tcslen( lpFilename );
}

DWORD GetServiceInfFilePath_PassthruMP(
     LPTSTR lpFilename,
     DWORD nSize
     )
{
     // Get Path to This Module
     DWORD    nResult;
     TCHAR    szDrive[ _MAX_DRIVE ];
     TCHAR    szDir[ _MAX_DIR ];

     nResult = GetModuleFileName( NULL, lpFilename, nSize );

     if( nResult == 0 )
     {
         return 0;
     }

     _tsplitpath( lpFilename, szDrive, szDir, NULL, NULL );

     _tmakepath( lpFilename, szDrive, szDir, _T ("netsf_m"), _T(".inf") );

     return (DWORD )_tcslen( lpFilename );
}

DWORD InstallDriver_Passthru()
{
     DWORD    nResult;

     //_tprintf( _T("Installing %s...\n"), NDISPROT_FRIENDLY_NAME );

     nResult = MessageBox(NULL,    _T("你要安装 Passthru 网络驱动?" ),   _T ("Passthru网络过滤驱动"), MB_OKCANCEL | MB_ICONINFORMATION );

     if( nResult != IDOK )
     {
         return 0;
     }

     // Get Path to Service INF File
     // ----------------------------
     // The INF file is assumed to be in the same folder as this application...
     TCHAR    szFileFullPath[ _MAX_PATH ];
    

//-----------------------------------------------------------------------
//第一次在一个系统上使用这个程序安装Passthru时,会出现安装失败的情况,或者
//安装成功,但passthru miniport的部分没有安装上去,在windows 目录下 的setupapi.log文件中可以看到
//安装失败记录,错误是找不到文件。在“设备管理器”选择显示隐藏设备后
//也不会在 网络适配器 下面看到 passthru miniport项。但手动安装在'本地网络属性"->"安装"->”服务“选择
//硬盘上netsf.inf进行安装成功候,再用程序安装就可以了。
//在网络上查了一下,这个问题应该是因为 Passthru这个驱动需要两个inf文件,而netsf_m.inf并不没有被复制到
//系统的inf 目录(c:\windows\inf)去。虽然 netsf.inf 里面有[CopyInf   = netsf_m.inf]项要求复制netsf_m.inf
//但这个不能 正常工作(The \"CopyINF\" directive, by design, is only observed if the original INF is
     //not yet in the INF directory. So to work around the problem, you have to
     //update your installation app (snetcfg) to also copy the Net class (miniport)
     //inf using SetupCopyOEMInf when it comes to installing IM drivers. Make sure
     //you specify a fully qualified path of the INF in the SetupCopyOEMInf
     //arguments.
     //)
//
//所以这个问题的解决就是自己把 netsf_m.inf这个文件放到c:\windows\inf目录去。这可以通过在 netsf.inf里面添加
//copyfile项,像copy Passthru.sys一样添加一项copy   netsf_m.inf的项。另一种方法就是像下面这样添加调用
//SetupCopyOEMInfW来复制netsf_m.inf的代码
TCHAR      szDrive[ _MAX_DRIVE ];
TCHAR      szDir[ _MAX_DIR ];
     TCHAR      szDirWithDrive[_MAX_DRIVE+_MAX_DIR];
     nResult =   GetServiceInfFilePath_PassthruMP( szFileFullPath, MAX_PATH );
     if( nResult == 0 )
     {
         //_tprintf( _T("Unable to get INF file path.\n") );
   MessageBox(NULL, _T("获取INF文件路径失败!"),_T("安装程序错误提示"),MB_OK);
         return 0;
     }
      //
         // Get the path where the INF file is.
         //
         _tsplitpath( szFileFullPath, szDrive, szDir, NULL, NULL );

         _tcscpy( szDirWithDrive, szDrive );
         _tcscat( szDirWithDrive, szDir );
if ( !SetupCopyOEMInfW(
             szFileFullPath,
             szDirWithDrive, // Other files are in the
             // same dir. as primary INF
             SPOST_PATH,     // First param is path to INF
             0,              // Default copy style
             NULL,           // Name of the INF after
             // it's copied to %windir%\inf
             0,              // Max buf. size for the above
             NULL,           // Required size if non-null
             NULL)           // Optionally get the filename
             // part of Inf name after it is copied.
             )
{
   MessageBox(NULL, _T("复制 PasstruMP 的inf安装文件到系统目录失败!"),_T("安装程序错误提示"),MB_OK);

}
     //------------------------------------------------------------------------


     nResult = GetServiceInfFilePath_Passthru( szFileFullPath, MAX_PATH );

     if( nResult == 0 )
    {
     //     _tprintf( _T("Unable to get INF file path.\n") );
   MessageBox(NULL, _T("获取INF文件路径失败!"),_T("安装程序错误提示"),MB_OK);
         return 0;
     }

     //_tprintf( _T("INF Path: %s\n"), szFileFullPath );

     HRESULT hr=S_OK;

     //_tprintf( _T("PnpID: %s\n"),   _T( "ms_passthru"));

     hr = InstallSpecifiedComponent(
         szFileFullPath,                    //驱动安装的inf文件路径 , 适当修改吧
         _T ("ms_passthru"),                 // NDISPROT_SERVICE_PNP_DEVICE_ID,    //这个也要适当修改的
         &GUID_DEVCLASS_NETSERVICE            //NDIS Protocal 类型
         );

     if( hr != S_OK )
     {
         /*ErrMsg( hr, L"InstallSpecifiedComponent\n" );*/
   MessageBox(NULL, _T("安装驱动失败!"),_T("安装程序错误提示"),MB_OK);
     }else
{
      MessageBox(NULL, _T("成功安装驱动!"),_T("安装程序提示"),MB_OK);
}

     return 0;
}

DWORD UninstallDriver_Passthru()
{
     //_tprintf( _T("Uninstalling %s...\n"), NDISPROT_FRIENDLY_NAME );

     int nResult = MessageBox(NULL,   _T("你要卸载Passthru网络驱动?" ), _T ("Passthru网络过滤驱动"), MB_OKCANCEL | MB_ICONINFORMATION );

     if( nResult != IDOK )
     {
         return 0;
     }

     INetCfg               *pnc;
     INetCfgComponent      *pncc;
     INetCfgClass          *pncClass;
     INetCfgClassSetup     *pncClassSetup;
     LPTSTR                lpszApp;
     GUID                  guidClass;
     OBO_TOKEN             obo;
     HRESULT               hr;

     hr = HrGetINetCfg( TRUE, APP_NAME, &pnc, &lpszApp );

     if ( hr == S_OK ) {

         //
         // Get a reference to the network component to uninstall.
         //
         hr = pnc->FindComponent( _T ("ms_passthru"), &pncc );

         if ( hr == S_OK )
         {
             //
             // Get the class GUID.
             //
             hr = pncc->GetClassGuid( &guidClass );

             if ( hr == S_OK )
             {
                 //
                 // Get a reference to component's class.
                 //

                 hr = pnc->QueryNetCfgClass( &guidClass,
                     IID_INetCfgClass,
                     (PVOID *)&pncClass );
                 if ( hr == S_OK )
                 {
                     //
                     // Get the setup interface.
                     //

                     hr = pncClass->QueryInterface( IID_INetCfgClassSetup,
                         (LPVOID *)&pncClassSetup );

                     if ( hr == S_OK )
                     {
                         //
                         // Uninstall the component.
                         //

                         ZeroMemory( &obo,
                             sizeof(OBO_TOKEN) );

                         obo.Type = OBO_USER;

                         hr = pncClassSetup->DeInstall( pncc,
                             &obo,
                             NULL );
                         if ( (hr == S_OK) || (hr == NETCFG_S_REBOOT) )
                         {
                             hr = pnc->Apply();

                             if ( (hr != S_OK) && (hr != NETCFG_S_REBOOT) )
                             {
                                 //ErrMsg( hr,
                                 //     L"Couldn't apply the changes after"
                                 //     L" uninstalling %s.",
                                 //     _T ("ms_passthru" ));
         MessageBox(NULL, _T ("卸载驱动之后无法成功应用!"),_T ("安装程序错误提示"),MB_OK);
                             }else
        {
           MessageBox(NULL, _T("成功卸载驱动!"),_T("安装程序提示"),MB_OK);
        }
                         }
                         else
                         {
                             //ErrMsg( hr,
                             //     L"Failed to uninstall %s.",
                             //     _T("ms_passthru" ));
        MessageBox(NULL, _T("卸载网络组件失败!"),_T("安装程序错误提示"),MB_OK);
                         }

                         ReleaseRef( pncClassSetup );
                     }
                     else
                     {
                         //ErrMsg( hr,
                         //     L"Couldn't get an interface to setup class." );
       MessageBox(NULL, _T("无法得到安装类接口!"),_T("安装程序错误提示"),MB_OK);
                     }

                     ReleaseRef( pncClass );
                 }
                 else
                 {
                     //ErrMsg( hr,
                     //     L"Couldn't get a pointer to class interface "
                     //     L"of %s.",
                     //     _T ("ms_passthru") );
      MessageBox(NULL, _T("无法得到安装类接口!"),_T("安装程序错误提示"),MB_OK);
                 }
             }
             else
             {
                 //ErrMsg( hr,
                 //     L"Couldn't get the class guid of %s.",
                 //     _T("ms_passthru") );
     MessageBox(NULL, _T("无法得到安装类接口的 GUID !"),_T("安装程序错误提示"),MB_OK);
             }

             ReleaseRef( pncc );
         }
         else
         {
             //ErrMsg( hr,
             //     L"Couldn't get an interface pointer to %s.",
             //     _T ("ms_passthru") );

    MessageBox(NULL, _T("无法得到一个接口指针!"),_T("安装程序错误提示"),MB_OK);
         }

         HrReleaseINetCfg( pnc,
             TRUE );
     }
     else
     {
         if ( (hr == NETCFG_E_NO_WRITE_LOCK) && lpszApp )
         {
           //   ErrMsg( hr,
          //        L"%s currently holds the lock, try later.",
           //       lpszApp );
             MessageBox(NULL, _T("碰到死锁问题,稍后再试!"),_T("安装程序错误提示"),MB_OK);
             CoTaskMemFree( lpszApp );
         }
         else
         {
            // ErrMsg( hr, L"Couldn't get the notify object interface." );
     MessageBox(NULL, _T("无法得到通知对象接口!"),_T("安装程序错误提示"),MB_OK);
         }
     }

     return 0;
}
yingdi
驱动牛犊
驱动牛犊
  • 注册日期2007-11-15
  • 最后登录2008-08-14
  • 粉丝0
  • 关注0
  • 积分192分
  • 威望46点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-11-20 00:36
听说安装用这个命令:snetcfg -l .\\netsf.inf -c s -i ms_passthru
卸载就不知道
hyzimbtb
驱动牛犊
驱动牛犊
  • 注册日期2004-08-27
  • 最后登录2010-11-10
  • 粉丝2
  • 关注0
  • 积分387分
  • 威望216点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-11-20 09:12
感谢各位兄弟的帮忙,试验后上报结果
robar
驱动牛犊
驱动牛犊
  • 注册日期2007-06-27
  • 最后登录2013-06-24
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望41点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-11-20 17:24
引用第7楼yingdi于2007-11-20 00:36发表的  :
听说安装用这个命令:snetcfg -l .\netsf.inf -c s -i ms_passthru
卸载就不知道



卸载就是 snetcfg -l .\netsf.inf -c s -u ms_passthru
yellowzzp
驱动小牛
驱动小牛
  • 注册日期2007-07-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1015分
  • 威望131点
  • 贡献值0点
  • 好评度117点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-11-20 17:42
直接用。。DDK 2600里面的例子就可以拉!!!NDIS 文件夹下的。。config 看他的代码是如何写的!!!!!!!!!!!!!!!!!!!!!!!1
yingdi
驱动牛犊
驱动牛犊
  • 注册日期2007-11-15
  • 最后登录2008-08-14
  • 粉丝0
  • 关注0
  • 积分192分
  • 威望46点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-11-21 11:12
使用snetcfg -l .\\netsf.inf -c s -i ms_passthru 安装时
报0x80070002的错.如何解决?是不是要修改注册表?如何改呢?
游客

返回顶部