找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3540|回复: 3

【C++】驱动加载/卸载/通信代码(兼容WIN32/WIN64)

[复制链接]
发表于 2014-5-2 18:55:38 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
类代码:
  1. //Author: Anonymous
  2. //#include <Windows.h>

  3. class cDrvCtrl
  4. {
  5. public:
  6.     cDrvCtrl()
  7.     {
  8.         m_pSysPath = NULL;
  9.         m_pServiceName = NULL;
  10.         m_pDisplayName = NULL;
  11.         m_hSCManager = NULL;
  12.         m_hService = NULL;
  13.         m_hDriver = INVALID_HANDLE_VALUE;
  14.     }
  15.     ~cDrvCtrl()
  16.     {
  17.         CloseServiceHandle(m_hService);
  18.         CloseServiceHandle(m_hSCManager);
  19.         CloseHandle(m_hDriver);
  20.     }
  21. public:
  22.     DWORD m_dwLastError;
  23.     PCHAR m_pSysPath;
  24.     PCHAR m_pServiceName;
  25.     PCHAR m_pDisplayName;
  26. public:
  27.     BOOL Install(PCHAR pSysPath,PCHAR pServiceName,PCHAR pDisplayName);
  28.     BOOL Start();
  29.     BOOL Stop();
  30.     BOOL Remove();
  31.     BOOL Open(PCHAR pLinkName);
  32.     BOOL IoControl(DWORD dwIoCode, PVOID InBuff, DWORD InBuffLen, PVOID OutBuff, DWORD OutBuffLen);
  33. protected:
  34. private:
  35.     SC_HANDLE m_hSCManager;
  36.     SC_HANDLE m_hService;
  37.     HANDLE m_hDriver;
  38. };

  39. BOOL cDrvCtrl::Install(PCHAR pSysPath,PCHAR pServiceName,PCHAR pDisplayName)
  40. {
  41.     m_pSysPath = pSysPath;
  42.     m_pServiceName = pServiceName;
  43.     m_pDisplayName = pDisplayName;

  44.     m_hSCManager = OpenSCManagerA(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  45.     if (NULL == m_hSCManager)
  46.     {
  47.         m_dwLastError = GetLastError();
  48.         return FALSE;
  49.     }

  50.     m_hService = CreateServiceA(m_hSCManager,m_pServiceName,m_pDisplayName,
  51.                     SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,
  52.                     m_pSysPath,NULL,NULL,NULL,NULL,NULL);
  53.     if (NULL == m_hService)
  54.     {
  55.         m_dwLastError = GetLastError();
  56.         if (ERROR_SERVICE_EXISTS == m_dwLastError)
  57.         {
  58.             m_hService = OpenServiceA(m_hSCManager,m_pServiceName,SERVICE_ALL_ACCESS);
  59.             if (NULL == m_hService)
  60.             {
  61.                 CloseServiceHandle(m_hSCManager);
  62.                 return FALSE;
  63.             }
  64.         }
  65.         else
  66.         {
  67.             CloseServiceHandle(m_hSCManager);
  68.             return FALSE;
  69.         }
  70.     }
  71.     return TRUE;
  72. }

  73. BOOL cDrvCtrl::Start()
  74. {
  75.     if (!StartServiceA(m_hService,NULL,NULL))
  76.     {
  77.         m_dwLastError = GetLastError();
  78.         return FALSE;
  79.     }
  80.     return TRUE;
  81. }

  82. BOOL cDrvCtrl::Stop()
  83. {
  84.     SERVICE_STATUS ss;
  85.     if (!ControlService(m_hService,SERVICE_CONTROL_STOP,&ss))
  86.     {
  87.         m_dwLastError = GetLastError();
  88.         return FALSE;
  89.     }
  90.     return TRUE;

  91. }

  92. BOOL cDrvCtrl::Remove()
  93. {
  94.     if (!DeleteService(m_hService))
  95.     {
  96.         m_dwLastError = GetLastError();
  97.         return FALSE;
  98.     }
  99.     return TRUE;
  100. }

  101. BOOL cDrvCtrl::Open(PCHAR pLinkName)//example: \\\\.\\xxoo        
  102. {
  103.     if (m_hDriver != INVALID_HANDLE_VALUE)
  104.         return TRUE;
  105.     m_hDriver = CreateFileA(pLinkName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  106.     if(m_hDriver != INVALID_HANDLE_VALUE)
  107.         return TRUE;
  108.     else
  109.         return FALSE;
  110. }

  111. DWORD CTL_CODE_GEN(DWORD lngFunction)
  112. {
  113.     return (FILE_DEVICE_UNKNOWN * 65536) | (FILE_ANY_ACCESS * 16384) | (lngFunction * 4) | METHOD_BUFFERED;
  114. }

  115. BOOL cDrvCtrl::IoControl(DWORD dwIoCode, PVOID InBuff, DWORD InBuffLen, PVOID OutBuff, DWORD OutBuffLen)
  116. {
  117.     DWORD dw;
  118.     return DeviceIoControl(m_hDriver,CTL_CODE_GEN(dwIoCode),InBuff,InBuffLen,OutBuff,OutBuffLen,&dw,NULL);
  119. }
复制代码
范例代码:
  1. void test6()
  2. {
  3.     cDrvCtrl dc;
  4.     BOOL b;
  5.     DWORD dw=0x1234,dw0=0;
  6.     //load drv
  7.     b=dc.Install("D:\\temp\\MyDriver.sys","MyDriver","MyDriver");
  8.     printf("dc.Install=%d\n",b);
  9.     b=dc.Start();
  10.     printf("dc.Start=%d\n",b);
  11.     //call drv
  12.     b=dc.Open("\\\\.\\MyDriver");
  13.     printf("dc.Open=%d\n",b);
  14.     b=dc.IoControl(0x800,&dw,sizeof(dw),&dw0,sizeof(dw0));
  15.     printf("dc.IoControl=%d\n",b);
  16.     if(!b)
  17.     {
  18.         dw0=GetLastError();
  19.         printf("LastError=%ld\n",dw0);
  20.     }
  21.     else
  22.     {
  23.         printf("dw0=%ld\n",dw0);
  24.     }
  25.     //unload drv
  26.     b=dc.Stop();
  27.     printf("dc.Stop=%d\n",b);
  28.     b=dc.Remove();
  29.     printf("dc.Remove=%d\n",b);
  30. }
复制代码
回复

使用道具 举报

发表于 2019-7-30 18:50:59 | 显示全部楼层
关键在于使用sc来控制service,通过创建SERVICE_KERNEL_DRIVER来创建一个内核驱动方式的服务。

我突然在想,如果是单片机,想要动态加载驱动,该怎么设计单片机系统。

虽说,单片机没人把指令放RAM上,都是放ROM的。但可以设计一个功能让它从UART等接口动态读取bin然后自己烧自己的ROM。

虽说STM32F103的每个ROM页只能被烧10000次
回复 赞! 靠!

使用道具 举报

发表于 2022-5-13 16:41:37 | 显示全部楼层

感谢楼主分享~~~
回复 赞! 靠!

使用道具 举报

发表于 2022-5-13 16:45:49 | 显示全部楼层

楼主大能,感谢感谢
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-23 17:58 , Processed in 0.045404 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表