您的位置:首页 > 其它

YJX_Driver_023_NT式驱动的卸载

2016-04-06 15:34 337 查看
1、

NT式驱动的安装
  A、卸载驱动流程
  B、内核函数DeleteService
  C、内核函数ControlService
  D、构建UnLoadSys函数
  E、测试并查看调试信息

【100】

一、卸载驱动流程

  1、用OpenSCManager函数打开 服务控制管理器,取得SCM句柄,如果返回NULL,则结束,否则继续2.//hSCM

  2、用OpenService打开相应的服务,如果返回NULL,则结束,否则继续3.hSerVice

  3、用ControlService停止驱动服务,如果返回NULL,只有重新启动才能,再动态加载。

  4、用DeleteService动态卸载驱动程序,如果返回NULL,则打印出错调试信息,否则打印成功信息。

【445】MSDN中 查看 ControlService

【785】MSDN中 查看 DeleteService

【1000】封装在 函数UnLoadSys 中

//卸载驱动程序

BOOL UnLoadSys( char * szSvrName )
{
  //一、定义所用到的变量
  BOOL bRet = FALSE;
  SC_HANDLE hSCM=NULL;//SCM管理器的句柄,用来存放OpenSCManager的返回值
  SC_HANDLE hService=NULL;//NT驱动程序的服务句柄,用来存放OpenService的返回值
  SERVICE_STATUS SvrSta;

  //二、打开SCM管理器
  hSCM = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
  if( hSCM == NULL )
  {
    //打开SCM管理器失败
    TRACE( "OpenSCManager() Faild %d ! \n", GetLastError() );
    bRet = FALSE;
    goto BeforeLeave;
  }
  else
  {
    //打开SCM管理器成功
    TRACE( "OpenSCManager() ok ! \n" );
  }

  //三、打开驱动所对应的服务
  hService = OpenService( hSCM, szSvrName, SERVICE_ALL_ACCESS );
  if( hService == NULL )
  {
    //打开驱动所对应的服务失败 退出
    TRACE( "OpenService() Faild %d ! \n", GetLastError() );
    bRet = FALSE;
    goto BeforeLeave;
  }
  else
  {
    TRACE( "OpenService() ok ! \n" ); //打开驱动所对应的服务 成功
  }

  //四、停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。
  if( !ControlService( hService, SERVICE_CONTROL_STOP , &SvrSta ) )
  {
    TRACE( "用ControlService() 停止驱动程序失败 错误号:%d !\n", GetLastError() );
  }
  else
  {
    //停止驱动程序成功
    TRACE( "用ControlService() 停止驱动程序成功 !\n" );
  }

  //五、动态卸载驱动服务。
  if( !DeleteService( hService ) ) //TRUE//FALSE
  {
    //卸载失败
    TRACE( "卸载失败:DeleteSrevice()错误号:%d !\n", GetLastError() );
  }
  else
  {
    //卸载成功
    TRACE ( "卸载成功 !\n" );
  }
  bRet = TRUE;

  //六、离开前关闭打开的句柄
BeforeLeave:
  if(hService>0)
  {
    CloseServiceHandle(hService);
  }
  if(hSCM>0)
  {
    CloseServiceHandle(hSCM);
  }
  return bRet;
}

【2750】把 第22课 的相关代码复制过来

  【2880】打开 DebugView,加载 第19课 的驱动

  【3030】成功载入了驱动

【3150】将 函数UnLoadSys 复制进来,并 前置声明

【3305】定义 全局变量"CString DriverName;"



CString DriverName;

void CLoadsysDlg::OnButtonUnloadsys()
{
  UnLoadSys(DriverName.GetBuffer(256));
}



OnButtonLoadsys() 中添加 DriverName = sysFile.GetFileName();

【3870】换一个驱动 来测试

  【3940】把 第19课 的驱动 HelloWorld.sys 改名为 Hello.sys

  【3970】打开 DebugView,加载驱动

    【4025】有一个信息 “对象名有冲突” 打印出来。∵ 在之前我们已经创建了 一个设备

  【4080】此时想要点击 "卸载驱动"

【4088】电脑蓝屏了...

【4125】重新测试,代码应该是正确的

  【4210】打开 DebugView

  【4240】加载 驱动(ZC: 貌似加载的 还是 刚才的 Hello.sys)

  【4260】刚才是由于,提前 我们载入了一个同名的驱动 相同的驱动创建了相关的设备,没有正常的卸载,然后我们又改了名 重新载入之后 它出错蓝屏了

  【4270】ZC: 本次载入貌似蛮成功的

  【4315】现在 卸载 试试看

    【4325】正常卸载了

  【4365】用 KernelDetective 看一下

    【4408】标签页"驱动程序",没有看到我们的驱动

    【4440】再次 重新载入

    【4530】在 KernelDetective 中找到了 我们的驱动

  【4560】再次 卸载我们的驱动

    再用 KernelDetective 看一下,看不到 我们的驱动了

【4670】如果 此时载入 驱动

  【4690】没有卸载它,我们二次载入  【4700】换一个名字,再载入,再卸载的话,就会蓝屏(ZC: 这个 自己可以试试,测试一下看看是不是这样?)

2、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: