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 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 DeviceIoControl Lib "KERNEL32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, ByVal lpOverlapped As Long) As 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 Long) As Long
Private m_DiskInfo As IDSECTOR
Private Function OpenSMART(ByVal nDrive As Byte) As 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", 0, 0, 0, CREATE_NEW, 0, 0)
            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, 0, 0)
                  End If
      End Select
      OpenSMART = hSMARTIOCTL
End Function
Private Function DoIDENTIFY(ByVal hSMARTIOCTL As Long, pSCIP As SENDCMDINPARAMS, pSCOP() As Byte, ByVal bIDCmd As Byte, ByVal bDriveNum As Byte, lpcbBytesReturned As Long) As 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 Byte) As 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 0, 0, 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 - 1) As 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
这里已经获取了硬盘型号,怎么写判断语句,与我设定的硬盘号(比如123456)比较,一致则运行,不一致则关闭系统????