Return to Snippet

Revision: 15433
at July 6, 2009 02:39 by devubha


Initial Code
Imports System.Runtime.InteropServices

Public Class SerialNo
    ' Get the Hard disk serial no to pass the HMSite for generating the Key2
    Public Function GetHDDSerialNo() As String
        Dim query As System.Management.ManagementObjectSearcher
        Dim queryCollection As System.Management.ManagementObjectCollection
        Dim oq As System.Management.ObjectQuery
        Dim DriveName As String = ""
        Dim DriveSerialNo As String = ""

        oq = New System.Management.ObjectQuery("SELECT * FROM Win32_DiskDrive")
        query = New System.Management.ManagementObjectSearcher(oq)
        queryCollection = query.Get()
        For Each mo As System.Management.ManagementObject In queryCollection
            DriveName = mo("Name").ToString
            ' Retrive the serial number
            If IsNumeric(DriveName.Substring(DriveName.Length - 1)) Then
                Dim info As New DriveInfo(DriveName.Substring(DriveName.Length - 1))
                If Not info.SerialNumber Is Nothing Then
                    DriveSerialNo = info.SerialNumber.ToString
                    ' Replace Some specila char in some time this will create problem
                    DriveSerialNo = DriveSerialNo.Replace(Chr(34), " ")
                    DriveSerialNo = DriveSerialNo.Replace("'", " ")
                    DriveSerialNo = DriveSerialNo.Replace(Chr(13), " ")
                    Exit For
                End If
            End If
        Next
        Return DriveSerialNo
    End Function
End Class

Friend Class DriveInfo

#Region "Enum"
    Enum DriveTypes
        Fixed
        Removable
        Unknown
    End Enum

    Public Enum IDE_DRIVE_NUMBER
        PRIMARY_MASTER
        PRIMARY_SLAVE
        SECONDARY_MASTER
        SECONDARY_SLAVE
        TERTIARY_MASTER
        TERTIARY_SLAVE
        QUARTIARY_MASTER
        QUARTIARY_SLAVE
    End Enum
#End Region

#Region "Private Variable"
    Private _serialNumber As String
    Private _model As String
    Private _firmware As String

    Private _driveType As DriveTypes = DriveTypes.Unknown
    Private _numberCylinders As Integer
    Private _numberHeads As Integer
    Private _sectorsPerTrack As Integer
    Private _bufferSize As Integer
#End Region

#Region "Constructor"

    Public Sub New(ByVal driveNumber As Integer)

        Dim result As Boolean
        Dim handle As Integer
        Dim returnSize As Integer

        Dim sci As New SENDCMDINPARAMS
        Dim sco As New SENDCMDOUTPARAMS

        If Environment.OSVersion.Platform = PlatformID.Win32NT Then
            handle = CreateFile("\\.\PhysicalDrive" & CStr(driveNumber), GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
        Else ' 9X
            handle = CreateFile("\\.\Smartvsd", 0, 0, 0, CREATE_NEW, 0, 0)
        End If

        If handle <> INVALID_HANDLE_VALUE Then

            sci.DriveNumber = CType(driveNumber, Byte)
            sci.BufferSize = Marshal.SizeOf(sco)
            'sci.DriveRegs.DriveHead = CType(&HA0 Or (driveNumber << 4), Byte)
            'sci.DriveRegs.Command = &HEC
            sci.DriveRegs.SectorCount = 1
            sci.DriveRegs.SectorNumber = 1

            sci.DriveRegs.Features = &HD0 '&HDA
            sci.DriveRegs.CylinderLow = SMART_CYL_LOW
            sci.DriveRegs.CylinderHigh = SMART_CYL_HI
            sci.DriveRegs.DriveHead = DRIVE_HEAD_REG
            sci.DriveRegs.Command = SMART_CMD

            'If DeviceIoControl(handle, DFP_RECEIVE_DRIVE_DATA, sci, Marshal.SizeOf(sci), sco, Marshal.SizeOf(sco), returnSize, 0) <> 0 Then
            '    _serialNumber = SwapChars(sco.IDS.SerialNumber)
            '    _model = SwapChars(sco.IDS.ModelNumber)
            '    _firmware = SwapChars(sco.IDS.FirmwareRevision)
            '    _numberCylinders = sco.IDS.NumberCylinders
            '    _numberHeads = sco.IDS.NumberHeads
            '    _sectorsPerTrack = sco.IDS.SectorsPerTrack
            '    _bufferSize = sco.IDS.BufferSize * 512
            '    If (sco.IDS.GenConfig And &H80) = &H80 Then
            '        _driveType = DriveTypes.Removable
            '    ElseIf (sco.IDS.GenConfig And &H40) = &H40 Then
            '        _driveType = DriveTypes.Fixed
            '    Else
            '        _driveType = DriveTypes.Unknown
            '    End If
            'End If

            If DeviceIoControl(handle, SMART_SEND_DRIVE_COMMAND, sci, Marshal.SizeOf(sci), sco, Marshal.SizeOf(sco), returnSize, 0) <> 0 Then
                _serialNumber = SwapChars(sco.IDS.SerialNumber)
                _model = SwapChars(sco.IDS.ModelNumber)
                _firmware = SwapChars(sco.IDS.FirmwareRevision)
                _numberCylinders = sco.IDS.NumberCylinders
                _numberHeads = sco.IDS.NumberHeads
                _sectorsPerTrack = sco.IDS.SectorsPerTrack
                _bufferSize = sco.IDS.BufferSize * 512
                If (sco.IDS.GenConfig And &H80) = &H80 Then
                    _driveType = DriveTypes.Removable
                ElseIf (sco.IDS.GenConfig And &H40) = &H40 Then
                    _driveType = DriveTypes.Fixed
                Else
                    _driveType = DriveTypes.Unknown
                End If
            End If


            CloseHandle(handle)

        End If
    End Sub

#End Region

#Region "Win32 Interop"

    <StructLayout(LayoutKind.Sequential, Size:=8)> _
    Private Class IDEREGS
        Public Features As Byte
        Public SectorCount As Byte
        Public SectorNumber As Byte
        Public CylinderLow As Byte
        Public CylinderHigh As Byte
        Public DriveHead As Byte
        Public Command As Byte
        Public Reserved As Byte
    End Class

    <StructLayout(LayoutKind.Sequential, Size:=32)> _
    Private Class SENDCMDINPARAMS

        Public BufferSize As Integer
        Public DriveRegs As IDEREGS
        Public DriveNumber As Byte
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> _
        Public Reserved() As Byte
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> _
        Public Reserved2() As Integer

        Public Sub New()
            DriveRegs = New IDEREGS
            Reserved = New Byte(2) {}
            Reserved2 = New Integer(3) {}
        End Sub

    End Class

    <StructLayout(LayoutKind.Sequential, Size:=12)> _
    Private Class DRIVERSTATUS

        Public DriveError As Byte
        Public IDEStatus As Byte
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> _
        Public Reserved() As Byte
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> _
        Public Reserved2() As Integer

        Public Sub New()
            Reserved = New Byte(1) {}
            Reserved2 = New Integer(1) {}
        End Sub

    End Class

    <StructLayout(LayoutKind.Sequential)> _
    Private Class IDSECTOR

        Public GenConfig As Short '0
        Public NumberCylinders As Short '1
        Public Reserved As Short '2
        Public NumberHeads As Short '3
        Public BytesPerTrack As Short '4
        Public BytesPerSector As Short '5
        Public SectorsPerTrack As Short '6
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> _
        Public VendorUnique() As Short '7
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=20)> _
        Public SerialNumber() As Char '10
        Public BufferClass As Short '20
        Public BufferSize As Short '21
        Public ECCSize As Short '22
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> _
        Public FirmwareRevision() As Char '23
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=40)> _
        Public ModelNumber() As Char '27
        Public MoreVendorUnique As Short '47
        Public DoubleWordIO As Short '48
        Public Capabilities As Short '49
        Public Reserved1 As Short '50
        Public PIOTiming As Short '51
        Public DMATiming As Short '52
        Public BS As Short '53
        Public NumberCurrentCyls As Short '54
        Public NumberCurrentHeads As Short '55
        Public NumberCurrentSectorsPerTrack As Short '56
        Public CurrentSectorCapacity As Integer '57
        Public MultipleSectorCapacity As Short '59
        Public MultipleSectorStuff As Short '60
        Public TotalAddressableSectors As Integer '61
        Public SingleWordDMA As Short '63
        Public MultiWordDMA As Short '64
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=382)> _
        Public Reserved2() As Byte '65

        Public Sub New()
            VendorUnique = New Short(2) {}
            Reserved2 = New Byte(381) {}
            FirmwareRevision = New Char(7) {}
            SerialNumber = New Char(19) {}
            ModelNumber = New Char(39) {}
        End Sub

    End Class

    <StructLayout(LayoutKind.Sequential)> _
    Private Class SENDCMDOUTPARAMS

        Public BufferSize As Integer
        Public Status As DRIVERSTATUS
        Public IDS As IDSECTOR

        Public Sub New()
            Status = New DRIVERSTATUS
            IDS = New IDSECTOR
        End Sub

    End Class

    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer
    Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, ByVal dwShareMode As Integer, ByVal lpSecurityAttributes As Integer, ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As Integer) As Integer

    Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Integer, ByVal dwIoControlCode As Integer, <[In](), Out()> ByVal lpInBuffer As SENDCMDINPARAMS, ByVal nInBufferSize As Integer, <[In](), Out()> ByVal lpOutBuffer As SENDCMDOUTPARAMS, ByVal nOutBufferSize As Integer, ByRef lpBytesReturned As Integer, ByVal lpOverlapped As Integer) As Integer

    Private Const CREATE_NEW As Integer = 1
    Private Const OPEN_EXISTING As Integer = 3

    Private Const GENERIC_READ As Integer = &H80000000
    Private Const GENERIC_WRITE As Integer = &H40000000

    Private Const FILE_SHARE_READ As Integer = &H1
    Private Const FILE_SHARE_WRITE As Integer = &H2

    Private Const VER_PLATFORM_WIN32_NT As Integer = 2

    Private Const DFP_RECEIVE_DRIVE_DATA As Integer = &H7C088

    Private Const INVALID_HANDLE_VALUE As Integer = -1

    ' Cylinder register defines for SMART command
    Private Const SMART_CYL_LOW = &H4F
    Private Const SMART_CYL_HI = &HC2

    ' Construction/Destruction
    Private Const DRIVE_HEAD_REG = &HA0

    ' Valid values for the bCommandReg member of IDEREGS.
    Private Const ATAPI_ID_CMD = &HA1            ' Returns ID sector for ATAPI.
    Private Const ID_CMD = &HEC                  ' Returns ID sector for ATA.
    Private Const SMART_CMD = &HB0               ' Performs SMART cmd.
    ' Requires valid bFeaturesReg,
    ' bCylLowReg, and bCylHighReg

    ' SMART Command constants
    Private Const SMART_GET_VERSION = &H74080
    Private Const SMART_SEND_DRIVE_COMMAND = &H7C084
    Private Const SMART_RCV_DRIVE_DATA = &H7C088


    Private Shared Function SwapChars(ByVal chars() As Char) As String
        For i As Integer = 0 To chars.Length - 2 Step 2
            chars.Reverse(chars, i, 2)
        Next
        Return New String(chars).Trim
    End Function

#End Region

#Region "Property"
    ReadOnly Property SerialNumber() As String
        Get
            Return _serialNumber
        End Get
    End Property

    ReadOnly Property Model() As String
        Get
            Return _model
        End Get
    End Property

    ReadOnly Property Firmware() As String
        Get
            Return _firmware
        End Get
    End Property

    ReadOnly Property NumberCylinders() As Integer
        Get
            Return _numberCylinders
        End Get
    End Property

    ReadOnly Property NumberHeads() As Integer
        Get
            Return _numberHeads
        End Get
    End Property

    ReadOnly Property SectorsPerTrack() As Integer
        Get
            Return _sectorsPerTrack
        End Get
    End Property

    ReadOnly Property BufferSize() As Integer
        Get
            Return _bufferSize
        End Get
    End Property

    ReadOnly Property DriveType() As DriveTypes
        Get
            Return _driveType
        End Get
    End Property
#End Region

End Class

Initial URL


Initial Description
You must be administrator to get Drive Serial No

Initial Title
HardDisk Serial No

Initial Tags


Initial Language
VB.NET