找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5970|回复: 4

64位版的VB2010使用SCM加载驱动

[复制链接]

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
发表于 2016-2-12 13:02:50 | 显示全部楼层 |阅读模式
和以前大家在VB6上使用的cls_Driver.cls类模块一样,我们也是把它放进一个类模块里用。不过注意VB6下有些地方使用到了指针,我们不能直接拿来用而是要用间接传递或者用VirtualAlloc,代码如下:
  1. Public Class cls_Driver
  2.     Private Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long
  3.     Private Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal dwDesiredAccess As Long) As Long
  4.     Private Declare Function StartService Lib "advapi32.dll" Alias "StartServiceA" (ByVal hService As Long, ByVal dwNumServiceArgs As Long, ByVal lpServiceArgVectors As Long) As Long
  5.     Private Declare Function CreateService Lib "advapi32.dll" Alias "CreateServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal lpDisplayName As String, ByVal dwDesiredAccess As Long, ByVal dwServiceType As Long, ByVal dwStartType As Long, ByVal dwErrorControl As Long, ByVal lpBinaryPathName As String, ByVal lpLoadOrderGroup As Long, ByVal lpdwTagId As Long, ByVal lpDependencies As Long, ByVal lp As Long, ByVal lpPassword As Long) As Long
  6.     Private Declare Function ControlService Lib "advapi32.dll" (ByVal hService As Long, ByVal dwControl As Long, ByRef lpServiceStatus As SERVICE_STATUS) As Long
  7.     Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, ByVal lpInBuffer As Long, ByVal nInBufferSize As Long, ByVal lpOutBuffer As Long, ByVal nOutBufferSize As Long, ByVal lpBytesReturned As Long, ByVal lpOverlapped As Long) As Long
  8.     Private Declare Function DeleteService Lib "advapi32.dll" (ByVal hService As Long) As Long
  9.     Private Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As Long) As Long
  10.     Private Declare Function QueryServiceStatus Lib "advapi32.dll" (ByVal hService As Long, ByRef lpServiceStatus As SERVICE_STATUS) As Long
  11.     Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
  12.     Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
  13.     Private Declare Function GetLastError Lib "kernel32.dll" () As Long
  14.     Private Declare Function VirtualAlloc Lib "kernel32.dll" Alias "VirtualAlloc" (ByVal lpAddress As Long, ByVal dwSize As Integer, ByVal flAllocationType As Integer, ByVal flProtect As Integer) As Long
  15.     Private Declare Function VirtualFree Lib "kernel32.dll" Alias "VirtualFree" (ByVal lpAddress As Long, ByVal dwSize As Integer, ByVal dwFreeType As Integer) As Long
  16.     Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

  17.     Private Const SC_MANAGER_CONNECT = &H1
  18.     Private Const SC_MANAGER_CREATE_SERVICE = &H2
  19.     Private Const SC_MANAGER_ENUMERATE_SERVICE = &H4
  20.     Private Const SC_MANAGER_LOCK = &H8
  21.     Private Const SC_MANAGER_QUERY_LOCK_STATUS = &H10
  22.     Private Const SC_MANAGER_MODIFY_BOOT_CONFIG = &H20
  23.     Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
  24.     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)

  25.     Private Const SERVICE_QUERY_CONFIG = &H1
  26.     Private Const SERVICE_CHANGE_CONFIG = &H2
  27.     Private Const SERVICE_QUERY_STATUS = &H4
  28.     Private Const SERVICE_ENUMERATE_DEPENDENTS = &H8
  29.     Private Const SERVICE_START = &H10
  30.     Private Const SERVICE_STOP = &H20
  31.     Private Const SERVICE_PAUSE_CONTINUE = &H40
  32.     Private Const SERVICE_INTERROGATE = &H80
  33.     Private Const SERVICE_USER_DEFINED_CONTROL = &H100
  34.     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)

  35.     Private Const SERVICE_KERNEL_DRIVER As Long = &H1

  36.     Private Const SERVICE_DEMAND_START As Long = &H3

  37.     Private Const SERVICE_ERROR_NORMAL As Long = &H1

  38.     Private Const SERVICE_CONTROL_STOP = &H1

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

  53.     Private Const GENERIC_READ As Long = &H80000000
  54.     Private Const GENERIC_WRITE As Long = &H40000000
  55.     Private Const OPEN_EXISTING As Long = 3
  56.     Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80
  57.     Private Const FILE_FLAG_OVERLAPPED As Long = &H40000000
  58.     Private Const FILE_FLAG_DELETE_ON_CLOSE As Long = &H4000000
  59.     Private Const FILE_SHARE_READ As Long = &H1
  60.     Private Const FILE_SHARE_WRITE As Long = &H2

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

  62.     Private Const FILE_DEVICE_UNKNOWN As Long = &H22
  63.     Private Const METHOD_BUFFERED As Long = 0
  64.     Private Const FILE_ANY_ACCESS As Long = 0

  65.     Private Const ERROR_SERVICE_EXISTS As Long = 1073&
  66.     Private Const ERROR_IO_PENDING As Long = 997
  67.     Private Const ERROR_SERVICE_MARKED_FOR_DELETE As Long = 1072&

  68.     Public szDrvSvcName As String
  69.     Public szDrvDisplayName As String
  70.     Public szDrvFilePath As String
  71.     Public szDrvLinkName As String 'e.g. "\\.\TestDrv"

  72.     Dim hSvcHandle As Long
  73.     Dim scHandle As Long
  74.     Dim hDrvHandle As Long

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

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

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

  125.     Public Function IoControl(ByVal dwIoControlCode As Long, ByVal lpInBuffer As Long, ByVal nInBufferSize As Long, ByVal lpOutBuffer As Long, ByVal nOutBufferSize As Long, Optional ByRef lpBytesReturned As Long = 0) As Long
  126.         Dim lDrvRetSize As Long
  127.         Dim pOver As Long
  128.         pOver = VirtualAlloc(0, 40, &H1000, &H4)
  129.         IoControl = DeviceIoControl(hDrvHandle, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lDrvRetSize, pOver)
  130.         VirtualFree(pOver, 40, &H4000)
  131.         lpBytesReturned = lDrvRetSize
  132.     End Function

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

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

  154.     '构造函数
  155.     Sub New()
  156.         hSvcHandle = 0
  157.         scHandle = 0
  158.         hDrvHandle = INVALID_HANDLE_VALUE
  159.     End Sub

  160.     Sub Terminate()
  161.         DelDrv()
  162.     End Sub

  163.     Public Function CTL_CODE(ByVal lngDevFileSys As Long, ByVal lngFunction As Long, ByVal lngMethod As Long, ByVal lngAccess As Long) As Long
  164.         CTL_CODE = CLng((lngDevFileSys * (2 ^ 16))) Or CLng((lngAccess * (2 ^ 14))) Or CLng((lngFunction * (2 ^ 2))) Or lngMethod
  165.     End Function

  166.     Public Function CTL_CODE_GEN(ByVal lngFunction As Long) As Long
  167.         CTL_CODE_GEN = CLng((FILE_DEVICE_UNKNOWN * (2 ^ 16))) Or CLng((FILE_ANY_ACCESS * (2 ^ 14))) Or CLng((lngFunction * (2 ^ 2))) Or METHOD_BUFFERED
  168.     End Function
  169. End Class
复制代码

昨天这段代码调了半天老是出各种各样的错误,最后有梧桐牛在旁指点总算是搞定了。特此感谢。

评分

参与人数 1水晶币 +80 收起 理由
Tesla.Angela + 80 赞一个!

查看全部评分

857

主题

2632

回帖

2

精华

管理员

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

积分
36130
发表于 2016-2-16 00:07:15 | 显示全部楼层
不错,当年我愣是没搞出来。

2

主题

35

回帖

0

精华

铜牌会员

积分
173
发表于 2016-9-7 03:36:16 | 显示全部楼层
这个超级赞.
赶紧复制了一遍 转成了 C# ~~ (谁叫我习惯用C#

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
 楼主| 发表于 2016-9-7 20:48:59 | 显示全部楼层
aisht 发表于 2016-9-7 03:36
这个超级赞.
赶紧复制了一遍 转成了 C# ~~ (谁叫我习惯用C#

这代码有点坑,直接转可能会出问题。。。而且这是面向x64的,如果放32上需要修改类型。。。

857

主题

2632

回帖

2

精华

管理员

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

积分
36130
发表于 2016-9-17 11:49:34 | 显示全部楼层
tangptr@126.com 发表于 2016-9-7 20:48
这代码有点坑,直接转可能会出问题。。。而且这是面向x64的,如果放32上需要修改类型。。。 ...


VB.NET有个类似SIZE_T的可变长度类型叫做INTPTR。
  1. Dim x As IntPtr = 0
  2. If IntPtr.Size = 4 Then
  3.     x = &H7FFFFFFF
  4.     MsgBox(Hex(x.ToInt32))
  5. Else
  6.     x = &H7FFFFFFFFFFFFFFF
  7.     MsgBox(Hex(x.ToInt64))
  8. End If
复制代码
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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