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

原文地址:https://www.cnblogs.com/eyye/p/1536322.html