zoukankan      html  css  js  c++  java
  • VB读取硬盘序列号

    Private Const MAX_IDE_DRIVES       As Long = 4
    Private Const IDENTIFY_BUFFER_SIZE       As Long = 512
    Private Const DFP_SEND_DRIVE_COMMAND       As Long = &H7C084
    Private Const DFP_RECEIVE_DRIVE_DATA       As Long = &H7C088

    Private Type GETVERSIONOUTPARAMS
            bVersion   
    As Byte                 '   Binary   driver   version.
            bRevision   As Byte               '   Binary   driver   revision.
            bReserved   As Byte               '   Not   used.
            bIDEDeviceMap   As Byte       '   Bit   map   of   IDE   devices.
            fCapabilities   As Long       '   Bit   mask   of   driver   capabilities.
            dwReserved(3)   As Long       '   For   future   use.
    End Type
    Private Type IDEREGS
            bFeaturesReg   
    As Byte                 '   Used   for   specifying   SMART   "commands".
            bSectorCountReg   As Byte           '   IDE   sector   count   register
            bSectorNumberReg   As Byte         '   IDE   sector   number   register
            bCylLowReg   As Byte                     '   IDE   low   order   cylinder   value
            bCylHighReg   As Byte                   '   IDE   high   order   cylinder   value
            bDriveHeadReg   As Byte               '   IDE   drive/head   register
            bCommandReg   As Byte                   '   Actual   IDE   command.
    End Type

    Private Type SENDCMDINPARAMS
            cBufferSize   
    As Long                   '   Buffer   size   in   bytes
            irDriveRegs   As IDEREGS             '   Structure   with   drive   register   values.
            bDriveNumber   As Byte                 '   Physical   drive   number   to   send
            bReserved(2)   As Byte                 '   Reserved   for   future   expansion.
            dwReserved(3)   As Long               '   For   future   use.
            bBuffer(0)   As Byte                     '   Input   buffer.
    End Type
    Private Const IDE_ATAPI_ID       As Long = &HA1           '   Returns   ID   sector   for   ATAPI.
    Private Const IDE_ID_FUNCTION       As Long = &HEC           '   Returns   ID   sector   for   ATA.
    Private Const IDE_EXECUTE_SMART_FUNCTION       As Long = &HB0           '   Performs   SMART   cmd.
    Private Type DRIVERSTATUS
            bReserved(
    1)   As Byte                 '   Reserved   for   future   expansion.
            dwReserved(1)   As Long               '   Reserved   for   future   expansion.
    End Type

    Private Type SENDCMDOUTPARAMS
            cBufferSize   
    As Long                   '   Size   of   bBuffer   in   bytes
            drvStatus   As DRIVERSTATUS       '   Driver   status   structure.
            bBuffer(0)   As Byte                     '   Buffer   of   arbitrary   length   in   which   to   store   the   data   read   from   the                                                                                     '   drive.
    End Type


    Private Type ATTRTHRESHOLD
            bAttrID   
    As Byte                           '   Identifies   which   attribute
            bWarrantyThreshold   As Byte     '   Triggering   value
            bReserved(9)   As Byte               '   
    End Type

    Private Type IDSECTOR
            wGenConfig   
    As Integer
            wNumCyls   
    As Integer
            wReserved   
    As Integer
            wNumHeads   
    As Integer
            wBytesPerTrack   
    As Integer
            wBytesPerSector   
    As Integer
            wSectorsPerTrack   
    As Integer
            wVendorUnique(
    2)   As Integer
            sSerialNumber(
    19)   As Byte
            wBufferType   
    As Integer
            sFirmwareRev(
    7)   As Byte
            sModelNumber(
    39)   As Byte
    End Type

    Private Const VER_PLATFORM_WIN32s As Long = 0
    Private Const VER_PLATFORM_WIN32_WINDOWS As Long = 1
    Private Const VER_PLATFORM_WIN32_NT As Long = 2
    Private Type OSVERSIONINFO
            dwOSVersionInfoSize   
    As Long
            dwMajorVersion   
    As Long
            dwMinorVersion   
    As Long
            dwBuildNumber   
    As Long
            dwPlatformId   
    As Long
            szCSDVersion   
    As String * 128                   '     Maintenance   string   for   PSS   usage
    End Type

    Private Declare Function GetVersionEx Lib "KERNEL32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
    Private Const GENERIC_READ       As Long = &H80000000
    Private Const GENERIC_WRITE       As Long = &H40000000
    Private Const OPEN_EXISTING         As Long = 3
    Private Declare Function CreateFile Lib "KERNEL32" Alias "CreateFileA" (ByVal lpFileName As StringByVal dwDesiredAccess As LongByVal dwShareMode As LongByVal lpSecurityAttributes As LongByVal dwCreationDisposition As LongByVal dwFlagsAndAttributes As LongByVal hTemplateFile As LongAs Long
    Private Declare Function DeviceIoControl Lib "KERNEL32" (ByVal hDevice As LongByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As LongByVal lpOverlapped As LongAs Long
    Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Declare Function CloseHandle Lib "KERNEL32" (ByVal hObject As LongAs Long
    Private m_DiskInfo As IDSECTOR

    Private Function OpenSMART(ByVal nDrive As ByteAs Long
          
    Dim hSMARTIOCTL&, hd$
          
    Dim VersionInfo     As OSVERSIONINFO
          VersionInfo.dwOSVersionInfoSize 
    = Len(VersionInfo)
          GetVersionEx VersionInfo
          
    Select Case VersionInfo.dwPlatformId
                
    Case VER_PLATFORM_WIN32s
                      OpenSMART 
    = hSMARTIOCTL
                
    Case VER_PLATFORM_WIN32_WINDOWS
                      hSMARTIOCTL 
    = CreateFile("\\.\SMARTVSD"000, CREATE_NEW, 00)
                
    Case VER_PLATFORM_WIN32_NT
                      
    If nDrive < MAX_IDE_DRIVES Then
                            hd 
    = "\\.\PhysicalDrive" & nDrive
                            hSMARTIOCTL 
    = CreateFile(hd, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 00)
                      
    End If
          
    End Select
          OpenSMART 
    = hSMARTIOCTL
    End Function


    Private Function DoIDENTIFY(ByVal hSMARTIOCTL As Long, pSCIP As SENDCMDINPARAMS, pSCOP() As ByteByVal bIDCmd As ByteByVal bDriveNum As Byte, lpcbBytesReturned As LongAs Boolean
          pSCIP.irDriveRegs.bDriveHeadReg 
    = &HA0 Or ((bDriveNum And 1* 2 ^ 4)
          pSCIP.irDriveRegs.bCommandReg 
    = bIDCmd
          pSCIP.bDriveNumber 
    = bDriveNum
          DoIDENTIFY 
    = CBool(DeviceIoControl(hSMARTIOCTL, DFP_RECEIVE_DRIVE_DATA, pSCIP, 32, pSCOP(0), 528, lpcbBytesReturned, 0))
    End Function


    Public Function GetDiskInfo(ByVal nDrive As ByteAs Long
          
    Dim hSMARTIOCTL&, cbBytesReturned&
          
    Dim VersionParams     As GETVERSIONOUTPARAMS
          
    Dim scip     As SENDCMDINPARAMS
          
    Dim scop()     As Byte
          
    Dim OutCmd     As SENDCMDOUTPARAMS
          
    Dim bDfpDriveMap     As Byte
          
    Dim bIDCmd     As Byte                                           '   IDE   or   ATAPI   IDENTIFY   cmd
          Dim uDisk     As IDSECTOR
          m_DiskInfo 
    = uDisk
          hSMARTIOCTL 
    = OpenSMART(nDrive)
          
    If hSMARTIOCTL <> INVALID_HANDLE_VALUE Then
                
    Call DeviceIoControl(hSMARTIOCTL, DFP_GET_VERSION, ByVal 00, VersionParams, Len(VersionParams), cbBytesReturned, 0)
                bIDCmd 
    = IIf((VersionParams.bIDEDeviceMap \ 2 ^ nDrive And &H10), IDE_ATAPI_ID, IDE_ID_FUNCTION)
                
    ReDim scop(LenB(OutCmd) + IDENTIFY_BUFFER_SIZE - 1As Byte
                
    If DoIDENTIFY(hSMARTIOCTL, scip, scop, bIDCmd, nDrive, cbBytesReturned) Then
                      CopyMemory m_DiskInfo, scop(LenB(OutCmd) 
    - 4), LenB(m_DiskInfo)
                      CloseHandle hSMARTIOCTL
                      GetDiskInfo 
    = 1
                      
    Exit Function
                
    End If
                CloseHandle hSMARTIOCTL
                GetDiskInfo 
    = 0
          
    End If
    End Function


    Public Function GetHDlist() As String
          
    If GetDiskInfo(0= 1 Then
                GetHDlist 
    = "硬盘物理系列号:" & Trim(StrConv(m_DiskInfo.sSerialNumber, vbUnicode))
                
    'GetHDlist = "硬盘型号:" & StrConv(m_DiskInfo.sModelNumber, vbUnicode)
          Else
            GetHDlist 
    = "读取错误"
          
    End If
    End Function

  • 相关阅读:
    selenium开发-C#/java/Python
    Web循环监控Java调用 / Java调用.net wcf接口
    网站循环加载监控-C#
    串口通信分析
    windows环境jar包部署到linux服务器,一键操作
    windows环境jar包部署到linux服务器,一键操作(帮助说明)
    Git+TortoiseGit使用帮助
    安装Docker
    MySQL报错信息:Warning: (1366, "Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA...' for column 'VARIABLE_VALUE' at row 489")
    txt文档中文乱码
  • 原文地址:https://www.cnblogs.com/eyye/p/1536322.html
Copyright © 2011-2022 走看看