您好,欢迎访问一九零五行业门户网

驱动学习笔记2-用程序加载NT驱动程序

nt 驱动 程序 的加载: 1:为nt 驱动 创建新的服务. 2:开启此项服务 3:关闭此项服务 4:删除nt 驱动 创建的服务 (1)打开scm管理器 sc_handle winapi openscmanager( __in lpctstr lpmachinename,//计算机名称.null或者空表示本机 __in lpctstr lpdatabasename,/
nt驱动程序的加载:
1:为nt驱动创建新的服务.
2:开启此项服务
3:关闭此项服务
4:删除nt驱动创建的服务
(1)打开scm管理器
sc_handle winapi openscmanager(
  __in          lpctstr lpmachinename,//计算机名称.null或者空表示本机
  __in          lpctstr lpdatabasename,//scm数据库名称.null表示使用缺省数据库
  __in          dword dwdesiredaccess //使用权限.一般为sc_manager_all_access
);
成功返回scm管理器句柄.否则返回null
(2)创建服务
sc_handle winapi createservice(
  __in          sc_handle hscmanager,//openscmanager打开的句柄
  __in          lpctstr lpservicename,//服务名称.scm管理器中看到的服务名称
  __in          lpctstr lpdisplayname,
  __in          dword dwdesiredaccess,//打开权限.一般为service_all_access
  __in          dword dwservicetype, //服务类型(文件系统驱动/普通驱动程序/驱动自加载/)
  __in          dword dwstarttype,  //启动类型
  __in          dword dwerrorcontrol, //错误控制码
  __in          lpctstr lpbinarypathname,//服务程序或者驱动程序的路径
  __in          lpctstr lploadordergroup,//服务属于哪个用户组
  __out         lpdword lpdwtagid,
  __in          lpctstr lpdependencies, //所依赖的服务的名称
  __in          lpctstr lpservicestartname, //用户帐户名称
  __in          lpctstr lppassword   //用户口令
);
(3)打开服务
sc_handle winapi openservice(
  __in          sc_handle hscmanager,  //scm管理器句柄
  __in          lpctstr lpservicename,  //服务名称
  __in          dword dwdesiredaccess  //访问权限.一般为sc_manager_all_access
);
(4)控制服务
bool winapi controlservice(
  __in          sc_handle hservice,   //服务句柄
  __in          dword dwcontrol,   //控制码
  __out         lpservice_status lpservicestatus //指向一个service_status 结构体,来接收最后的服务信息
);
(5)关闭scm管理器
bool winapi closeservicehandle(
  __in          sc_handle hscobject
);
完整例程
#include #include #include #include #define driver_name helloddk#define driver_path ..//mydriver//mydriver_check//helloddk.sys//装载nt驱动程序bool loadntdriver(char* lpszdrivername,char* lpszdriverpath){ char szdriverimagepath[256]; //得到完整的驱动路径 getfullpathname(lpszdriverpath, 256, szdriverimagepath, null); bool bret = false; sc_handle hservicemgr=null;//scm管理器的句柄 sc_handle hserviceddk=null;//nt驱动程序的服务句柄 //打开服务控制管理器 hservicemgr = openscmanager( null, null, sc_manager_all_access ); if( hservicemgr == null ) { //openscmanager失败 printf( openscmanager() faild %d ! /n, getlasterror() ); bret = false; goto beforeleave; } else { ////openscmanager成功 printf( openscmanager() ok ! /n ); } //创建驱动所对应的服务 hserviceddk = createservice( hservicemgr, lpszdrivername, //驱动程序的在注册表中的名字 lpszdrivername, // 注册表驱动程序的 displayname 值 service_all_access, // 加载驱动程序的访问权限 service_kernel_driver,// 表示加载的服务是驱动程序 service_demand_start, // 注册表驱动程序的 start 值 service_error_ignore, // 注册表驱动程序的 errorcontrol 值 szdriverimagepath, // 注册表驱动程序的 imagepath 值 null, null, null, null, null); dword dwrtn; //判断服务是否失败 if( hserviceddk == null ) { dwrtn = getlasterror(); if( dwrtn != error_io_pending && dwrtn != error_service_exists ) { //由于其他原因创建服务失败 printf( crateservice() faild %d ! /n, dwrtn ); bret = false; goto beforeleave; } else { //服务创建失败,是由于服务已经创立过 printf( crateservice() faild service is error_io_pending or error_service_exists! /n ); } // 驱动程序已经加载,只需要打开 hserviceddk = openservice( hservicemgr, lpszdrivername, service_all_access ); if( hserviceddk == null ) { //如果打开服务也失败,则意味错误 dwrtn = getlasterror(); printf( openservice() faild %d ! /n, dwrtn ); bret = false; goto beforeleave; } else { printf( openservice() ok ! /n ); } } else { printf( crateservice() ok ! /n ); } //开启此项服务 bret= startservice( hserviceddk, null, null ); if( !bret ) { dword dwrtn = getlasterror(); if( dwrtn != error_io_pending && dwrtn != error_service_already_running ) { printf( startservice() faild %d ! /n, dwrtn ); bret = false; goto beforeleave; } else { if( dwrtn == error_io_pending ) { //设备被挂住 printf( startservice() faild error_io_pending ! /n); bret = false; goto beforeleave; } else { //服务已经开启 printf( startservice() faild error_service_already_running ! /n); bret = true; goto beforeleave; } } } bret = true;//离开前关闭句柄beforeleave: if(hserviceddk) { closeservicehandle(hserviceddk); } if(hservicemgr) { closeservicehandle(hservicemgr); } return bret;}//卸载驱动程序 bool unloadntdriver( char * szsvrname ) { bool bret = false; sc_handle hservicemgr=null;//scm管理器的句柄 sc_handle hserviceddk=null;//nt驱动程序的服务句柄 service_status svrsta; //打开scm管理器 hservicemgr = openscmanager( null, null, sc_manager_all_access ); if( hservicemgr == null ) { //带开scm管理器失败 printf( openscmanager() faild %d ! /n, getlasterror() ); bret = false; goto beforeleave; } else { //带开scm管理器失败成功 printf( openscmanager() ok ! /n ); } //打开驱动所对应的服务 hserviceddk = openservice( hservicemgr, szsvrname, service_all_access ); if( hserviceddk == null ) { //打开驱动所对应的服务失败 printf( openservice() faild %d ! /n, getlasterror() ); bret = false; goto beforeleave; } else { printf( openservice() ok ! /n ); } //停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。 if( !controlservice( hserviceddk, service_control_stop , &svrsta ) ) { printf( controlservice() faild %d !/n, getlasterror() ); } else { //打开驱动所对应的失败 printf( controlservice() ok !/n ); } //动态卸载驱动程序。 if( !deleteservice( hserviceddk ) ) { //卸载失败 printf( deletesrevice() faild %d !/n, getlasterror() ); } else { //卸载成功 printf( delserver:eletesrevice() ok !/n ); } bret = true;beforeleave://离开前关闭打开的句柄 if(hserviceddk) { closeservicehandle(hserviceddk); } if(hservicemgr) { closeservicehandle(hservicemgr); } return bret; } void testdriver(){ //测试驱动程序 handle hdevice = createfile(////.//helloddk, generic_write | generic_read, 0, null, open_existing, 0, null); if( hdevice != invalid_handle_value ) { printf( create device ok ! /n ); } else { printf( create device faild %d ! /n, getlasterror() ); } closehandle( hdevice );} int main(int argc, char* argv[]) { //加载驱动 bool bret = loadntdriver(driver_name,driver_path); if (!bret) { printf(loadntdriver error/n); return 0; } //加载成功 printf( press any to create device!/n ); getch(); testdriver(); //这时候你可以通过注册表,或其他查看符号连接的软件验证。 printf( press any to unload the driver!/n ); getch(); //卸载驱动 unloadntdriver(driver_name); if (!bret) { printf(unloadntdriver error/n); return 0; } return 0; }
其它类似信息

推荐信息