加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

VB.NET 获取驱动信息

发布时间:2020-12-17 07:42:15 所属栏目:百科 来源:网络整理
导读:在.NET框架中本身就提供了一套API接口,包含在System.Service Process中 你可能会有疑惑,驱动与系统服务是不一样的 对的它们 的确不一样、这样说 吧、驱动是跟随系统最先启动的程序,当然这 个前提必须建立在你的驱动安 装 在 %WINDIR%[32/64]Drivers中,

在.NET框架中本身就提供了一套API接口,包含在System.Service

Process中你可能会有疑惑,驱动与系统服务是不一样的 对的它们

的确不一样、这样说吧、驱动是跟随系统最先启动的程序,当然这

个前提必须建立在你的驱动安%WINDIR%[32/64]Drivers中,

然后是系统组件包括系统服务两个部分、.NET可以开发系统服务但

不可以开发驱动这是因为,在驱动随系统映射时、CLR组件还没有

被系统映射、当然驱动与服务两个本身相当类似,我们需要调用它

提供的服务于命令基本方式都差不到那里去、至于.NET框架上

ServiceController类提供的ExecuteCommand当然它不止是调用

服务命令且可以使用驱动命令、它包含一个命令参数且必须在128

~256之间,而且不存在返回值、着实有些令人摸不到头脑、当然通

是通过DeviceIoControl调用命令、在本文中通过EnumDeviceDri

vers、GetDeviceDriverBaseName获取到被映射的驱动程序、通过

这两个函数可以更快更节省资源的获取到我们想要的信息 如果需要

获取到复杂信息 那可以通过ServiceController.GetDevices()获取

当然这或许会是个好办法


外部函数注解:

// 枚举驱动设备映像

Declare Sub EnumDeviceDrivers Lib "psapi.dll" (ByVal lpImageBase As IntPtr(),// 欲获取驱动映像地址缓冲区

ByVal cbSize As Integer,// 欲获取驱动映像地址缓冲区长度
ByRef lpcbNeeded As Integer) // 欲获取驱动映像地址缓冲区尺寸

// 取驱动设备基类名

Declare Sub GetDeviceDriverBaseName Lib "psapi.dll" Alias "GetDeviceDriverBaseNameA" (

ByVal ImageBase As IntPtr,// 欲获取信息的驱动映像地址

ByVal lpBaseName As String,// 欲获取驱动信息的字符缓冲区
ByVal nSize As Integer) // 欲获取驱动信息的字符缓冲区尺寸

// 取驱动设备文件名

Declare Sub GetDeviceDriverFileName Lib "psapi.dll" Alias "GetDeviceDriverFileNameA" (

ByVal ImageBase As IntPtr,// 欲获取信息的驱动映像地址
ByVal lpBaseName As String,// 欲获取驱动信息的字符缓冲区
ByVal nSize As Integer)// 欲获取驱动信息的字符缓冲区尺寸

示例代码:

Imports System.Runtime.InteropServices

Module MainModule

    Declare Sub EnumDeviceDrivers Lib "psapi.dll" (ByVal lpImageBase As IntPtr(),ByVal cbSize As Integer,ByRef lpcbNeeded As Integer)

    Declare Sub GetDeviceDriverBaseName Lib "psapi.dll" Alias "GetDeviceDriverBaseNameA" (ByVal ImageBase As IntPtr,ByVal lpBaseName As String,ByVal nSize As Integer)

    Declare Sub GetDeviceDriverFileName Lib "psapi.dll" Alias "GetDeviceDriverFileNameA" (ByVal ImageBase As IntPtr,ByVal nSize As Integer)

    Sub Main()
        Dim cbSize = vbNull,cbNeeded As Integer
        Dim pbaseAddr As IntPtr() = Nothing
        Do
            cbSize = cbSize * 2
            ReDim pbaseAddr(cbSize)
            EnumDeviceDrivers(pbaseAddr,cbSize,cbNeeded)
        Loop While cbNeeded > cbSize
        cbSize = (cbNeeded / IntPtr.Size) - 1
        For i = 0 To cbSize Step 1
            Dim strBaseName As String = Space(8096)
            GetDeviceDriverBaseName(pbaseAddr(i),strBaseName,8096)
            Console.WriteLine(strBaseName.TrimEnd() & pbaseAddr(i).ToString("X"))
        Next
        Console.ReadKey(False)
    End Sub

End Module

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读