|
和以前大家在VB6上使用的cls_Driver.cls类模块一样,我们也是把它放进一个类模块里用。不过注意VB6下有些地方使用到了指针,我们不能直接拿来用而是要用间接传递或者用VirtualAlloc,代码如下:
- Public Class cls_Driver
- Private Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long
- Private Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal dwDesiredAccess As Long) As Long
- Private Declare Function StartService Lib "advapi32.dll" Alias "StartServiceA" (ByVal hService As Long, ByVal dwNumServiceArgs As Long, ByVal lpServiceArgVectors As Long) As Long
- 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
- Private Declare Function ControlService Lib "advapi32.dll" (ByVal hService As Long, ByVal dwControl As Long, ByRef lpServiceStatus As SERVICE_STATUS) As Long
- 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
- Private Declare Function DeleteService Lib "advapi32.dll" (ByVal hService As Long) As Long
- Private Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As Long) As Long
- Private Declare Function QueryServiceStatus Lib "advapi32.dll" (ByVal hService As Long, ByRef lpServiceStatus As SERVICE_STATUS) As Long
- 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
- Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
- Private Declare Function GetLastError Lib "kernel32.dll" () As Long
- 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
- Private Declare Function VirtualFree Lib "kernel32.dll" Alias "VirtualFree" (ByVal lpAddress As Long, ByVal dwSize As Integer, ByVal dwFreeType As Integer) As Long
- Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
- Private Const SC_MANAGER_CONNECT = &H1
- Private Const SC_MANAGER_CREATE_SERVICE = &H2
- Private Const SC_MANAGER_ENUMERATE_SERVICE = &H4
- Private Const SC_MANAGER_LOCK = &H8
- Private Const SC_MANAGER_QUERY_LOCK_STATUS = &H10
- Private Const SC_MANAGER_MODIFY_BOOT_CONFIG = &H20
- Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
- 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)
- Private Const SERVICE_QUERY_CONFIG = &H1
- Private Const SERVICE_CHANGE_CONFIG = &H2
- Private Const SERVICE_QUERY_STATUS = &H4
- Private Const SERVICE_ENUMERATE_DEPENDENTS = &H8
- Private Const SERVICE_START = &H10
- Private Const SERVICE_STOP = &H20
- Private Const SERVICE_PAUSE_CONTINUE = &H40
- Private Const SERVICE_INTERROGATE = &H80
- Private Const SERVICE_USER_DEFINED_CONTROL = &H100
- 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)
- Private Const SERVICE_KERNEL_DRIVER As Long = &H1
- Private Const SERVICE_DEMAND_START As Long = &H3
- Private Const SERVICE_ERROR_NORMAL As Long = &H1
- Private Const SERVICE_CONTROL_STOP = &H1
- Private Structure SERVICE_STATUS
- Dim dwServiceType As Long
- Dim dwCurrentState As Long
- Dim dwControlsAccepted As Long
- Dim dwWin32ExitCode As Long
- Dim dwServiceSpecificExitCode As Long
- Dim dwCheckPoint As Long
- Dim dwWaitHint As Long
- End Structure
- Private Const SERVICE_START_PENDING As Long = &H2
- Private Const SERVICE_RUNNING As Long = &H4
- Private Const SERVICE_RUNS_IN_SYSTEM_PROCESS As Long = &H1
- Private Const SERVICE_STOP_PENDING As Long = &H3
- Private Const SERVICE_STOPPED As Long = &H1
- Private Const GENERIC_READ As Long = &H80000000
- Private Const GENERIC_WRITE As Long = &H40000000
- Private Const OPEN_EXISTING As Long = 3
- Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80
- Private Const FILE_FLAG_OVERLAPPED As Long = &H40000000
- Private Const FILE_FLAG_DELETE_ON_CLOSE As Long = &H4000000
- Private Const FILE_SHARE_READ As Long = &H1
- Private Const FILE_SHARE_WRITE As Long = &H2
- Private Const INVALID_HANDLE_VALUE As Long = (-1)
- Private Const FILE_DEVICE_UNKNOWN As Long = &H22
- Private Const METHOD_BUFFERED As Long = 0
- Private Const FILE_ANY_ACCESS As Long = 0
- Private Const ERROR_SERVICE_EXISTS As Long = 1073&
- Private Const ERROR_IO_PENDING As Long = 997
- Private Const ERROR_SERVICE_MARKED_FOR_DELETE As Long = 1072&
- Public szDrvSvcName As String
- Public szDrvDisplayName As String
- Public szDrvFilePath As String
- Public szDrvLinkName As String 'e.g. "\\.\TestDrv"
- Dim hSvcHandle As Long
- Dim scHandle As Long
- Dim hDrvHandle As Long
- Public Function InstDrv() As Boolean
- Static nTry As Long
- scHandle = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ALL_ACCESS)
- If (Not CBool(scHandle)) Then
- DelDrv()
- Return False
- Exit Function
- End If
- hSvcHandle = CreateService(scHandle, szDrvSvcName, szDrvDisplayName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, szDrvFilePath, 0, 0, 0, 0, 0)
- If (Not CBool(hSvcHandle)) Then
- 'If ((GetLastError = ERROR_SERVICE_EXISTS) Or (GetLastError = ERROR_SERVICE_MARKED_FOR_DELETE)) Then
- If (nTry > 5) Then InstDrv = False : nTry = 0 : Exit Function
- hSvcHandle = OpenService(scHandle, szDrvSvcName, SERVICE_ALL_ACCESS)
- DelDrv()
- nTry = nTry + 1
- InstDrv()
- 'Else
- 'DelDrv
- 'Exit Function
- 'End If
- End If
- InstDrv = True
- End Function
- Public Function StartDrv() As Boolean
- Dim ret&
- Dim ss As SERVICE_STATUS
- Call QueryServiceStatus(hSvcHandle, ss)
- 'If (ss.dwCurrentState = SERVICE_RUNS_IN_SYSTEM_PROCESS) Then StartDrv = True: Exit Function
- ret = StartService(hSvcHandle, 0, 0)
- If (CBool(ret)) Then
- Dim nTry As Long : nTry = 0
- Call QueryServiceStatus(hSvcHandle, ss)
- While ((ss.dwCurrentState = SERVICE_START_PENDING) And (nTry < 80))
- Sleep(50)
- nTry = nTry + 1
- Call QueryServiceStatus(hSvcHandle, ss)
- End While
- End If
- StartDrv = CBool(ret)
- End Function
- Public Function OpenDrv() As Boolean
- Dim MyFile As String
- If (hDrvHandle <> INVALID_HANDLE_VALUE) Then OpenDrv = True : Exit Function
- MyFile = szDrvLinkName
- If Left(szDrvLinkName, Len("\\.")) <> "\\." Then
- MyFile = "\\." & szDrvLinkName
- End If
- hDrvHandle = CreateFile(MyFile, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
- OpenDrv = (hDrvHandle <> INVALID_HANDLE_VALUE)
- End Function
- 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
- Dim lDrvRetSize As Long
- Dim pOver As Long
- pOver = VirtualAlloc(0, 40, &H1000, &H4)
- IoControl = DeviceIoControl(hDrvHandle, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lDrvRetSize, pOver)
- VirtualFree(pOver, 40, &H4000)
- lpBytesReturned = lDrvRetSize
- End Function
- Public Function StopDrv() As Boolean
- Dim ss As SERVICE_STATUS
- StopDrv = CBool(ControlService(hSvcHandle, SERVICE_CONTROL_STOP, ss))
- Dim nTry As Long : nTry = 0
- Call QueryServiceStatus(hSvcHandle, ss)
- While ((ss.dwCurrentState = SERVICE_STOP_PENDING) And (nTry < 80))
- Sleep(50)
- nTry = nTry + 1
- Call QueryServiceStatus(hSvcHandle, ss)
- End While
- End Function
- Public Function DelDrv() As Boolean
- Call CloseHandle(hDrvHandle)
- Call StopDrv()
- Call DeleteService(hSvcHandle)
- Call CloseServiceHandle(hSvcHandle)
- Call CloseServiceHandle(scHandle)
- hSvcHandle = 0
- scHandle = 0
- DelDrv = True
- End Function
- '构造函数
- Sub New()
- hSvcHandle = 0
- scHandle = 0
- hDrvHandle = INVALID_HANDLE_VALUE
- End Sub
- Sub Terminate()
- DelDrv()
- End Sub
- Public Function CTL_CODE(ByVal lngDevFileSys As Long, ByVal lngFunction As Long, ByVal lngMethod As Long, ByVal lngAccess As Long) As Long
- CTL_CODE = CLng((lngDevFileSys * (2 ^ 16))) Or CLng((lngAccess * (2 ^ 14))) Or CLng((lngFunction * (2 ^ 2))) Or lngMethod
- End Function
- Public Function CTL_CODE_GEN(ByVal lngFunction As Long) As Long
- CTL_CODE_GEN = CLng((FILE_DEVICE_UNKNOWN * (2 ^ 16))) Or CLng((FILE_ANY_ACCESS * (2 ^ 14))) Or CLng((lngFunction * (2 ^ 2))) Or METHOD_BUFFERED
- End Function
- End Class
复制代码
昨天这段代码调了半天老是出各种各样的错误,最后有梧桐牛在旁指点总算是搞定了。特此感谢。 |
评分
-
查看全部评分
|