龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 2466|回复: 0

[C++源码] C++加载驱动文件源码

[复制链接]

14

主题

0

回帖

18

积分

编程入门

Rank: 1

龙马币
38
三月的天气 | 显示全部楼层 |阅读模式

c++加载驱动文件,自己经常用的。
  1. #include <windows.h>
  2. #include <winsvc.h>
  3. #include <conio.h>
  4. #include <stdio.h>

  5. #define DRIVER_NAME "HelloDDK"
  6. #define DRIVER_PATH "..\\MyDriver\\MyDriver_Check\\HelloDDK.sys"

  7. //装载NT驱动程序
  8. BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath)
  9. {
  10.     char szDriverImagePath[256];
  11.     //得到完整的驱动路径
  12.     GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);

  13.     BOOL bRet = FALSE;

  14.     SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
  15.     SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄

  16.     //打开服务控制管理器
  17.     hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

  18.     if( hServiceMgr == NULL )
  19.     {
  20.         //OpenSCManager失败
  21.         printf( "OpenSCManager() Faild %d ! \n", GetLastError() );
  22.         bRet = FALSE;
  23.         goto BeforeLeave;
  24.     }
  25.     else
  26.     {
  27.         ////OpenSCManager成功
  28.         printf( "OpenSCManager() ok ! \n" );
  29.     }

  30.     //创建驱动所对应的服务
  31.     hServiceDDK = CreateService( hServiceMgr,
  32.         lpszDriverName, //驱动程序的在注册表中的名字
  33.         lpszDriverName, // 注册表驱动程序的 DisplayName 值
  34.         SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限
  35.         SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序
  36.         SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值
  37.         SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值
  38.         szDriverImagePath, // 注册表驱动程序的 ImagePath 值
  39.         NULL,
  40.         NULL,
  41.         NULL,
  42.         NULL,
  43.         NULL);

  44.     DWORD dwRtn;
  45.     //判断服务是否失败
  46.     if( hServiceDDK == NULL )
  47.     {
  48.         dwRtn = GetLastError();
  49.         if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )
  50.         {
  51.             //由于其他原因创建服务失败
  52.             printf( "CrateService() Faild %d ! \n", dwRtn );
  53.             bRet = FALSE;
  54.             goto BeforeLeave;
  55.         }
  56.         else
  57.         {
  58.             //服务创建失败,是由于服务已经创立过
  59.             printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" );
  60.         }

  61.         // 驱动程序已经加载,只需要打开
  62.         hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );
  63.         if( hServiceDDK == NULL )
  64.         {
  65.             //如果打开服务也失败,则意味错误
  66.             dwRtn = GetLastError();
  67.             printf( "OpenService() Faild %d ! \n", dwRtn );
  68.             bRet = FALSE;
  69.             goto BeforeLeave;
  70.         }
  71.         else
  72.         {
  73.             printf( "OpenService() ok ! \n" );
  74.         }
  75.     }
  76.     else
  77.     {
  78.         printf( "CrateService() ok ! \n" );
  79.     }

  80.     //开启此项服务
  81.     bRet= StartService( hServiceDDK, NULL, NULL );
  82.     if( !bRet )
  83.     {
  84.         DWORD dwRtn = GetLastError();
  85.         if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )
  86.         {
  87.             printf( "StartService() Faild %d ! \n", dwRtn );
  88.             bRet = FALSE;
  89.             goto BeforeLeave;
  90.         }
  91.         else
  92.         {
  93.             if( dwRtn == ERROR_IO_PENDING )
  94.             {
  95.                 //设备被挂住
  96.                 printf( "StartService() Faild ERROR_IO_PENDING ! \n");
  97.                 bRet = FALSE;
  98.                 goto BeforeLeave;
  99.             }
  100.             else
  101.             {
  102.                 //服务已经开启
  103.                 printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n");
  104.                 bRet = TRUE;
  105.                 goto BeforeLeave;
  106.             }
  107.         }
  108.     }
  109.     bRet = TRUE;
  110. //离开前关闭句柄
  111. BeforeLeave:
  112.     if(hServiceDDK)
  113.     {
  114.         CloseServiceHandle(hServiceDDK);
  115.     }
  116.     if(hServiceMgr)
  117.     {
  118.         CloseServiceHandle(hServiceMgr);
  119.     }
  120.     return bRet;
  121. }

  122. //卸载驱动程序
  123. BOOL UnloadNTDriver( char * szSvrName )
  124. {
  125.     BOOL bRet = FALSE;
  126.     SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
  127.     SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄
  128.     SERVICE_STATUS SvrSta;
  129.     //打开SCM管理器
  130.     hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
  131.     if( hServiceMgr == NULL )
  132.     {
  133.         //带开SCM管理器失败
  134.         printf( "OpenSCManager() Faild %d ! \n", GetLastError() );
  135.         bRet = FALSE;
  136.         goto BeforeLeave;
  137.     }
  138.     else
  139.     {
  140.         //带开SCM管理器失败成功
  141.         printf( "OpenSCManager() ok ! \n" );
  142.     }
  143.     //打开驱动所对应的服务
  144.     hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS );

  145.     if( hServiceDDK == NULL )
  146.     {
  147.         //打开驱动所对应的服务失败
  148.         printf( "OpenService() Faild %d ! \n", GetLastError() );
  149.         bRet = FALSE;
  150.         goto BeforeLeave;
  151.     }
  152.     else
  153.     {
  154.         printf( "OpenService() ok ! \n" );
  155.     }
  156.     //停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。
  157.     if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) )
  158.     {
  159.         printf( "ControlService() Faild %d !\n", GetLastError() );
  160.     }
  161.     else
  162.     {
  163.         //打开驱动所对应的失败
  164.         printf( "ControlService() ok !\n" );
  165.     }
  166.     //动态卸载驱动程序。
  167.     if( !DeleteService( hServiceDDK ) )
  168.     {
  169.         //卸载失败
  170.         printf( "DeleteSrevice() Faild %d !\n", GetLastError() );
  171.     }
  172.     else
  173.     {
  174.         //卸载成功
  175.         printf( "DelServer:eleteSrevice() ok !\n" );
  176.     }
  177.     bRet = TRUE;
  178. BeforeLeave:
  179. //离开前关闭打开的句柄
  180.     if(hServiceDDK)
  181.     {
  182.         CloseServiceHandle(hServiceDDK);
  183.     }
  184.     if(hServiceMgr)
  185.     {
  186.         CloseServiceHandle(hServiceMgr);
  187.     }
  188.     return bRet;   
  189. }

  190. void TestDriver()
  191. {
  192.     //测试驱动程序
  193.     HANDLE hDevice = CreateFile("\\\\.\\HelloDDK",
  194.         GENERIC_WRITE | GENERIC_READ,
  195.         0,
  196.         NULL,
  197.         OPEN_EXISTING,
  198.         0,
  199.         NULL);
  200.     if( hDevice != INVALID_HANDLE_VALUE )
  201.     {
  202.         printf( "Create Device ok ! \n" );
  203.     }
  204.     else
  205.     {
  206.         printf( "Create Device faild %d ! \n", GetLastError() );
  207.     }
  208.     CloseHandle( hDevice );
  209. }

  210. int main(int argc, char* argv[])
  211. {
  212.     //加载驱动
  213.     BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH);
  214.     if (!bRet)
  215.     {
  216.         printf("LoadNTDriver error\n");
  217.         return 0;
  218.     }
  219.     //加载成功

  220.     printf( "press any to create device!\n" );
  221.     getch();

  222.     TestDriver();

  223.     //这时候你可以通过注册表,或其他查看符号连接的软件验证。
  224.     printf( "press any to unload the driver!\n" );
  225.     getch();

  226.     //卸载驱动
  227.     UnloadNTDriver(DRIVER_NAME);
  228.     if (!bRet)
  229.     {
  230.         printf("UnloadNTDriver error\n");
  231.         return 0;
  232.     }
  233.     return 0;
  234. }
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表