全球作弊论坛  
  
查看: 422|回复: 0

驱动控制类

[复制链接]

2

主题

0

回帖

15

积分

凡人

Rank: 1

积分
15
发表于 2024-5-10 14:15:19 | 显示全部楼层 |阅读模式
本帖最后由 river 于 2024-5-10 14:17 编辑

Driver.h
  1. #pragma once
  2. #include "Alastor.h"

  3. namespace Alastor
  4. {
  5.         class ALASTOR_API Driver {
  6.         public:

  7.                 Driver();
  8.                 ~Driver();


  9.                 bool load(
  10.                         std::string path,
  11.                         std::string deviceName = "",
  12.                         std::string symbolName = "",
  13.                         unsigned long startOptions = SERVICE_DEMAND_START
  14.                 );

  15.                 bool unload();

  16.                 int getControlCode(int function, int deviceType = FILE_DEVICE_UNKNOWN, int method = METHOD_BUFFERED, int access = FILE_ANY_ACCESS);

  17.                 bool control(int code, void* input, int inputLength, void* output, int outputLength);

  18.                 std::string lasterror();


  19.         private:
  20.                 std::string m_path;
  21.                 std::string m_deviceName;
  22.                 std::string m_symbolName;
  23.                 std::string m_serviceName;
  24.                 HANDLE m_deviceHandle;
  25.                 int m_error;
  26.         };
  27. }
复制代码


Driver.cpp
  1. #include "Driver.h"
  2. #include <Windows.h>

  3. /*
  4.         Author:River
  5. */
  6. namespace Alastor
  7. {
  8.         Driver::Driver()
  9.         {
  10.                 m_deviceHandle = NULL;
  11.                 m_error = 0;
  12.         }

  13.         Driver::~Driver()
  14.         {
  15.         }



  16.         bool Driver::load(
  17.                 std::string path,
  18.                 std::string deviceName,
  19.                 std::string symbolName,
  20.                 unsigned long startOptions
  21.         )
  22.         {
  23.                 SC_HANDLE hSCManager = OpenSCManagerA(NULL, NULL, startOptions);
  24.                 if (!hSCManager)
  25.                 {
  26.                         m_error = GetLastError();
  27.                         return false;
  28.                 }
  29.                 SC_HANDLE hService = CreateServiceA(hSCManager, m_serviceName.c_str(), m_serviceName.c_str(), SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, startOptions, SERVICE_ERROR_IGNORE, m_path.c_str(), 0, 0, 0, 0, 0);
  30.                 if (hService == NULL)
  31.                 {
  32.                         if (ERROR_SERVICE_EXISTS == GetLastError())
  33.                         {
  34.                                 hService = OpenServiceA(hSCManager, m_serviceName.c_str(), SERVICE_ALL_ACCESS);
  35.                                 if (hService == NULL)
  36.                                 {
  37.                                         CloseServiceHandle(hSCManager);
  38.                                         m_error = GetLastError();
  39.                                         return false;
  40.                                 }
  41.                         }
  42.                         else
  43.                         {
  44.                                 if (ERROR_SERVICE_MARKED_FOR_DELETE == GetLastError() || ERROR_DUPLICATE_SERVICE_NAME == GetLastError())
  45.                                 {
  46.                                         hService = OpenServiceA(hSCManager, m_serviceName.c_str(), SERVICE_ALL_ACCESS);
  47.                                         if (hService == NULL)
  48.                                         {
  49.                                                 CloseServiceHandle(hSCManager);
  50.                                                 m_error = GetLastError();
  51.                                                 return false;
  52.                                         }
  53.                                         SERVICE_STATUS status;
  54.                                         ControlService(hService, SERVICE_CONTROL_STOP,&status);
  55.                                         DeleteService(hService);
  56.                                         CloseServiceHandle(hService);
  57.                                         CloseServiceHandle(hSCManager);
  58.                                         hSCManager = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  59.                                         if (hSCManager == NULL)
  60.                                         {
  61.                                                 m_error = GetLastError();
  62.                                                 return false;
  63.                                         }

  64.                                         hService = CreateServiceA(hSCManager, m_serviceName.c_str(), m_serviceName.c_str(), SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, startOptions, SERVICE_ERROR_IGNORE, m_path.c_str(), 0, 0, 0, 0, 0);
  65.                                         if (hService == NULL)
  66.                                         {
  67.                                                 CloseServiceHandle(hSCManager);
  68.                                                 m_error = GetLastError();
  69.                                                 return false;
  70.                                         }
  71.                                 }
  72.                                 else
  73.                                 {
  74.                                         m_path = "";
  75.                                         m_deviceHandle = NULL;
  76.                                         CloseServiceHandle(hSCManager);
  77.                                         m_error = GetLastError();
  78.                                         return false;
  79.                                 }
  80.                         }
  81.                 }
  82.                
  83.                 if (StartServiceA(hService, NULL, NULL) == 0)
  84.                 {
  85.                         if (ERROR_SERVICE_ALREADY_RUNNING != GetLastError())
  86.                         {
  87.                                 CloseServiceHandle(hService);
  88.                                 CloseServiceHandle(hSCManager);
  89.                                 m_path = "";
  90.                                 m_error = GetLastError();
  91.                                 return false;
  92.                         }
  93.                 }
  94.                
  95.                 m_deviceHandle = CreateFileA(("\\\\.\" + m_symbolName).c_str(),GENERIC_READ|GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
  96.                 if (m_deviceHandle == NULL)
  97.                 {
  98.                         SERVICE_STATUS status;
  99.                         ControlService(hService, SERVICE_CONTROL_STOP, &status);
  100.                         DeleteService(hService);
  101.                         CloseServiceHandle(hService);
  102.                         CloseServiceHandle(hSCManager);

  103.                         m_path = "";
  104.                         m_error = GetLastError();
  105.                         return false;
  106.                 }

  107.                 CloseServiceHandle(hService);
  108.                 CloseServiceHandle(hSCManager);
  109.                 return true;
  110.         }

  111.         bool Driver::unload()
  112.         {
  113.                 if (m_deviceHandle)
  114.                 {
  115.                         CloseHandle(m_deviceHandle);
  116.                 }

  117.                 SC_HANDLE hSCManager = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  118.                 if (hSCManager == NULL)
  119.                 {
  120.                         m_path = "";
  121.                         m_deviceHandle = NULL;
  122.                         m_error = GetLastError();
  123.                         return false;
  124.                 }
  125.                 SC_HANDLE hService = OpenServiceA(hSCManager, m_serviceName.c_str(), SERVICE_ALL_ACCESS);
  126.                 if (hService == NULL)
  127.                 {
  128.                         CloseServiceHandle(hSCManager);
  129.                         m_path = "";
  130.                         m_deviceHandle = NULL;
  131.                         m_error = GetLastError();
  132.                         return false;
  133.                 }
  134.                 SERVICE_STATUS status;
  135.                 if (ControlService(hService, SERVICE_CONTROL_STOP, &status) == FALSE)
  136.                 {
  137.                         CloseServiceHandle(hService);
  138.                         CloseServiceHandle(hSCManager);
  139.                         m_path = "";
  140.                         m_deviceHandle = NULL;
  141.                         m_error = GetLastError();
  142.                         return false;
  143.                 }
  144.                 if (DeleteService(hService) == FALSE)
  145.                 {
  146.                         CloseServiceHandle(hService);
  147.                         CloseServiceHandle(hSCManager);
  148.                         m_path = "";
  149.                         m_deviceHandle = NULL;
  150.                         m_error = GetLastError();
  151.                         return false;
  152.                 }
  153.                 CloseServiceHandle(hService);
  154.                 CloseServiceHandle(hSCManager);
  155.                 m_path = "";
  156.                 m_deviceHandle = NULL;
  157.                 return false;
  158.         }

  159.         int Driver::getControlCode(int function, int deviceType, int method, int access)
  160.         {
  161.                 return (deviceType << 2) + (access << 14) + (function << 2) + method;
  162.         }

  163.         bool Driver::control(int code, void* input, int inputLength, void* output, int outputLength)
  164.         {
  165.                 OVERLAPPED overlapped;
  166.                 return DeviceIoControl(m_deviceHandle, code, input, inputLength, output, outputLength, NULL, &overlapped)==1;
  167.         }

  168.         std::string Driver::lasterror()
  169.         {
  170.                 return std::string();
  171.         }
  172. }
复制代码
回复

使用道具 举报

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

本版积分规则

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