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

QQ登录

只需一步,快速开始

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

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

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

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

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

×
  1. //整理者:Tesla.Angela(原代码来源于网络,原作者不明)
  2. /*
  3. 使用方法:修改DRV_NAME和DRV_FILENAME
  4. HANDLE openDriver(void):打开驱动建立的符号链接的句柄
  5. void uninstallDriver(void):卸载驱动(只有把openDriver打开的句柄关闭才可以成功卸载)
  6. */
  7. /*
  8. 使用示例:
  9. VOID TEST()
  10. {
  11.     HANDLE hMyDrv;
  12.     hMyDrv=openDriver();
  13.     IoControl(hMyDrv, CTL_CODE_GEN(0x802), &fn_index, 4, &ssdt_func_addr, 8);
  14.     uninstallDriver();
  15.     CloseHandle(hMyDrv);
  16. }
  17. */

  18. #pragma comment(lib,"user32.lib")
  19. #pragma comment(lib,"Advapi32.lib")

  20. #define DRV_NAME                "xxxxxxxx"//驱动链接名
  21. #define DRV_FILENAME        "xxxxxxxx.sys"//驱动文件
  22. #define STATUS_SUCCESS     ((NTSTATUS)0x00000000L)
  23. typedef LONG NTSTATUS;

  24. typedef struct _STRING
  25. {
  26.     USHORT  Length;
  27.     USHORT  MaximumLength;
  28.     PCHAR  Buffer;
  29. } ANSI_STRING, *PANSI_STRING;

  30. typedef struct _UNICODE_STRING
  31. {
  32.     USHORT  Length;
  33.     USHORT  MaximumLength;
  34.     PWSTR  Buffer;
  35. } UNICODE_STRING, *PUNICODE_STRING;

  36. VOID AfxMessageBox(char *sz)
  37. {
  38.     //下面这句可以随时注释掉
  39.     //MessageBoxA(0,sz,DRV_NAME,0);
  40. }

  41. //*********************************************************************************************
  42. // Assign loaddriver priviledge to our process, so we can load our support driver.
  43. //*********************************************************************************************
  44. BOOL getLoadDriverPriv()
  45. {
  46.     HANDLE hToken;
  47.     if(OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
  48.     {
  49.         LUID huid;
  50.         if(LookupPrivilegeValueA(NULL, "SeLoadDriverPrivilege", &huid))
  51.         {
  52.             LUID_AND_ATTRIBUTES priv;
  53.             priv.Attributes = SE_PRIVILEGE_ENABLED;
  54.             priv.Luid = huid;
  55.             TOKEN_PRIVILEGES tp;
  56.             tp.PrivilegeCount = 1;
  57.             tp.Privileges[0] = priv;
  58.             if(AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL))
  59.             {
  60.                 return TRUE;
  61.             }
  62.         }
  63.     }
  64.     return FALSE;
  65. }

  66. //*********************************************************************************************
  67. // Sets up the necessary registry settings to load the support driver
  68. //*********************************************************************************************
  69. BOOL setupRegistry()
  70. {
  71.     HKEY hkey;
  72.     if(RegCreateKeyA(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\"DRV_NAME, &hkey) != ERROR_SUCCESS)
  73.         return FALSE;
  74.     DWORD val;
  75.     val = 1;
  76.     if(RegSetValueExA(hkey, "Type", 0, REG_DWORD, (PBYTE)&val, sizeof(val)) != ERROR_SUCCESS)
  77.         return FALSE;
  78.     if(RegSetValueExA(hkey, "ErrorControl", 0, REG_DWORD, (PBYTE)&val, sizeof(val)) != ERROR_SUCCESS)
  79.         return FALSE;
  80.     val = 3;
  81.     if(RegSetValueExA(hkey, "Start", 0, REG_DWORD, (PBYTE)&val, sizeof(val)) != ERROR_SUCCESS)        //0为boot驱动
  82.         return FALSE;
  83.     char *imgName = "System32\\DRIVERS\"DRV_FILENAME;
  84.     if(RegSetValueExA(hkey, "ImagePath", 0, REG_EXPAND_SZ, (PBYTE)imgName, strlen(imgName)) != ERROR_SUCCESS)
  85.         return FALSE;
  86.     return TRUE;
  87. }

  88. //*********************************************************************************************
  89. // Actual code to load our driver into memory
  90. //*********************************************************************************************
  91. BOOL loadDriver()
  92. {
  93.     HMODULE hntdll = GetModuleHandleA("ntdll.dll");
  94.     NTSTATUS (WINAPI *_RtlAnsiStringToUnicodeString)(PUNICODE_STRING  DestinationString,IN PANSI_STRING  SourceString,IN BOOLEAN);
  95.     VOID (WINAPI *_RtlInitAnsiString)(IN OUT PANSI_STRING  DestinationString, IN PCHAR  SourceString);
  96.     NTSTATUS (WINAPI * _ZwLoadDriver)(IN PUNICODE_STRING DriverServiceName);
  97.     NTSTATUS (WINAPI * _ZwUnloadDriver)(IN PUNICODE_STRING DriverServiceName);
  98.     VOID (WINAPI * _RtlFreeUnicodeString)(IN PUNICODE_STRING  UnicodeString);
  99.     *(FARPROC *)&_ZwLoadDriver = GetProcAddress(hntdll, "NtLoadDriver");
  100.     *(FARPROC *)&_ZwUnloadDriver = GetProcAddress(hntdll, "NtUnloadDriver");
  101.     *(FARPROC *)&_RtlAnsiStringToUnicodeString = GetProcAddress(hntdll, "RtlAnsiStringToUnicodeString");
  102.     *(FARPROC *)&_RtlInitAnsiString = GetProcAddress(hntdll, "RtlInitAnsiString");
  103.     *(FARPROC *)&_RtlFreeUnicodeString = GetProcAddress(hntdll, "RtlFreeUnicodeString");
  104.     if(_ZwLoadDriver && _ZwUnloadDriver && _RtlAnsiStringToUnicodeString && _RtlInitAnsiString && _RtlFreeUnicodeString)
  105.     {
  106.         ANSI_STRING aStr;
  107.         _RtlInitAnsiString(&aStr, "\\Registry\\Machine\\System\\CurrentControlSet\\Services\"DRV_NAME);
  108.         UNICODE_STRING uStr;
  109.         if(_RtlAnsiStringToUnicodeString(&uStr, &aStr, TRUE) != STATUS_SUCCESS)
  110.             return FALSE;
  111.         else
  112.         {
  113.             if(_ZwLoadDriver(&uStr) == STATUS_SUCCESS)
  114.             {
  115.                 _RtlFreeUnicodeString(&uStr);
  116.                 return TRUE;
  117.             }
  118.             _RtlFreeUnicodeString(&uStr);
  119.         }
  120.     }
  121.     return FALSE;
  122. }

  123. //*********************************************************************************************
  124. // Actual code to remove our driver from memory
  125. //*********************************************************************************************
  126. BOOL unloadDriver()
  127. {
  128.     HMODULE hntdll = GetModuleHandleA("ntdll.dll");
  129.     NTSTATUS (WINAPI * _RtlAnsiStringToUnicodeString)(PUNICODE_STRING  DestinationString, IN PANSI_STRING  SourceString, IN BOOLEAN);
  130.     VOID (WINAPI *_RtlInitAnsiString)(IN OUT PANSI_STRING  DestinationString,IN PCHAR  SourceString);
  131.     NTSTATUS (WINAPI * _ZwLoadDriver)(IN PUNICODE_STRING DriverServiceName);
  132.     NTSTATUS (WINAPI * _ZwUnloadDriver)(IN PUNICODE_STRING DriverServiceName);
  133.     VOID (WINAPI * _RtlFreeUnicodeString)(IN PUNICODE_STRING  UnicodeString);
  134.     *(FARPROC *)&_ZwLoadDriver = GetProcAddress(hntdll, "NtLoadDriver");
  135.     *(FARPROC *)&_ZwUnloadDriver = GetProcAddress(hntdll, "NtUnloadDriver");
  136.     *(FARPROC *)&_RtlAnsiStringToUnicodeString = GetProcAddress(hntdll, "RtlAnsiStringToUnicodeString");
  137.     *(FARPROC *)&_RtlInitAnsiString = GetProcAddress(hntdll, "RtlInitAnsiString");
  138.     *(FARPROC *)&_RtlFreeUnicodeString = GetProcAddress(hntdll, "RtlFreeUnicodeString");
  139.     if(_ZwLoadDriver && _ZwUnloadDriver && _RtlAnsiStringToUnicodeString && _RtlInitAnsiString && _RtlFreeUnicodeString)
  140.     {
  141.         ANSI_STRING aStr;
  142.         _RtlInitAnsiString(&aStr, "\\Registry\\Machine\\System\\CurrentControlSet\\Services\"DRV_NAME);
  143.         UNICODE_STRING uStr;
  144.         if(_RtlAnsiStringToUnicodeString(&uStr, &aStr, TRUE) != STATUS_SUCCESS)
  145.             return FALSE;
  146.         else
  147.         {
  148.             if(_ZwUnloadDriver(&uStr) == STATUS_SUCCESS)
  149.             {
  150.                 _RtlFreeUnicodeString(&uStr);
  151.                 return TRUE;
  152.             }
  153.             _RtlFreeUnicodeString(&uStr);
  154.         }
  155.     }
  156.     return FALSE;
  157. }

  158. //*********************************************************************************************
  159. // Removes our driver file and registry settings
  160. //*********************************************************************************************
  161. void cleanupDriver(void)
  162. {
  163.     char sysDir[MAX_PATH + 1];
  164.     GetSystemDirectoryA(sysDir, MAX_PATH);
  165.     strncat(sysDir, "\\drivers\"DRV_FILENAME, MAX_PATH);
  166.     DeleteFileA(sysDir);
  167.     RegDeleteKeyA(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\"DRV_NAME"\\Enum");
  168.     RegDeleteKeyA(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\"DRV_NAME);
  169. }

  170. //*********************************************************************************************
  171. // Attempts to get a handle to our kernel driver.  If fails, try to install the driver.
  172. //*********************************************************************************************
  173. HANDLE openDriver(void)
  174. {
  175.     HANDLE hDevice=NULL;
  176.     //CreateFile打开驱动建立的符号链接,得根据驱动中建立的名字更改
  177.     hDevice = CreateFileA("\\\\.\"DRV_NAME, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  178.     if(hDevice == INVALID_HANDLE_VALUE)
  179.     {
  180.         char drvFullPath[MAX_PATH+1];
  181.         char *filePart;
  182.         ZeroMemory(drvFullPath, MAX_PATH);
  183.         GetFullPathNameA(DRV_FILENAME, MAX_PATH, drvFullPath, &filePart);//MessageBoxA(0,drvFullPath,0,0);
  184.         HANDLE hFile = CreateFileA(drvFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  185.         if(hFile == INVALID_HANDLE_VALUE)
  186.         {
  187.             AfxMessageBox("Cannot find required driver file");
  188.             return INVALID_HANDLE_VALUE;
  189.         }
  190.         else
  191.         {
  192.             CloseHandle(hFile);
  193.             char sysDir[MAX_PATH + 1];
  194.             GetSystemDirectoryA(sysDir, MAX_PATH);
  195.             strncat(sysDir, "\\drivers\"DRV_FILENAME, MAX_PATH);
  196.             CopyFileA(drvFullPath, sysDir, TRUE);
  197.             if(!getLoadDriverPriv())
  198.             {
  199.                 AfxMessageBox("Error getting load driver privilege! ");
  200.             }
  201.             else
  202.             {
  203.                 if(!setupRegistry())
  204.                 {
  205.                     AfxMessageBox("Error setting driver registry keys! Make sure you are running this as Administrator. ");
  206.                 }
  207.                 else
  208.                 {
  209.                     loadDriver();
  210.                     hDevice = CreateFileA("\\\\.\"DRV_NAME, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
  211.                                           NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  212.                     if(hDevice == INVALID_HANDLE_VALUE)
  213.                     {
  214.                         AfxMessageBox("Error loading kernel support driver! Make sure you are running this as Administrator. ");
  215.                     }
  216.                     else
  217.                     {
  218.                         AfxMessageBox("loading kernel support driver success");
  219.                     }
  220.                 }
  221.             }
  222.             cleanupDriver();
  223.         }
  224.     }
  225.     return hDevice;
  226. }

  227. //*********************************************************************************************
  228. // Remove our kernel driver from memory
  229. //*********************************************************************************************
  230. void uninstallDriver(void)
  231. {
  232.     char drvFullPath[MAX_PATH+1];
  233.     char *filePart;
  234.     ZeroMemory(drvFullPath, MAX_PATH);
  235.     GetFullPathNameA(DRV_FILENAME, MAX_PATH, drvFullPath, &filePart);
  236.     HANDLE hFile = CreateFileA(drvFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  237.     if(hFile == INVALID_HANDLE_VALUE)
  238.     {
  239.         AfxMessageBox("Cannot find required driver file ");
  240.         return;
  241.     }
  242.     else
  243.     {
  244.         CloseHandle(hFile);
  245.         char sysDir[MAX_PATH + 1];
  246.         GetSystemDirectoryA(sysDir, MAX_PATH);
  247.         strncat(sysDir, "\\drivers\"DRV_FILENAME, MAX_PATH);
  248.         CopyFileA(drvFullPath, sysDir, TRUE);
  249.         if(!getLoadDriverPriv())
  250.         {
  251.             AfxMessageBox("Error getting load driver privilege! ");
  252.         }
  253.         else
  254.         {
  255.             if(!setupRegistry())
  256.             {
  257.                 AfxMessageBox("Error setting driver registry keys! Make sure you are running this as Administrator. ");
  258.             }
  259.             else
  260.             {
  261.                 if(unloadDriver())
  262.                     AfxMessageBox("Support driver successfully unloaded. ");
  263.                 else
  264.                     AfxMessageBox("Unload support driver failed.  It is probably not loaded. ");
  265.             }
  266.         }
  267.         cleanupDriver();
  268.     }
  269. }

  270. DWORD CTL_CODE_GEN(DWORD lngFunction)
  271. {
  272.     return (FILE_DEVICE_UNKNOWN * 65536) | (FILE_ANY_ACCESS * 16384) | (lngFunction * 4) | METHOD_BUFFERED;
  273. }

  274. BOOL IoControl(HANDLE hDrvHandle, DWORD dwIoControlCode, PVOID lpInBuffer, DWORD nInBufferSize, PVOID lpOutBuffer, DWORD nOutBufferSize)
  275. {
  276.     DWORD lDrvRetSize;
  277.     return DeviceIoControl(hDrvHandle, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, &lDrvRetSize, 0);
  278. }
复制代码

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2014-8-6 10:29:57 | 显示全部楼层
你是TA?
回复

使用道具 举报

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

如此好贴,必须支持~~~
回复 赞! 靠!

使用道具 举报

本版积分规则

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

GMT+8, 2024-11-23 17:43 , Processed in 0.037806 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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