找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 3154|回复: 1

[开源]VB.NET实现加载驱动,通用32/64的Windows平台

[复制链接]

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
发表于 2017-3-22 22:37:22 | 显示全部楼层 |阅读模式
不知为何,这份代码有个很奇怪的BUG,就是不能加载路径太长的驱动,比如桌面上的驱动。。。(梧桐牛说可能是MAX_PATH的问题)
首先创建cls_Driver的类文件,代码如下:
  1. Private Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Integer) As IntPtr
  2.     Private Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As IntPtr, ByVal lpServiceName As String, ByVal dwDesiredAccess As Integer) As IntPtr
  3.     Private Declare Function StartService Lib "advapi32.dll" Alias "StartServiceA" (ByVal hService As IntPtr, ByVal dwNumServiceArgs As Integer, ByVal lpServiceArgVectors As IntPtr) As Integer
  4.     Private Declare Function CreateService Lib "advapi32.dll" Alias "CreateServiceA" (ByVal hSCManager As IntPtr, ByVal lpServiceName As String, ByVal lpDisplayName As String, ByVal dwDesiredAccess As Integer, ByVal dwServiceType As Integer, ByVal dwStartType As Integer, ByVal dwErrorControl As Integer, ByVal lpBinaryPathName As String, ByVal lpLoadOrderGroup As UIntPtr, ByVal lpdwTagId As Integer, ByVal lpDependencies As UIntPtr, ByVal lp As UIntPtr, ByVal lpPassword As UIntPtr) As IntPtr
  5.     Private Declare Function ControlService Lib "advapi32.dll" (ByVal hService As IntPtr, ByVal dwControl As Integer, ByRef lpServiceStatus As SERVICE_STATUS) As Integer
  6.     Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As IntPtr, ByVal dwIoControlCode As Integer, ByVal lpInBuffer As UIntPtr, ByVal nInBufferSize As UInteger, ByVal lpOutBuffer As UIntPtr, ByVal nOutBufferSize As UInteger, ByVal lpBytesReturned As UIntPtr, ByRef lpOverlapped As OVERLAPPED) As Integer
  7.     Private Declare Function DeleteService Lib "advapi32.dll" (ByVal hService As IntPtr) As Integer
  8.     Private Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As IntPtr) As Integer
  9.     Private Declare Function QueryServiceStatus Lib "advapi32.dll" (ByVal hService As IntPtr, ByRef lpServiceStatus As SERVICE_STATUS) As Integer
  10.     Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, ByVal dwShareMode As Integer, ByVal lpSecurityAttributes As UIntPtr, ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As IntPtr) As IntPtr
  11.     Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As IntPtr) As Integer
  12.     Private Declare Function GetLastError Lib "kernel32.dll" () As Integer
  13.     Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As UInteger)

  14.     Private Const SC_MANAGER_CONNECT = &H1
  15.     Private Const SC_MANAGER_CREATE_SERVICE = &H2
  16.     Private Const SC_MANAGER_ENUMERATE_SERVICE = &H4
  17.     Private Const SC_MANAGER_LOCK = &H8
  18.     Private Const SC_MANAGER_QUERY_LOCK_STATUS = &H10
  19.     Private Const SC_MANAGER_MODIFY_BOOT_CONFIG = &H20
  20.     Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
  21.     Private Const SC_MANAGER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SC_MANAGER_CONNECT Or SC_MANAGER_CREATE_SERVICE Or SC_MANAGER_ENUMERATE_SERVICE Or SC_MANAGER_LOCK Or SC_MANAGER_QUERY_LOCK_STATUS Or SC_MANAGER_MODIFY_BOOT_CONFIG)

  22.     Private Const SERVICE_QUERY_CONFIG = &H1
  23.     Private Const SERVICE_CHANGE_CONFIG = &H2
  24.     Private Const SERVICE_QUERY_STATUS = &H4
  25.     Private Const SERVICE_ENUMERATE_DEPENDENTS = &H8
  26.     Private Const SERVICE_START = &H10
  27.     Private Const SERVICE_STOP = &H20
  28.     Private Const SERVICE_PAUSE_CONTINUE = &H40
  29.     Private Const SERVICE_INTERROGATE = &H80
  30.     Private Const SERVICE_USER_DEFINED_CONTROL = &H100
  31.     Private Const SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SERVICE_QUERY_CONFIG Or SERVICE_CHANGE_CONFIG Or SERVICE_QUERY_STATUS Or SERVICE_ENUMERATE_DEPENDENTS Or SERVICE_START Or SERVICE_STOP Or SERVICE_PAUSE_CONTINUE Or SERVICE_INTERROGATE Or SERVICE_USER_DEFINED_CONTROL)

  32.     Private Const SERVICE_KERNEL_DRIVER As Integer = &H1

  33.     Private Const SERVICE_DEMAND_START As Integer = &H3

  34.     Private Const SERVICE_ERROR_NORMAL As Integer = &H1

  35.     Private Const SERVICE_CONTROL_STOP = &H1

  36.     Private Structure SERVICE_STATUS
  37.         Dim dwServiceType As Integer
  38.         Dim dwCurrentState As Integer
  39.         Dim dwControlsAccepted As Integer
  40.         Dim dwWin32ExitCode As Integer
  41.         Dim dwServiceSpecificExitCode As Integer
  42.         Dim dwCheckPoint As Integer
  43.         Dim dwWaitHint As Integer
  44.     End Structure
  45.     Private Const SERVICE_START_PENDING As Integer = &H2
  46.     Private Const SERVICE_RUNNING As Integer = &H4
  47.     Private Const SERVICE_RUNS_IN_SYSTEM_PROCESS As Integer = &H1
  48.     Private Const SERVICE_STOP_PENDING As Integer = &H3
  49.     Private Const SERVICE_STOPPED As Integer = &H1

  50.     Private Const GENERIC_READ As Integer = &H80000000
  51.     Private Const GENERIC_WRITE As Integer = &H40000000
  52.     Private Const OPEN_EXISTING As Integer = 3
  53.     Private Const FILE_ATTRIBUTE_NORMAL As Integer = &H80
  54.     Private Const FILE_FLAG_OVERLAPPED As Integer = &H40000000
  55.     Private Const FILE_FLAG_DELETE_ON_CLOSE As Integer = &H4000000
  56.     Private Const FILE_SHARE_READ As Integer = &H1
  57.     Private Const FILE_SHARE_WRITE As Integer = &H2

  58.     Private Structure OVERLAPPED
  59.         Dim InternalLow As UIntPtr
  60.         Dim InternalHigh As UIntPtr
  61.         Dim Pointer As ULong
  62.         Dim hEvent As IntPtr
  63.     End Structure

  64.     Private Const INVALID_HANDLE_VALUE As Long = (-1)

  65.     Private Const FILE_DEVICE_UNKNOWN As Integer = &H22
  66.     Private Const METHOD_BUFFERED As Integer = 0
  67.     Private Const FILE_ANY_ACCESS As Integer = 0

  68.     Private Const ERROR_SERVICE_EXISTS As Integer = 1073&
  69.     Private Const ERROR_IO_PENDING As Integer = 997
  70.     Private Const ERROR_SERVICE_MARKED_FOR_DELETE As Integer = 1072&

  71.     Public szDrvSvcName As String
  72.     Public szDrvDisplayName As String
  73.     Public szDrvFilePath As String
  74.     Public szDrvLinkName As String 'e.g. "\\.\TestDrv"

  75.     Dim hSvcHandle As IntPtr
  76.     Dim scHandle As IntPtr
  77.     Dim hDrvHandle As IntPtr

  78.     Public Function InstDrv() As Boolean
  79.         Static nTry As Integer
  80.         scHandle = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ALL_ACCESS)
  81.         If (Not CBool(scHandle)) Then
  82.             DelDrv()
  83.             Return False
  84.             Exit Function
  85.         End If
  86.         hSvcHandle = CreateService(scHandle, szDrvSvcName, szDrvDisplayName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, szDrvFilePath, 0, 0, 0, 0, 0)
  87.         If (Not CBool(hSvcHandle)) Then
  88.             'If ((GetLastError = ERROR_SERVICE_EXISTS) Or (GetLastError = ERROR_SERVICE_MARKED_FOR_DELETE)) Then
  89.             If (nTry > 5) Then InstDrv = False : nTry = 0 : Exit Function
  90.             hSvcHandle = OpenService(scHandle, szDrvSvcName, SERVICE_ALL_ACCESS)
  91.             DelDrv()
  92.             nTry = nTry + 1
  93.             InstDrv()
  94.             'Else
  95.             'DelDrv
  96.             'Exit Function
  97.             'End If
  98.         End If
  99.         InstDrv = True
  100.     End Function

  101.     Public Function StartDrv() As Boolean
  102.         Dim ret&
  103.         Dim ss As SERVICE_STATUS
  104.         Call QueryServiceStatus(hSvcHandle, ss)
  105.         'If (ss.dwCurrentState = SERVICE_RUNS_IN_SYSTEM_PROCESS) Then StartDrv = True: Exit Function
  106.         ret = StartService(hSvcHandle, 0, 0)
  107.         If (CBool(ret)) Then
  108.             Dim nTry As Long : nTry = 0
  109.             Call QueryServiceStatus(hSvcHandle, ss)
  110.             While ((ss.dwCurrentState = SERVICE_START_PENDING) And (nTry < 80))
  111.                 Sleep(50)
  112.                 nTry = nTry + 1
  113.                 Call QueryServiceStatus(hSvcHandle, ss)
  114.             End While
  115.         End If
  116.         StartDrv = CBool(ret)
  117.     End Function

  118.     Public Function OpenDrv() As Boolean
  119.         Dim MyFile As String
  120.         If (hDrvHandle <> INVALID_HANDLE_VALUE) Then OpenDrv = True : Exit Function
  121.         MyFile = szDrvLinkName
  122.         If Left(szDrvLinkName, Len("\\.")) <> "\\." Then
  123.             MyFile = "\\." & szDrvLinkName
  124.         End If
  125.         hDrvHandle = CreateFile(MyFile, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
  126.         OpenDrv = (hDrvHandle <> INVALID_HANDLE_VALUE)
  127.     End Function

  128.     Public Function IoControl(ByVal dwIoControlCode As Integer, ByVal lpInBuffer As UIntPtr, ByVal nInBufferSize As UInteger, ByVal lpOutBuffer As UIntPtr, ByVal nOutBufferSize As UInteger, Optional ByRef lpBytesReturned As ULong = 0) As Integer
  129.         Dim lDrvRetSize As Long
  130.         Dim pOver As OVERLAPPED
  131.         IoControl = DeviceIoControl(hDrvHandle, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lDrvRetSize, pOver)
  132.         lpBytesReturned = lDrvRetSize
  133.     End Function

  134.     Public Function StopDrv() As Boolean
  135.         Dim ss As SERVICE_STATUS
  136.         StopDrv = CBool(ControlService(hSvcHandle, SERVICE_CONTROL_STOP, ss))
  137.         Dim nTry As Long : nTry = 0
  138.         Call QueryServiceStatus(hSvcHandle, ss)
  139.         While ((ss.dwCurrentState = SERVICE_STOP_PENDING) And (nTry < 80))
  140.             Sleep(50)
  141.             nTry = nTry + 1
  142.             Call QueryServiceStatus(hSvcHandle, ss)
  143.         End While
  144.     End Function

  145.     Public Function DelDrv() As Boolean
  146.         Call CloseHandle(hDrvHandle)
  147.         Call StopDrv()
  148.         Call DeleteService(hSvcHandle)
  149.         Call CloseServiceHandle(hSvcHandle)
  150.         Call CloseServiceHandle(scHandle)
  151.         hSvcHandle = 0
  152.         scHandle = 0
  153.         DelDrv = True
  154.     End Function

  155.     '构造函数
  156.     Sub New(ByVal FilePath As String, ByVal DisplayName As String, ByVal LinkName As String, ByVal ServiceName As String)
  157.         hSvcHandle = 0
  158.         scHandle = 0
  159.         hDrvHandle = INVALID_HANDLE_VALUE
  160.         szDrvDisplayName = DisplayName
  161.         szDrvFilePath = FilePath
  162.         szDrvLinkName = LinkName
  163.         szDrvSvcName = ServiceName
  164.     End Sub

  165.     Sub Terminate()
  166.         DelDrv()
  167.     End Sub

  168.     Public Function CTL_CODE(ByVal lngDevFileSys As Integer, ByVal lngFunction As Integer, ByVal lngMethod As Integer, ByVal lngAccess As Integer) As Integer
  169.         CTL_CODE = CInt((lngDevFileSys * (2 ^ 16))) Or CInt((lngAccess * (2 ^ 14))) Or CInt((lngFunction * (2 ^ 2))) Or lngMethod
  170.     End Function

  171.     Public Function CTL_CODE_GEN(ByVal lngFunction As Long) As Integer
  172.         CTL_CODE_GEN = CInt((FILE_DEVICE_UNKNOWN * (2 ^ 16))) Or CInt((FILE_ANY_ACCESS * (2 ^ 14))) Or CInt((lngFunction * (2 ^ 2))) Or METHOD_BUFFERED
  173.     End Function
复制代码

定义一个新驱动:
  1. Dim a As New cls_Driver(文件名,显示名,链接名,服务名)
复制代码

加载驱动:
  1. With a
  2.             .InstDrv()
  3.             .StartDrv()
  4.             If .OpenDrv = False Then MsgBox("Failed to load driver!", vbExclamation, "Error") : End
  5. End With
复制代码

卸载驱动:
  1. With DrvCtrl
  2.             .StopDrv()
  3.             .DelDrv()
  4. End With
复制代码

857

主题

2632

回帖

2

精华

管理员

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

积分
36130
发表于 2017-3-26 11:31:28 | 显示全部楼层
感觉这个有点多余了。直接利用.NET提供的注册表操作类写好注册表数据,然后调用ZwLoadDriver即可。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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