惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
小众软件
小众软件
V
V2EX
博客园 - Franky
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
量子位
博客园 - 【当耐特】
雷峰网
雷峰网
WordPress大学
WordPress大学
Jina AI
Jina AI
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
Visual Studio Blog
Microsoft Security Blog
Microsoft Security Blog

博客园 - 水如烟(LzmTW)

.NET的变量在代码集中是不安全的 一个创建快捷方式类 一个简单的CodeAccessPermission生成器 认识一下Attribute HOW TO:端口打印(比较粗糙) 标记法定义和创建数据库(四) 标记法定义和创建数据库 Sql2005数据类型与Framework类型的对应关系 HOW TO:重启程序(WinForm) HOW TO:设置默认打印机 HOW TO:避免“将COM对象与其基础RCW分开后不能再使用该对象”错误 HOW TO:控制是否允许用户退出ExcelApplication的Workbook 树和自联表(五) 树和自联表(六) 树和自联表(四) 树和自联表(一) 行政区划数据数据库的设计(脚本) 行政区划数据数据库的设计(七) 行政区划数据数据库的设计(六)
HOW TO:获取硬盘物理序列号(VB.NET)
水如烟(LzmTW) · 2007-02-12 · via 博客园 - 水如烟(LzmTW)

Author水如烟 

参考了一个C#的,原出处不知在哪了.

Public Class PhysicalDriveDemo
    
Public Shared Sub Run()
        Console.WriteLine(PhysicalDrive.GetSerialNumber(
0))
    
End Sub
End Class

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServicesPublic Class PhysicalDrive'<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
    '  Friend Structure IDSECTOR
    '    Public wGenConfig As Int16
    '    Public wNumCyls As Int16
    '    Public wReserved As Int16
    '    Public wNumHeads As Int16
    '    Public wBytesPerTrack As Int16
    '    Public wBytesPerSector As Int16
    '    Public wSectorsPerTrack As Int16
    '    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> _
    '     Public wVendorUnique() As Int16
    '    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=20)> _
    '    Public sSerialNumber As String
    '    Public wBufferType As Int16
    '    Public wBufferSize As Int16
    '    Public wECCSize As Int16
    '    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=8)> _
    '     Public sFirmwareRev As String
    '    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=40)> _
    '    Public sModelNumber As String
    '    Public wMoreVendorUnique As Int16
    '    Public wDoubleWordIO As Int16
    '    Public wCapabilities As Int16
    '    Public wReserved1 As Int16
    '    Public wPIOTiming As Int16
    '    Public wDMATiming As Int16
    '    Public wBS As Int16
    '    Public wNumCurrentCyls As Int16
    '    Public wNumCurrentHeads As Int16
    '    Public wNumCurrentSectorsPerTrack As Int16
    '    Public ulCurrentSectorCapacity As Int32
    '    Public wMultSectorStuff As Int16
    '    Public ulTotalAddressableSectors As Int32
    '    Public wSingleWordDMA As Int16
    '    Public wMultiWordDMA As Int16
    '    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=128)> _
    '    Public bReserved() As Byte
    'End Structure

    
<StructLayout(LayoutKind.Sequential)> _
      
Friend Structure DRIVERSTATUS
        
Public bDriverError As Byte
        
Public bIDEStatus As Byte
        
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> _
     
Public bReserved() As Byte
        
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> _
        
Public dwReserved() As Int32
    
End Structure<StructLayout(LayoutKind.Sequential)> _
      
Friend Structure SENDCMDOUTPARAMS
        
Public cBufferSize As Int32
        
Public DriverStatus As DRIVERSTATUS
        
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=513)> _
        
Public bBuffer() As Byte
    
End Structure'<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
    '  Friend Structure SRB_IO_CONTROL
    '    Public HeaderLength As Int32
    '    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=8)> _
    '    Public Signature As String
    '    Public Timeout As Int32
    '    Public ControlCode As Int32
    '    Public ReturnCode As Int32
    '    Public Length As Int32
    'End Structure

    
<StructLayout(LayoutKind.Sequential)> _
      
Friend Structure IDEREGS
        
Public bFeaturesReg As Byte
        
Public bSectorCountReg As Byte
        
Public bSectorNumberReg As Byte
        
Public bCylLowReg As Byte
        
Public bCylHighReg As Byte
        
Public bDriveHeadReg As Byte
        
Public bCommandReg As Byte
        
Public bReserved As Byte
    
End Structure<StructLayout(LayoutKind.Sequential)> _
      
Friend Structure SENDCMDINPARAMS
        
Public cBufferSize As Int32
        
Public irDriveRegs As IDEREGS
        
Public bDriveNumber As Byte
        
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> _
        
Public bReserved() As Byte
        
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> _
        
Public dwReserved() As Int32
        
Public bBuffer As Byte
    
End Structure<StructLayout(LayoutKind.Sequential)> _
      
Friend Structure GETVERSIONOUTPARAMS
        
Public bVersion As Byte
        
Public bRevision As Byte
        
Public bReserved As Byte
        
Public bIDEDeviceMap As Byte
        
Public fCapabilities As Int32
        
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> _
        
Public dwReserved() As Int32
    
End Structure<DllImport("kernel32.dll", SetLastError:=True)> _
    
Private Shared Function CloseHandle( _
        
ByVal hObject As Int32 _
    ) 
As Integer
    
End Function<DllImport("kernel32.dll")> _
    
Private Overloads Shared Function DeviceIoControl( _
        
ByVal hDevice As Int32, _
        
ByVal dwIoControlCode As Int32, _
        
ByRef lpInBuffer As SENDCMDINPARAMS, _
        
ByVal nInBufferSize As Integer, _
        
ByRef lpOutBuffer As SENDCMDOUTPARAMS, _
        
ByVal nOutBufferSize As Integer, _
        
ByRef lpbytesReturned As Int32, _
        
ByVal lpOverlapped As Integer _
    ) 
As Integer
    
End Function<DllImport("kernel32.dll")> _
    
Private Overloads Shared Function DeviceIoControl( _
        
ByVal hDevice As Int32, _
        
ByVal dwIoControlCode As Int32, _
        
ByVal lpInBuffer As Integer, _
        
ByVal nInBufferSize As Integer, _
        
ByRef lpOutBuffer As GETVERSIONOUTPARAMS, _
        
ByVal nOutBufferSize As Integer, _
        
ByRef lpbytesReturned As Int32, _
        
ByVal lpOverlapped As Integer _
    ) 
As Integer
    
End Function<DllImport("kernel32.dll")> _
    
Private Shared Function CreateFile( _
        
ByVal lpFileName As String, _
        
ByVal dwDesiredAccess As Int32, _
        
ByVal dwShareMode As Int32, _
        
ByVal lpSecurityAttributes As Integer, _
        
ByVal dwCreationDisposition As Int32, _
        
ByVal dwFlagsAndAttributes As Int32, _
        
ByVal hTemplateFile As Integer _
    ) 
As Int32
    
End FunctionPrivate Const GENERIC_READ As Int32 = &H80000000
    
Private Const GENERIC_WRITE As Int32 = &H40000000
    
Private Const FILE_SHARE_READ As Int32 = &H1
    
Private Const FILE_SHARE_WRITE As Int32 = &H2
    
Private Const OPEN_EXISTING As Int32 = 3
    
Private Const INVALID_HANDLE_VALUE As Int32 = &HFFFFFFFF
    
Private Const DFP_GET_VERSION As Int32 = &H74080
    
Private Const IDE_ATAPI_IDENTIFY As Integer = &HA1
    
Private Const IDE_ATA_IDENTIFY As Integer = &HEC
    
Private Const IDENTIFY_BUFFER_SIZE As Integer = 512
    
Private Const DFP_RECEIVE_DRIVE_DATA As Int32 = &H7C088''' <summary>
    ''' 获取物理序列号
    ''' </summary>
    ''' <param name="id">系统硬盘序号,0-255</param>
    Public Shared Function GetSerialNumber(ByVal id As ByteAs String
        
Dim os As OperatingSystem = Environment.OSVersion
        
If os.Platform <> PlatformID.Win32NT Then
            
Throw New NotSupportedException("仅支持2000/XP/2003")
        
End If
        
If os.Version.Major < 5 Then
            
Throw New NotSupportedException("仅支持2000/XP/2003")
        
End IfReturn Read(id)
    
End FunctionPrivate Shared Function Read(ByVal drive As ByteAs StringDim driveName As String = String.Concat("\\.\PhysicalDrive", drive.ToString())
        
Dim device As Int32 = CreateFile( _
            driveName, _
            GENERIC_READ 
Or GENERIC_WRITE, _
            FILE_SHARE_READ 
Or FILE_SHARE_WRITE, _
            
0, _
            OPEN_EXISTING, _
            
0, _
            
0)If device = INVALID_HANDLE_VALUE Then
            
Return ""
        
End IfDim verPara As New GETVERSIONOUTPARAMS()
        
Dim bytRv As Int32 = 0If DeviceIoControl( _
            device, _
            DFP_GET_VERSION, _
            
0, _
            
0, _
            verPara, _
            Marshal.SizeOf(verPara), _
            bytRv, _
            
0 _
        ) 
<> 0 ThenIf verPara.bIDEDeviceMap > 0 Then
                
Dim bIDCmd As Byte = CByte(IIf((verPara.bIDEDeviceMap >> drive And &H10) <> 0, IDE_ATAPI_IDENTIFY, IDE_ATA_IDENTIFY))Dim scip As New SENDCMDINPARAMS()
                
Dim scop As New SENDCMDOUTPARAMS()With scip
                    .cBufferSize 
= IDENTIFY_BUFFER_SIZE
                    .bDriveNumber 
= drive
                    
With .irDriveRegs
                        .bFeaturesReg 
= 0
                        .bSectorCountReg 
= 1
                        .bCylLowReg 
= 0
                        .bCylHighReg 
= 0
                        .bDriveHeadReg 
= CByte((&HA0 Or ((drive And 1<< 4)))
                        .bCommandReg 
= bIDCmd
                    
End With
                
End WithIf DeviceIoControl(device, DFP_RECEIVE_DRIVE_DATA, scip, Marshal.SizeOf(scip), scop, Marshal.SizeOf(scop), bytRv, 0<> 0 Then
                    
Dim s As New StringBuilder()
                    
Dim i As Integer
                    
For i = 20 To 40 - 2 Step 2
                        s.Append(
ChrW(scop.bBuffer((i + 1))))
                        s.Append(
ChrW(scop.bBuffer(i)))
                    
Next i

                    CloseHandle(device)

Return s.ToString().Trim()
                
End If
            
End If
        
End If

        CloseHandle(device)

Return ""
    
End FunctionEnd Class

其它信息,可以参考:

Disk Serial Number'—Using the WMI Scripting Library