'注意:以下代码得到的是硬盘厂商固定的序列号,而不是硬盘的逻辑序列号
'以下代码支持Windows 95 OSR2, Windows 98, Windwos 98 SE, Windows ME 第一个硬盘必须为IDE接口
Option ExplicitPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, 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, lpOverlapped As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Type IDERegs
  bFeaturesReg     As Byte
  bSectorCountReg  As Byte
  bSectorNumberReg As Byte
  bCylLowReg       As Byte
  bCylHighReg      As Byte
  bDriveHeadReg    As Byte
  bCommandReg      As Byte
  bReserved        As Byte
End TypePrivate Type InParams
  cBufferSize  As Long
  irDriveRegs  As IDERegs
  bDriveNumber As Byte
  bReserved(0 To 19)   As Byte
End Type
Dim inbuff As InParams
Dim outbuff(0 To 528) As Byte
Dim SerialNumber As String
Function ChangeByteOrder(s As Variant, nLen As Long)
  Dim i As Long
  Dim pi As Long
  pi = 0
  
  For i = 0 To nLen / 2 - 1
    c = s(pi)
    s(pi) = s(pi + 1)
    s(pi + 1) = c
    pi = pi + 2
  NextEnd FunctionPrivate Sub Form_Load()  Dim nBytes As Long
  Dim nRet As Long
  Dim hVxD As Long  Dim BSerialNumber(0 To 19) As Byte  inbuff.cBufferSize = 512
  inbuff.bDriveNumber = 0
  inbuff.irDriveRegs.bSectorCountReg = 1
  inbuff.irDriveRegs.bSectorNumberReg = 1
  inbuff.irDriveRegs.bCylHighReg = 0
  inbuff.irDriveRegs.bCylLowReg = 0
  inbuff.irDriveRegs.bDriveHeadReg = &HA0
  inbuff.irDriveRegs.bCommandReg = &HEC
  hVxD = CreateFile("\\.\smartvsd", 0, 0, 0, 1, 0, 0)
  nRet = DeviceIoControl(hVxD, &H7C088, inbuff, Len(inbuff) - 1, outbuff(0), 528, nBytes, 0)
  If nRet > 0 Then
    CopyMemory BSerialNumber(0), outbuff(36), 20
    SerialNumber = StrConv(BSerialNumber, vbUnicode)
    SerialNumber = Trim(SerialNumber)
  End If  Call CloseHandle(hVxD)
  MsgBox SerialNumberEnd Sub

解决方案 »

  1.   

    忘了说了,第一步是:'在WIN98下,把在SYSTEM目录下smartvsd.vxd这个文件拷贝到SYSTEM\IOSUBSYS 然后重新启动,然后再运行
      

  2.   

    http://ygyuan.go.163.com/
    http://ygyuan.3322.net/有源代码.
      

  3.   

    感谢您使用微软产品。您可以参考下例中的源代码。Private Declare Function GetVolumeInformation _
       Lib "kernel32" Alias "GetVolumeInformationA" _
       (ByVal lpRootPathName As String, _
        ByVal lpszVolumeNameBuffer As String, _
        ByVal lVolumeNameSize As Long, _
        lpVolumeSerialNumber As Long, _
        lpMaximumComponentLength As Long, _
        lpFileSystemFlags As Long, _
        ByVal lpszFileSystemNameBuffer As String, _
        ByVal nFileSystemNameSize As Long) As LongPublic Function GetVolumeSerialNumber(ByVal RootPath As String) As String   Dim lpszVolumeNameBuffer        As String   Dim lpszFileSystemNameBuffer    As String   Dim lVolumeNameSize             As Long   Dim lpVolumeSerialNumber        As Long   Dim lpMaximumComponentLength    As Long   Dim lpFileSystemFlags           As Long   Dim nFileSystemNameSize         As Long   Dim lRetVal                     As Long
       lpVolumeSerialNumber = 0   lpMaximumComponentLength = 0   lpFileSystemFlags = 0
       lpszVolumeNameBuffer = Space$(255)   lpszFileSystemNameBuffer = Space(255)
       lVolumeNameSize = Len(lpszVolumeNameBuffer)   nFileSystemNameSize = Len(lpszFileSystemNameBuffer)   lRetVal = GetVolumeInformation(RootPath, _
                                     lpszVolumeNameBuffer, _
                                     lVolumeNameSize, _
                                     lpVolumeSerialNumber, _
                                     lpMaximumComponentLength, _
                                     lpFileSystemFlags, _
                                     lpszFileSystemNameBuffer, _
                                     nFileSystemNameSize)   GetVolumeSerialNumber = Hex$(lpVolumeSerialNumber)End Function
    Private Sub Command1_Click()
     Dim sRetVal As String sRetVal = GetVolumeSerialNumber("C:\") MsgBox "VolumeSerialNumber is: " & sRetValEnd Sub
    详细信息请参考:
    GetVolumeInformation
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fsys_6wfi.asp
    -  微软全球技术中心 VB技术支持
    本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款
    (http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
    为了为您创建更好的讨论环境,请参加我们的用户满意度调查
    (http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。