找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4142|回复: 1

WIN64教程里的驱动加载类,程序意外退出后就不好使了

[复制链接]

28

主题

116

回帖

0

精华

铜牌会员

积分
273
发表于 2016-8-4 16:56:28 | 显示全部楼层 |阅读模式
意外退出后,无法停止和卸载驱动。求解决方案。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2016-8-4 23:52:07 | 显示全部楼层
原来的驱动类确实有点坑,修改了一下,没测试过。
把驱动加载/卸载,和IO控制,给分离开了。
  1. class cDrvCtrl
  2. {
  3. public:
  4.         cDrvCtrl()
  5.         {
  6.                 m_pSysPath = NULL;
  7.                 m_pServiceName = NULL;
  8.                 m_pDisplayName = NULL;
  9.                 m_hSCManager = NULL;
  10.                 m_hService = NULL;
  11.         }
  12.         ~cDrvCtrl()
  13.         {
  14.                 CloseServiceHandle(m_hService);
  15.                 CloseServiceHandle(m_hSCManager);
  16.         }
  17. public:
  18.         DWORD m_dwLastError;
  19.         PCHAR m_pSysPath;
  20.         PCHAR m_pServiceName;
  21.         PCHAR m_pDisplayName;
  22. public:
  23.         BOOL Install(PCHAR pSysPath,PCHAR pServiceName,PCHAR pDisplayName);
  24.         BOOL Start();
  25.         BOOL Stop();
  26.         BOOL Remove();
  27.         BOOL GetSvcHandle(PCHAR pServiceName);
  28. protected:
  29. private:
  30.         SC_HANDLE m_hSCManager;
  31.         SC_HANDLE m_hService;
  32. };

  33. BOOL cDrvCtrl::GetSvcHandle(PCHAR pServiceName)
  34. {
  35.         m_pServiceName = pServiceName;
  36.         m_hSCManager = OpenSCManagerA(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  37.         if (NULL == m_hSCManager)
  38.         {
  39.                 m_dwLastError = GetLastError();
  40.                 return FALSE;
  41.         }
  42.         m_hService = OpenServiceA(m_hSCManager,m_pServiceName,SERVICE_ALL_ACCESS);
  43.         if (NULL == m_hService)
  44.         {
  45.                 m_dwLastError = GetLastError();
  46.                 CloseServiceHandle(m_hSCManager);
  47.                 return FALSE;
  48.         }
  49.         return TRUE;
  50. }

  51. BOOL cDrvCtrl::Install(PCHAR pSysPath,PCHAR pServiceName,PCHAR pDisplayName)
  52. {
  53.         m_pSysPath = pSysPath;
  54.         m_pServiceName = pServiceName;
  55.         m_pDisplayName = pDisplayName;
  56.         m_hSCManager = OpenSCManagerA(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  57.         if (NULL == m_hSCManager)
  58.         {
  59.                 m_dwLastError = GetLastError();
  60.                 return FALSE;
  61.         }
  62.         m_hService = CreateServiceA(m_hSCManager,
  63.                                                                 m_pServiceName,
  64.                                                                 m_pDisplayName,
  65.                                                                 SERVICE_ALL_ACCESS,
  66.                                                                 SERVICE_KERNEL_DRIVER,
  67.                                                                 SERVICE_DEMAND_START,
  68.                                                                 SERVICE_ERROR_NORMAL,
  69.                                                                 m_pSysPath,
  70.                                                                 NULL,
  71.                                                                 NULL,
  72.                                                                 NULL,
  73.                                                                 NULL,
  74.                                                                 NULL);
  75.         if (NULL == m_hService)
  76.         {
  77.                         m_dwLastError = GetLastError();
  78.                         CloseServiceHandle(m_hSCManager);
  79.                         return FALSE;
  80.         }
  81.         return TRUE;
  82. }

  83. BOOL cDrvCtrl::Start()
  84. {
  85.         if (!StartServiceA(m_hService,NULL,NULL))
  86.         {
  87.                 m_dwLastError = GetLastError();
  88.                 return FALSE;
  89.         }
  90.         return TRUE;
  91. }

  92. BOOL cDrvCtrl::Stop()
  93. {
  94.         SERVICE_STATUS ss;
  95.         if (!ControlService(m_hService,SERVICE_CONTROL_STOP,&ss))
  96.         {
  97.                 m_dwLastError = GetLastError();
  98.                 return FALSE;
  99.         }
  100.         return TRUE;

  101. }

  102. BOOL cDrvCtrl::Remove()
  103. {
  104.         if (!DeleteService(m_hService))
  105.         {
  106.                 m_dwLastError = GetLastError();
  107.                 return FALSE;
  108.         }
  109.         else
  110.         {
  111.                 CloseServiceHandle(m_hService);
  112.                 CloseServiceHandle(m_hSCManager);
  113.         }
  114.         return TRUE;
  115. }

  116. HANDLE OpenDriver(PCHAR pLinkName)//example: \\\\.\\xxoo
  117. {
  118.         return CreateFileA(pLinkName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  119. }

  120. BOOL DriverControl(HANDLE m_hDriver, DWORD dwIoCode, PVOID InBuff, DWORD InBuffLen, PVOID OutBuff, DWORD OutBuffLen, DWORD *RealRetBytes)
  121. {
  122.         DWORD dw;
  123.         dwIoCode = (FILE_DEVICE_UNKNOWN * 65536) | (FILE_ANY_ACCESS * 16384) | (dwIoCode * 4) | METHOD_BUFFERED;
  124.         BOOL b = DeviceIoControl(m_hDriver,dwIoCode,InBuff,InBuffLen,OutBuff,OutBuffLen,&dw,NULL);
  125.         if(RealRetBytes)
  126.                 *RealRetBytes=dw;
  127.         return b;
  128. }
复制代码
重点:程序运行时,先用OpenDriver打开驱动。如果返回值不是INVALID_HANDLE_VALUE,则用GetSvcHandle获取服务句柄。后面的操作(停止、卸载)就好使了。卸载驱动前,记得把『驱动句柄』(就是通过CreateFile获得的句柄)给关闭。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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