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、