得到硬盘序列号 新建一个模文件,加入代码:Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As LongGlobal GethdVal As Long在form1_load事件中加入Dim Str1 As String * 256Dim Str2 As String * 256Dim Lon1 As LongDim Lon2 As LongCall GetVolumeInformation("C:\", Str1, 256, GetVal, Lon1, Lon2, Str2, 256)Text1.Text = GethdVal
不实用。看看下面的代码: -----------------------------' 功能说明:获取硬盘序列号、生产厂家/型号 ' 注意事项:支持Windows 95 OSR2, Windows 98, Windows NT, Windows 2000 ' XP没有测试,估计没问题,在Win9X下必须保证存在smartvsd.vxd ' 放在System\Iosubsys目录下,smartvsd.VXD在98第二版安装盘的 ' WIN98_62.CAB文件中 '-------------------------------------------------------------------------- '################################################################################ '窗体中的调用方法: 'Option Explicit'Private hdi As CDiskInfo'Private Sub Form_Load() 'Set hdi = New CDiskInfo 'hdi.GetDiskInfo 0 '硬盘序列号: hdi.pSerialNumber '生产厂家/型号: hdi.pModelNumber 'End Sub '################################################################################'________________________________________________________________________________Option Explicit '以下全部为名为CDiskinfo.cls的类模块 '################################ 'http://vip.6to23.com/NowCan1/tech/vb_hd_info.htm '-------------------------------------------------------------------------- ' 类模块: CDiskInfo.cls ' 功能说明:获取硬盘序列号、生产厂家/型号 ' 注意事项:支持Windows 95 OSR2, Windows 98, Windows NT, Windows 2000 ' XP没有测试,估计没问题,在Win9X下必须保证存在smartvsd.vxd ' 放在System\Iosubsys目录下,smartvsd.VXD在98第二版安装盘的 ' WIN98_62.CAB文件中 '----- Private Const MAX_IDE_DRIVES As Long = 4 Private Const READ_ATTRIBUTE_BUFFER_SIZE As Long = 512 Private Const IDENTIFY_BUFFER_SIZE As Long = 512 Private Const READ_THRESHOLD_BUFFER_SIZE As Long = 512 Private Const DFP_GET_VERSION As Long = &H74080 Private Const DFP_SEND_DRIVE_COMMAND As Long = &H7C084 Private Const DFP_RECEIVE_DRIVE_DATA As Long = &H7C088Private Type GETVERSIONOUTPARAMS bVersion As Byte bRevision As Byte bReserved As Byte bIDEDeviceMap As Byte fCapabilities As Long dwReserved(3) As Long End TypePrivate Const CAP_IDE_ID_FUNCTION As Long = 1 Private Const CAP_IDE_ATAPI_ID As Long = 2 Private Const CAP_IDE_EXECUTE_SMART_FUNCTION As Long = 4Private 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 SENDCMDINPARAMS cBufferSize As Long irDriveRegs As IDEREGS bDriveNumber As Byte bReserved(2) As Byte dwReserved(3) As Long bBuffer(0) As Byte End TypePrivate Const IDE_ATAPI_ID As Long = &HA1 Private Const IDE_ID_FUNCTION As Long = &HEC Private Const IDE_EXECUTE_SMART_FUNCTION As Long = &HB0 Private Const SMART_CYL_LOW As Long = &H4F Private Const SMART_CYL_HI As Long = &HC2Private Type DRIVERSTATUS bDriverError As Byte bIDEStatus As Byte bReserved(1) As Byte dwReserved(1) As Long End TypePrivate Const SMART_NO_ERROR As Long = 0 Private Const SMART_IDE_ERROR As Long = 1 Private Const SMART_INVALID_FLAG As Long = 2 Private Const SMART_INVALID_COMMAND As Long = 3 Private Const SMART_INVALID_BUFFER As Long = 4 Private Const SMART_INVALID_DRIVE As Long = 5 Private Const SMART_INVALID_IOCTL As Long = 6 Private Const SMART_ERROR_NO_MEM As Long = 7 Private Const SMART_INVALID_REGISTER As Long = 8 Private Const SMART_NOT_SUPPORTED As Long = 9 Private Const SMART_NO_IDE_DEVICE As Long = 10Private Type SENDCMDOUTPARAMS cBufferSize As Long drvStatus As DRIVERSTATUS bBuffer(0) As Byte End TypePrivate Const SMART_READ_ATTRIBUTE_VALUES As Long = &HD0 Private Const SMART_READ_ATTRIBUTE_THRESHOLDS As Long = &HD1 Private Const SMART_ENABLE_DISABLE_ATTRIBUTE_AUTOSAVE As Long = &HD2 Private Const SMART_SAVE_ATTRIBUTE_VALUES As Long = &HD3 Private Const SMART_EXECUTE_OFFLINE_IMMEDIATE As Long = &HD4 Private Const SMART_ENABLE_SMART_OPERATIONS As Long = &HD8 Private Const SMART_DISABLE_SMART_OPERATIONS As Long = &HD9 Private Const SMART_RETURN_SMART_STATUS As Long = &HDAPrivate Type DRIVEATTRIBUTE bAttrID As Byte wStatusFlags As Integer bAttrValue As Byte bWorstValue As Byte bRawValue(5) As Byte bReserved As Byte End TypePrivate Type ATTRTHRESHOLD bAttrID As Byte bWarrantyThreshold As Byte bReserved(9) As Byte End TypePrivate 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 wBufferSize As Integer wECCSize As Integer sFirmwareRev(7) As Byte sModelNumber(39) As Byte wMoreVendorUnique As Integer wDoubleWordIO As Integer wCapabilities As Integer wReserved1 As Integer wPIOTiming As Integer wDMATiming As Integer wBS As Integer wNumCurrentCyls As Integer wNumCurrentHeads As Integer wNumCurrentSectorsPerTrack As Integer ulCurrentSectorCapacity(3) As Byte wMultSectorStuff As Integer ulTotalAddressableSectors(3) As Byte wSingleWordDMA As Integer wMultiWordDMA As Integer bReserved(127) As Byte End TypePrivate Const ATTR_INVALID As Long = 0 Private Const ATTR_READ_ERROR_RATE As Long = 1 Private Const ATTR_THROUGHPUT_PERF As Long = 2 Private Const ATTR_SPIN_UP_TIME As Long = 3 Private Const ATTR_START_STOP_COUNT As Long = 4 Private Const ATTR_REALLOC_SECTOR_COUNT As Long = 5 Private Const ATTR_READ_CHANNEL_MARGIN As Long = 6 Private Const ATTR_SEEK_ERROR_RATE As Long = 7 Private Const ATTR_SEEK_TIME_PERF As Long = 8 Private Const ATTR_POWER_ON_HRS_COUNT As Long = 9 Private Const ATTR_SPIN_RETRY_COUNT As Long = 10 Private Const ATTR_CALIBRATION_RETRY_COUNT As Long = 11 Private Const ATTR_POWER_CYCLE_COUNT As Long = 12 Private Const PRE_FAILURE_WARRANTY As Long = &H1 Private Const ON_LINE_COLLECTION As Long = &H2 Private Const PERFORMANCE_ATTRIBUTE As Long = &H4 Private Const ERROR_RATE_ATTRIBUTE As Long = &H8 Private Const EVENT_COUNT_ATTRIBUTE As Long = &H10 Private Const SELF_PRESERVING_ATTRIBUTE As Long = &H20 Private Const NUM_ATTRIBUTE_STRUCTS As Long = 30 Private Const INVALID_HANDLE_VALUE As Long = -1 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 = 2Private Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type'===下续
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _ (lpVersionInformation As OSVERSIONINFO) As Long Private Const CREATE_NEW As Long = 1 Private Const GENERIC_READ As Long = &H80000000 Private Const GENERIC_WRITE As Long = &H40000000 Private Const FILE_SHARE_READ As Long = &H1 Private Const FILE_SHARE_WRITE As Long = &H2 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 IDSECTORPrivate Function OpenSMART(ByVal nDrive As Byte) As Long Dim hSMARTIOCTL As Long Dim hd As String Dim VersionInfo As OSVERSIONINFO hSMARTIOCTL = INVALID_HANDLE_VALUE VersionInfo.dwOSVersionInfoSize = Len(VersionInfo) GetVersionEx VersionInfo Select Case VersionInfo.dwPlatformId Case VER_PLATFORM_WIN32s OpenSMART = hSMARTIOCTL Case VER_PLATFORM_WIN32_WINDOWS 'Version Windows 95 OSR2, Windows 98 hSMARTIOCTL = CreateFile("\\.\SMARTVSD", 0, 0, 0, CREATE_NEW, 0, 0) Case VER_PLATFORM_WIN32_NT 'Windows NT, Windows 2000 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 = hSMARTIOCTLEnd FunctionPrivate 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.cBufferSize = IDENTIFY_BUFFER_SIZE pSCIP.irDriveRegs.bFeaturesReg = 0 pSCIP.irDriveRegs.bSectorCountReg = 1 pSCIP.irDriveRegs.bSectorNumberReg = 1 pSCIP.irDriveRegs.bCylLowReg = 0 pSCIP.irDriveRegs.bCylHighReg = 0 pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4) pSCIP.irDriveRegs.bCommandReg = bIDCmd pSCIP.bDriveNumber = bDriveNum pSCIP.cBufferSize = IDENTIFY_BUFFER_SIZE DoIDENTIFY = CBool(DeviceIoControl(hSMARTIOCTL, DFP_RECEIVE_DRIVE_DATA, _ pSCIP, 32, pSCOP(0), 528, lpcbBytesReturned, 0))End FunctionPrivate Function DoEnableSMART(ByVal hSMARTIOCTL As Long, _ pSCIP As SENDCMDINPARAMS, pSCOP As SENDCMDOUTPARAMS, _ ByVal bDriveNum As Byte, lpcbBytesReturned As Long) As Boolean '--------------------------------------------------------------------- pSCIP.cBufferSize = 0 pSCIP.irDriveRegs.bFeaturesReg = SMART_ENABLE_SMART_OPERATIONS pSCIP.irDriveRegs.bSectorCountReg = 1 pSCIP.irDriveRegs.bSectorNumberReg = 1 pSCIP.irDriveRegs.bCylLowReg = SMART_CYL_LOW pSCIP.irDriveRegs.bCylHighReg = SMART_CYL_HI pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4) pSCIP.irDriveRegs.bCommandReg = IDE_EXECUTE_SMART_FUNCTION pSCIP.bDriveNumber = bDriveNum DoEnableSMART = CBool(DeviceIoControl(hSMARTIOCTL, DFP_SEND_DRIVE_COMMAND, _ pSCIP, LenB(pSCIP) - 1, pSCOP, LenB(pSCOP) - 1, lpcbBytesReturned, 0))End FunctionPrivate Sub ChangeByteOrder(szString() As Byte, ByVal uscStrSize As Integer) Dim i As Integer Dim bTemp As Byte For i = 0 To uscStrSize - 1 Step 2 bTemp = szString(i) szString(i) = szString(i + 1) szString(i + 1) = bTemp Next i End SubPrivate Sub DisplayIdInfo(pids As IDSECTOR, pSCIP As SENDCMDINPARAMS, _ ByVal bIDCmd As Byte, ByVal bDfpDriveMap As Byte, ByVal bDriveNum As Byte) '-------------------------------------------------------------------------- ChangeByteOrder pids.sModelNumber, UBound(pids.sModelNumber) + 1 ChangeByteOrder pids.sFirmwareRev, UBound(pids.sFirmwareRev) + 1 ChangeByteOrder pids.sSerialNumber, UBound(pids.sSerialNumber) + 1 End Sub'调用过程 Public Function GetDiskInfo(ByVal nDrive As Byte) As Long Dim hSMARTIOCTL As Long Dim cbBytesReturned As Long Dim VersionParams As GETVERSIONOUTPARAMS Dim scip As SENDCMDINPARAMS Dim scop() As Byte Dim OutCmd As SENDCMDOUTPARAMS Dim bDfpDriveMap As Byte Dim bIDCmd As Byte 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) If Not (VersionParams.bIDEDeviceMap \ 2 ^ nDrive And &H10) Then If DoEnableSMART(hSMARTIOCTL, scip, OutCmd, nDrive, cbBytesReturned) Then bDfpDriveMap = bDfpDriveMap Or 2 ^ nDrive End If End If 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) Call DisplayIdInfo(m_DiskInfo, scip, bIDCmd, bDfpDriveMap, nDrive) CloseHandle hSMARTIOCTL GetDiskInfo = 1 Exit Function End If CloseHandle hSMARTIOCTL GetDiskInfo = 0 Else GetDiskInfo = -1 End If End Function'硬盘生产厂/型号 Public Property Get pSerialNumber() As String pSerialNumber = Trim(StrConv(m_DiskInfo.sSerialNumber, vbUnicode)) End Property'硬盘序列号 Public Property Get pModelNumber() As String pModelNumber = Trim(StrConv(m_DiskInfo.sModelNumber, vbUnicode)) End Property
谢以上各位了,测试了一下,我用以下语句调用时怎么出现提示“No physical disk 0 exist ”Private Sub Command1_Click() Dim hdi As CDiskInfo Set hdi = New CDiskInfo If (hdi.GetDiskInfo(0) = 1) Then Label1.Caption = hdi.pSerialNumber '硬盘序列号 Label2.Caption = hdi.pModelNumber '生产厂家/型号 Else MsgBox "No Physical Disk 0 exist." End If End Sub 还请大侠指教啊!
'End Sub '########################################################################### Option ExplicitPrivate Const MAX_IDE_DRIVES As Long = 4 Private Const READ_ATTRIBUTE_BUFFER_SIZE As Long = 512 Private Const IDENTIFY_BUFFER_SIZE As Long = 512 Private Const READ_THRESHOLD_BUFFER_SIZE As Long = 512 Private Const DFP_GET_VERSION As Long = &H74080 Private Const DFP_SEND_DRIVE_COMMAND As Long = &H7C084 Private Const DFP_RECEIVE_DRIVE_DATA As Long = &H7C088Private Type GETVERSIONOUTPARAMS bVersion As Byte bRevision As Byte bReserved As Byte bIDEDeviceMap As Byte fCapabilities As Long dwReserved(3) As Long End TypePrivate Const CAP_IDE_ID_FUNCTION As Long = 1 Private Const CAP_IDE_ATAPI_ID As Long = 2 Private Const CAP_IDE_EXECUTE_SMART_FUNCTION As Long = 4Private 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 SENDCMDINPARAMS cBufferSize As Long irDriveRegs As IDEREGS bDriveNumber As Byte bReserved(2) As Byte dwReserved(3) As Long bBuffer(0) As Byte End TypePrivate Const IDE_ATAPI_ID As Long = &HA1 Private Const IDE_ID_FUNCTION As Long = &HEC Private Const IDE_EXECUTE_SMART_FUNCTION As Long = &HB0 Private Const SMART_CYL_LOW As Long = &H4F Private Const SMART_CYL_HI As Long = &HC2Private Type DRIVERSTATUS bDriverError As Byte bIDEStatus As Byte bReserved(1) As Byte dwReserved(1) As Long End TypePrivate Const SMART_NO_ERROR As Long = 0 Private Const SMART_IDE_ERROR As Long = 1 Private Const SMART_INVALID_FLAG As Long = 2 Private Const SMART_INVALID_COMMAND As Long = 3 Private Const SMART_INVALID_BUFFER As Long = 4 Private Const SMART_INVALID_DRIVE As Long = 5 Private Const SMART_INVALID_IOCTL As Long = 6 Private Const SMART_ERROR_NO_MEM As Long = 7 Private Const SMART_INVALID_REGISTER As Long = 8 Private Const SMART_NOT_SUPPORTED As Long = 9 Private Const SMART_NO_IDE_DEVICE As Long = 10Private Type SENDCMDOUTPARAMS cBufferSize As Long drvStatus As DRIVERSTATUS bBuffer(0) As Byte End TypePrivate Const SMART_READ_ATTRIBUTE_VALUES As Long = &HD0 Private Const SMART_READ_ATTRIBUTE_THRESHOLDS As Long = &HD1 Private Const SMART_ENABLE_DISABLE_ATTRIBUTE_AUTOSAVE As Long = &HD2 Private Const SMART_SAVE_ATTRIBUTE_VALUES As Long = &HD3 Private Const SMART_EXECUTE_OFFLINE_IMMEDIATE As Long = &HD4 Private Const SMART_ENABLE_SMART_OPERATIONS As Long = &HD8 Private Const SMART_DISABLE_SMART_OPERATIONS As Long = &HD9 Private Const SMART_RETURN_SMART_STATUS As Long = &HDAPrivate Type DRIVEATTRIBUTE bAttrID As Byte wStatusFlags As Integer bAttrValue As Byte bWorstValue As Byte bRawValue(5) As Byte bReserved As Byte End TypePrivate Type ATTRTHRESHOLD bAttrID As Byte bWarrantyThreshold As Byte bReserved(9) As Byte End TypePrivate 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 wBufferSize As Integer wECCSize As Integer sFirmwareRev(7) As Byte sModelNumber(39) As Byte wMoreVendorUnique As Integer wDoubleWordIO As Integer wCapabilities As Integer wReserved1 As Integer wPIOTiming As Integer wDMATiming As Integer wBS As Integer wNumCurrentCyls As Integer wNumCurrentHeads As Integer wNumCurrentSectorsPerTrack As Integer ulCurrentSectorCapacity(3) As Byte wMultSectorStuff As Integer ulTotalAddressableSectors(3) As Byte wSingleWordDMA As Integer wMultiWordDMA As Integer bReserved(127) As Byte End TypePrivate Const ATTR_INVALID As Long = 0 Private Const ATTR_READ_ERROR_RATE As Long = 1 Private Const ATTR_THROUGHPUT_PERF As Long = 2 Private Const ATTR_SPIN_UP_TIME As Long = 3 Private Const ATTR_START_STOP_COUNT As Long = 4 Private Const ATTR_REALLOC_SECTOR_COUNT As Long = 5 Private Const ATTR_READ_CHANNEL_MARGIN As Long = 6 Private Const ATTR_SEEK_ERROR_RATE As Long = 7 Private Const ATTR_SEEK_TIME_PERF As Long = 8 Private Const ATTR_POWER_ON_HRS_COUNT As Long = 9 Private Const ATTR_SPIN_RETRY_COUNT As Long = 10 Private Const ATTR_CALIBRATION_RETRY_COUNT As Long = 11 Private Const ATTR_POWER_CYCLE_COUNT As Long = 12 Private Const PRE_FAILURE_WARRANTY As Long = &H1 Private Const ON_LINE_COLLECTION As Long = &H2 Private Const PERFORMANCE_ATTRIBUTE As Long = &H4 Private Const ERROR_RATE_ATTRIBUTE As Long = &H8 Private Const EVENT_COUNT_ATTRIBUTE As Long = &H10 Private Const SELF_PRESERVING_ATTRIBUTE As Long = &H20 Private Const NUM_ATTRIBUTE_STRUCTS As Long = 30 Private Const INVALID_HANDLE_VALUE As Long = -1 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 End TypePrivate Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _ (lpVersionInformation As OSVERSIONINFO) As Long Private Const CREATE_NEW As Long = 1 Private Const GENERIC_READ As Long = &H80000000 Private Const GENERIC_WRITE As Long = &H40000000 Private Const FILE_SHARE_READ As Long = &H1 Private Const FILE_SHARE_WRITE As Long = &H2 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 IDSECTORPrivate Function OpenSMART(ByVal nDrive As Byte) As Long Dim hSMARTIOCTL As Long Dim hd As String Dim VersionInfo As OSVERSIONINFO hSMARTIOCTL = INVALID_HANDLE_VALUE VersionInfo.dwOSVersionInfoSize = Len(VersionInfo) GetVersionEx VersionInfo Select Case VersionInfo.dwPlatformId Case VER_PLATFORM_WIN32s OpenSMART = hSMARTIOCTL Case VER_PLATFORM_WIN32_WINDOWS 'Windows 95 OSR2, Windows 98 hSMARTIOCTL = CreateFile("\\.\SMARTVSD", 0, 0, 0, CREATE_NEW, 0, 0) Case VER_PLATFORM_WIN32_NT 'Windows NT, Windows 2000 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 = hSMARTIOCTLEnd FunctionPrivate 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.cBufferSize = IDENTIFY_BUFFER_SIZE pSCIP.irDriveRegs.bFeaturesReg = 0 pSCIP.irDriveRegs.bSectorCountReg = 1 pSCIP.irDriveRegs.bSectorNumberReg = 1 pSCIP.irDriveRegs.bCylLowReg = 0 pSCIP.irDriveRegs.bCylHighReg = 0 pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4) pSCIP.irDriveRegs.bCommandReg = bIDCmd pSCIP.bDriveNumber = bDriveNum pSCIP.cBufferSize = IDENTIFY_BUFFER_SIZE DoIDENTIFY = CBool(DeviceIoControl(hSMARTIOCTL, DFP_RECEIVE_DRIVE_DATA, _ pSCIP, 32, pSCOP(0), 528, lpcbBytesReturned, 0))End FunctionPrivate Function DoEnableSMART(ByVal hSMARTIOCTL As Long, _ pSCIP As SENDCMDINPARAMS, pSCOP As SENDCMDOUTPARAMS, _ ByVal bDriveNum As Byte, lpcbBytesReturned As Long) As Boolean '--------------------------------------------------------------------- pSCIP.cBufferSize = 0 pSCIP.irDriveRegs.bFeaturesReg = SMART_ENABLE_SMART_OPERATIONS pSCIP.irDriveRegs.bSectorCountReg = 1 pSCIP.irDriveRegs.bSectorNumberReg = 1 pSCIP.irDriveRegs.bCylLowReg = SMART_CYL_LOW pSCIP.irDriveRegs.bCylHighReg = SMART_CYL_HI pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4) pSCIP.irDriveRegs.bCommandReg = IDE_EXECUTE_SMART_FUNCTION pSCIP.bDriveNumber = bDriveNum DoEnableSMART = CBool(DeviceIoControl(hSMARTIOCTL, DFP_SEND_DRIVE_COMMAND, _ pSCIP, LenB(pSCIP) - 1, pSCOP, LenB(pSCOP) - 1, lpcbBytesReturned, 0))End FunctionPrivate Sub ChangeByteOrder(szString() As Byte, ByVal uscStrSize As Integer) Dim i As Integer Dim bTemp As Byte For i = 0 To uscStrSize - 1 Step 2 bTemp = szString(i) szString(i) = szString(i + 1) szString(i + 1) = bTemp Next i End SubPrivate Sub DisplayIdInfo(pids As IDSECTOR, pSCIP As SENDCMDINPARAMS, _ ByVal bIDCmd As Byte, ByVal bDfpDriveMap As Byte, ByVal bDriveNum As Byte) '-------------------------------------------------------------------------- ChangeByteOrder pids.sModelNumber, UBound(pids.sModelNumber) + 1 ChangeByteOrder pids.sFirmwareRev, UBound(pids.sFirmwareRev) + 1 ChangeByteOrder pids.sSerialNumber, UBound(pids.sSerialNumber) + 1 End Sub'调用过程:GetDiskInfo 0 磁盘序列,从 0 开始 Public Function GetDiskInfo(ByVal nDrive As Byte) As Long Dim hSMARTIOCTL As Long Dim cbBytesReturned As Long Dim VersionParams As GETVERSIONOUTPARAMS Dim scip As SENDCMDINPARAMS Dim scop() As Byte Dim OutCmd As SENDCMDOUTPARAMS Dim bDfpDriveMap As Byte Dim bIDCmd As Byte 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) If Not (VersionParams.bIDEDeviceMap \ 2 ^ nDrive And &H10) Then If DoEnableSMART(hSMARTIOCTL, scip, OutCmd, nDrive, cbBytesReturned) Then bDfpDriveMap = bDfpDriveMap Or 2 ^ nDrive End If End If 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) Call DisplayIdInfo(m_DiskInfo, scip, bIDCmd, bDfpDriveMap, nDrive) CloseHandle hSMARTIOCTL GetDiskInfo = 1 Exit Function End If CloseHandle hSMARTIOCTL GetDiskInfo = 0 Else GetDiskInfo = -1 End If End Function'硬盘生产厂/型号 Public Property Get pSerialNumber() As String pSerialNumber = Trim(StrConv(m_DiskInfo.sSerialNumber, vbUnicode)) End Property'硬盘序列号 Public Property Get pModelNumber() As String pModelNumber = Trim(StrConv(m_DiskInfo.sModelNumber, vbUnicode)) End Property
用以上代码试了一下,无法得到硬盘序列号和硬盘生产厂/型号,我这样调用的:Private Sub Command1_Click() Dim hdi As CDiskInfo Set hdi = New CDiskInfo Label1.Caption = hdi.pSerialNumber '硬盘序列号 Label2.Caption = hdi.pModelNumber '生产厂家/型号 End Sub结果没有任何显示,也没出错。请高手指教。
http://vip.6to23.com/NowCan1/code/hd_info.zip
新建一个模文件,加入代码:Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As LongGlobal GethdVal As Long在form1_load事件中加入Dim Str1 As String * 256Dim Str2 As String * 256Dim Lon1 As LongDim Lon2 As LongCall GetVolumeInformation("C:\", Str1, 256, GetVal, Lon1, Lon2, Str2, 256)Text1.Text = GethdVal
不实用。看看下面的代码:
-----------------------------' 功能说明:获取硬盘序列号、生产厂家/型号
' 注意事项:支持Windows 95 OSR2, Windows 98, Windows NT, Windows 2000
' XP没有测试,估计没问题,在Win9X下必须保证存在smartvsd.vxd
' 放在System\Iosubsys目录下,smartvsd.VXD在98第二版安装盘的
' WIN98_62.CAB文件中
'--------------------------------------------------------------------------
'################################################################################
'窗体中的调用方法:
'Option Explicit'Private hdi As CDiskInfo'Private Sub Form_Load()
'Set hdi = New CDiskInfo
'hdi.GetDiskInfo 0
'硬盘序列号: hdi.pSerialNumber
'生产厂家/型号: hdi.pModelNumber
'End Sub
'################################################################################'________________________________________________________________________________Option Explicit
'以下全部为名为CDiskinfo.cls的类模块
'################################
'http://vip.6to23.com/NowCan1/tech/vb_hd_info.htm
'--------------------------------------------------------------------------
' 类模块: CDiskInfo.cls
' 功能说明:获取硬盘序列号、生产厂家/型号
' 注意事项:支持Windows 95 OSR2, Windows 98, Windows NT, Windows 2000
' XP没有测试,估计没问题,在Win9X下必须保证存在smartvsd.vxd
' 放在System\Iosubsys目录下,smartvsd.VXD在98第二版安装盘的
' WIN98_62.CAB文件中
'-----
Private Const MAX_IDE_DRIVES As Long = 4
Private Const READ_ATTRIBUTE_BUFFER_SIZE As Long = 512
Private Const IDENTIFY_BUFFER_SIZE As Long = 512
Private Const READ_THRESHOLD_BUFFER_SIZE As Long = 512
Private Const DFP_GET_VERSION As Long = &H74080
Private Const DFP_SEND_DRIVE_COMMAND As Long = &H7C084
Private Const DFP_RECEIVE_DRIVE_DATA As Long = &H7C088Private Type GETVERSIONOUTPARAMS
bVersion As Byte
bRevision As Byte
bReserved As Byte
bIDEDeviceMap As Byte
fCapabilities As Long
dwReserved(3) As Long
End TypePrivate Const CAP_IDE_ID_FUNCTION As Long = 1
Private Const CAP_IDE_ATAPI_ID As Long = 2
Private Const CAP_IDE_EXECUTE_SMART_FUNCTION As Long = 4Private 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 SENDCMDINPARAMS
cBufferSize As Long
irDriveRegs As IDEREGS
bDriveNumber As Byte
bReserved(2) As Byte
dwReserved(3) As Long
bBuffer(0) As Byte
End TypePrivate Const IDE_ATAPI_ID As Long = &HA1
Private Const IDE_ID_FUNCTION As Long = &HEC
Private Const IDE_EXECUTE_SMART_FUNCTION As Long = &HB0
Private Const SMART_CYL_LOW As Long = &H4F
Private Const SMART_CYL_HI As Long = &HC2Private Type DRIVERSTATUS
bDriverError As Byte
bIDEStatus As Byte
bReserved(1) As Byte
dwReserved(1) As Long
End TypePrivate Const SMART_NO_ERROR As Long = 0
Private Const SMART_IDE_ERROR As Long = 1
Private Const SMART_INVALID_FLAG As Long = 2
Private Const SMART_INVALID_COMMAND As Long = 3
Private Const SMART_INVALID_BUFFER As Long = 4
Private Const SMART_INVALID_DRIVE As Long = 5
Private Const SMART_INVALID_IOCTL As Long = 6
Private Const SMART_ERROR_NO_MEM As Long = 7
Private Const SMART_INVALID_REGISTER As Long = 8
Private Const SMART_NOT_SUPPORTED As Long = 9
Private Const SMART_NO_IDE_DEVICE As Long = 10Private Type SENDCMDOUTPARAMS
cBufferSize As Long
drvStatus As DRIVERSTATUS
bBuffer(0) As Byte
End TypePrivate Const SMART_READ_ATTRIBUTE_VALUES As Long = &HD0
Private Const SMART_READ_ATTRIBUTE_THRESHOLDS As Long = &HD1
Private Const SMART_ENABLE_DISABLE_ATTRIBUTE_AUTOSAVE As Long = &HD2
Private Const SMART_SAVE_ATTRIBUTE_VALUES As Long = &HD3
Private Const SMART_EXECUTE_OFFLINE_IMMEDIATE As Long = &HD4
Private Const SMART_ENABLE_SMART_OPERATIONS As Long = &HD8
Private Const SMART_DISABLE_SMART_OPERATIONS As Long = &HD9
Private Const SMART_RETURN_SMART_STATUS As Long = &HDAPrivate Type DRIVEATTRIBUTE
bAttrID As Byte
wStatusFlags As Integer
bAttrValue As Byte
bWorstValue As Byte
bRawValue(5) As Byte
bReserved As Byte
End TypePrivate Type ATTRTHRESHOLD
bAttrID As Byte
bWarrantyThreshold As Byte
bReserved(9) As Byte
End TypePrivate 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
wBufferSize As Integer
wECCSize As Integer
sFirmwareRev(7) As Byte
sModelNumber(39) As Byte
wMoreVendorUnique As Integer
wDoubleWordIO As Integer
wCapabilities As Integer
wReserved1 As Integer
wPIOTiming As Integer
wDMATiming As Integer
wBS As Integer
wNumCurrentCyls As Integer
wNumCurrentHeads As Integer
wNumCurrentSectorsPerTrack As Integer
ulCurrentSectorCapacity(3) As Byte
wMultSectorStuff As Integer
ulTotalAddressableSectors(3) As Byte
wSingleWordDMA As Integer
wMultiWordDMA As Integer
bReserved(127) As Byte
End TypePrivate Const ATTR_INVALID As Long = 0
Private Const ATTR_READ_ERROR_RATE As Long = 1
Private Const ATTR_THROUGHPUT_PERF As Long = 2
Private Const ATTR_SPIN_UP_TIME As Long = 3
Private Const ATTR_START_STOP_COUNT As Long = 4
Private Const ATTR_REALLOC_SECTOR_COUNT As Long = 5
Private Const ATTR_READ_CHANNEL_MARGIN As Long = 6
Private Const ATTR_SEEK_ERROR_RATE As Long = 7
Private Const ATTR_SEEK_TIME_PERF As Long = 8
Private Const ATTR_POWER_ON_HRS_COUNT As Long = 9
Private Const ATTR_SPIN_RETRY_COUNT As Long = 10
Private Const ATTR_CALIBRATION_RETRY_COUNT As Long = 11
Private Const ATTR_POWER_CYCLE_COUNT As Long = 12
Private Const PRE_FAILURE_WARRANTY As Long = &H1
Private Const ON_LINE_COLLECTION As Long = &H2
Private Const PERFORMANCE_ATTRIBUTE As Long = &H4
Private Const ERROR_RATE_ATTRIBUTE As Long = &H8
Private Const EVENT_COUNT_ATTRIBUTE As Long = &H10
Private Const SELF_PRESERVING_ATTRIBUTE As Long = &H20
Private Const NUM_ATTRIBUTE_STRUCTS As Long = 30
Private Const INVALID_HANDLE_VALUE As Long = -1
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 = 2Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type'===下续
(lpVersionInformation As OSVERSIONINFO) As Long
Private Const CREATE_NEW As Long = 1
Private Const GENERIC_READ As Long = &H80000000
Private Const GENERIC_WRITE As Long = &H40000000
Private Const FILE_SHARE_READ As Long = &H1
Private Const FILE_SHARE_WRITE As Long = &H2
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 IDSECTORPrivate Function OpenSMART(ByVal nDrive As Byte) As Long Dim hSMARTIOCTL As Long
Dim hd As String
Dim VersionInfo As OSVERSIONINFO hSMARTIOCTL = INVALID_HANDLE_VALUE
VersionInfo.dwOSVersionInfoSize = Len(VersionInfo)
GetVersionEx VersionInfo
Select Case VersionInfo.dwPlatformId
Case VER_PLATFORM_WIN32s
OpenSMART = hSMARTIOCTL
Case VER_PLATFORM_WIN32_WINDOWS
'Version Windows 95 OSR2, Windows 98
hSMARTIOCTL = CreateFile("\\.\SMARTVSD", 0, 0, 0, CREATE_NEW, 0, 0)
Case VER_PLATFORM_WIN32_NT
'Windows NT, Windows 2000
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 = hSMARTIOCTLEnd FunctionPrivate 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.cBufferSize = IDENTIFY_BUFFER_SIZE pSCIP.irDriveRegs.bFeaturesReg = 0
pSCIP.irDriveRegs.bSectorCountReg = 1
pSCIP.irDriveRegs.bSectorNumberReg = 1
pSCIP.irDriveRegs.bCylLowReg = 0
pSCIP.irDriveRegs.bCylHighReg = 0 pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4) pSCIP.irDriveRegs.bCommandReg = bIDCmd
pSCIP.bDriveNumber = bDriveNum
pSCIP.cBufferSize = IDENTIFY_BUFFER_SIZE
DoIDENTIFY = CBool(DeviceIoControl(hSMARTIOCTL, DFP_RECEIVE_DRIVE_DATA, _
pSCIP, 32, pSCOP(0), 528, lpcbBytesReturned, 0))End FunctionPrivate Function DoEnableSMART(ByVal hSMARTIOCTL As Long, _
pSCIP As SENDCMDINPARAMS, pSCOP As SENDCMDOUTPARAMS, _
ByVal bDriveNum As Byte, lpcbBytesReturned As Long) As Boolean
'---------------------------------------------------------------------
pSCIP.cBufferSize = 0
pSCIP.irDriveRegs.bFeaturesReg = SMART_ENABLE_SMART_OPERATIONS
pSCIP.irDriveRegs.bSectorCountReg = 1
pSCIP.irDriveRegs.bSectorNumberReg = 1
pSCIP.irDriveRegs.bCylLowReg = SMART_CYL_LOW
pSCIP.irDriveRegs.bCylHighReg = SMART_CYL_HI
pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4)
pSCIP.irDriveRegs.bCommandReg = IDE_EXECUTE_SMART_FUNCTION
pSCIP.bDriveNumber = bDriveNum DoEnableSMART = CBool(DeviceIoControl(hSMARTIOCTL, DFP_SEND_DRIVE_COMMAND, _
pSCIP, LenB(pSCIP) - 1, pSCOP, LenB(pSCOP) - 1, lpcbBytesReturned, 0))End FunctionPrivate Sub ChangeByteOrder(szString() As Byte, ByVal uscStrSize As Integer)
Dim i As Integer
Dim bTemp As Byte For i = 0 To uscStrSize - 1 Step 2
bTemp = szString(i)
szString(i) = szString(i + 1)
szString(i + 1) = bTemp
Next i
End SubPrivate Sub DisplayIdInfo(pids As IDSECTOR, pSCIP As SENDCMDINPARAMS, _
ByVal bIDCmd As Byte, ByVal bDfpDriveMap As Byte, ByVal bDriveNum As Byte)
'--------------------------------------------------------------------------
ChangeByteOrder pids.sModelNumber, UBound(pids.sModelNumber) + 1
ChangeByteOrder pids.sFirmwareRev, UBound(pids.sFirmwareRev) + 1
ChangeByteOrder pids.sSerialNumber, UBound(pids.sSerialNumber) + 1
End Sub'调用过程
Public Function GetDiskInfo(ByVal nDrive As Byte) As Long
Dim hSMARTIOCTL As Long
Dim cbBytesReturned As Long
Dim VersionParams As GETVERSIONOUTPARAMS
Dim scip As SENDCMDINPARAMS
Dim scop() As Byte
Dim OutCmd As SENDCMDOUTPARAMS
Dim bDfpDriveMap As Byte
Dim bIDCmd As Byte
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) If Not (VersionParams.bIDEDeviceMap \ 2 ^ nDrive And &H10) Then
If DoEnableSMART(hSMARTIOCTL, scip, OutCmd, nDrive, cbBytesReturned) Then
bDfpDriveMap = bDfpDriveMap Or 2 ^ nDrive
End If
End If
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)
Call DisplayIdInfo(m_DiskInfo, scip, bIDCmd, bDfpDriveMap, nDrive)
CloseHandle hSMARTIOCTL
GetDiskInfo = 1
Exit Function
End If
CloseHandle hSMARTIOCTL
GetDiskInfo = 0
Else
GetDiskInfo = -1
End If
End Function'硬盘生产厂/型号
Public Property Get pSerialNumber() As String
pSerialNumber = Trim(StrConv(m_DiskInfo.sSerialNumber, vbUnicode))
End Property'硬盘序列号
Public Property Get pModelNumber() As String
pModelNumber = Trim(StrConv(m_DiskInfo.sModelNumber, vbUnicode))
End Property
Dim hdi As CDiskInfo
Set hdi = New CDiskInfo
If (hdi.GetDiskInfo(0) = 1) Then
Label1.Caption = hdi.pSerialNumber '硬盘序列号
Label2.Caption = hdi.pModelNumber '生产厂家/型号
Else
MsgBox "No Physical Disk 0 exist."
End If
End Sub
还请大侠指教啊!
到这儿看看:http://www.csdn.net/cnshare/soft/9/9091.shtm
' 类模块: CDiskInfo.cls (注:类模块名字绝对,不能更换)
' 功能说明:获取硬盘序列号、生产厂家/型号
' 支持Windows 95 OSR2, Windows 98, Windows NT, Windows 2000
' 在Win9X下必须保证 System\Iosubsys目录下存在 smartvsd.vxd
' smartvsd.VXD在98第二版安装盘的 WIN98_62.CAB文件中
' 根据VC源码:从 Ring 3 获取 Ring 0 特权,读取硬盘序列号的代码整理
' 原作:BARDO'
'--------------------------------------------------------------------------
'##########################################################################
'调用方法:'Private Sub Form_Load()
'Dim hdi As CDiskInfo
'Set hdi = New CDiskInfo
'hdi.GetDiskInfo 0
'--------------------------------------
'返回:
'硬盘序列号: hdi.pSerialNumber
'生产厂家/型号: hdi.pModelNumber
'--------------------------------------
'End Sub
'###########################################################################
Option ExplicitPrivate Const MAX_IDE_DRIVES As Long = 4
Private Const READ_ATTRIBUTE_BUFFER_SIZE As Long = 512
Private Const IDENTIFY_BUFFER_SIZE As Long = 512
Private Const READ_THRESHOLD_BUFFER_SIZE As Long = 512
Private Const DFP_GET_VERSION As Long = &H74080
Private Const DFP_SEND_DRIVE_COMMAND As Long = &H7C084
Private Const DFP_RECEIVE_DRIVE_DATA As Long = &H7C088Private Type GETVERSIONOUTPARAMS
bVersion As Byte
bRevision As Byte
bReserved As Byte
bIDEDeviceMap As Byte
fCapabilities As Long
dwReserved(3) As Long
End TypePrivate Const CAP_IDE_ID_FUNCTION As Long = 1
Private Const CAP_IDE_ATAPI_ID As Long = 2
Private Const CAP_IDE_EXECUTE_SMART_FUNCTION As Long = 4Private 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 SENDCMDINPARAMS
cBufferSize As Long
irDriveRegs As IDEREGS
bDriveNumber As Byte
bReserved(2) As Byte
dwReserved(3) As Long
bBuffer(0) As Byte
End TypePrivate Const IDE_ATAPI_ID As Long = &HA1
Private Const IDE_ID_FUNCTION As Long = &HEC
Private Const IDE_EXECUTE_SMART_FUNCTION As Long = &HB0
Private Const SMART_CYL_LOW As Long = &H4F
Private Const SMART_CYL_HI As Long = &HC2Private Type DRIVERSTATUS
bDriverError As Byte
bIDEStatus As Byte
bReserved(1) As Byte
dwReserved(1) As Long
End TypePrivate Const SMART_NO_ERROR As Long = 0
Private Const SMART_IDE_ERROR As Long = 1
Private Const SMART_INVALID_FLAG As Long = 2
Private Const SMART_INVALID_COMMAND As Long = 3
Private Const SMART_INVALID_BUFFER As Long = 4
Private Const SMART_INVALID_DRIVE As Long = 5
Private Const SMART_INVALID_IOCTL As Long = 6
Private Const SMART_ERROR_NO_MEM As Long = 7
Private Const SMART_INVALID_REGISTER As Long = 8
Private Const SMART_NOT_SUPPORTED As Long = 9
Private Const SMART_NO_IDE_DEVICE As Long = 10Private Type SENDCMDOUTPARAMS
cBufferSize As Long
drvStatus As DRIVERSTATUS
bBuffer(0) As Byte
End TypePrivate Const SMART_READ_ATTRIBUTE_VALUES As Long = &HD0
Private Const SMART_READ_ATTRIBUTE_THRESHOLDS As Long = &HD1
Private Const SMART_ENABLE_DISABLE_ATTRIBUTE_AUTOSAVE As Long = &HD2
Private Const SMART_SAVE_ATTRIBUTE_VALUES As Long = &HD3
Private Const SMART_EXECUTE_OFFLINE_IMMEDIATE As Long = &HD4
Private Const SMART_ENABLE_SMART_OPERATIONS As Long = &HD8
Private Const SMART_DISABLE_SMART_OPERATIONS As Long = &HD9
Private Const SMART_RETURN_SMART_STATUS As Long = &HDAPrivate Type DRIVEATTRIBUTE
bAttrID As Byte
wStatusFlags As Integer
bAttrValue As Byte
bWorstValue As Byte
bRawValue(5) As Byte
bReserved As Byte
End TypePrivate Type ATTRTHRESHOLD
bAttrID As Byte
bWarrantyThreshold As Byte
bReserved(9) As Byte
End TypePrivate 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
wBufferSize As Integer
wECCSize As Integer
sFirmwareRev(7) As Byte
sModelNumber(39) As Byte
wMoreVendorUnique As Integer
wDoubleWordIO As Integer
wCapabilities As Integer
wReserved1 As Integer
wPIOTiming As Integer
wDMATiming As Integer
wBS As Integer
wNumCurrentCyls As Integer
wNumCurrentHeads As Integer
wNumCurrentSectorsPerTrack As Integer
ulCurrentSectorCapacity(3) As Byte
wMultSectorStuff As Integer
ulTotalAddressableSectors(3) As Byte
wSingleWordDMA As Integer
wMultiWordDMA As Integer
bReserved(127) As Byte
End TypePrivate Const ATTR_INVALID As Long = 0
Private Const ATTR_READ_ERROR_RATE As Long = 1
Private Const ATTR_THROUGHPUT_PERF As Long = 2
Private Const ATTR_SPIN_UP_TIME As Long = 3
Private Const ATTR_START_STOP_COUNT As Long = 4
Private Const ATTR_REALLOC_SECTOR_COUNT As Long = 5
Private Const ATTR_READ_CHANNEL_MARGIN As Long = 6
Private Const ATTR_SEEK_ERROR_RATE As Long = 7
Private Const ATTR_SEEK_TIME_PERF As Long = 8
Private Const ATTR_POWER_ON_HRS_COUNT As Long = 9
Private Const ATTR_SPIN_RETRY_COUNT As Long = 10
Private Const ATTR_CALIBRATION_RETRY_COUNT As Long = 11
Private Const ATTR_POWER_CYCLE_COUNT As Long = 12
Private Const PRE_FAILURE_WARRANTY As Long = &H1
Private Const ON_LINE_COLLECTION As Long = &H2
Private Const PERFORMANCE_ATTRIBUTE As Long = &H4
Private Const ERROR_RATE_ATTRIBUTE As Long = &H8
Private Const EVENT_COUNT_ATTRIBUTE As Long = &H10
Private Const SELF_PRESERVING_ATTRIBUTE As Long = &H20
Private Const NUM_ATTRIBUTE_STRUCTS As Long = 30
Private Const INVALID_HANDLE_VALUE As Long = -1
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
End TypePrivate Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
(lpVersionInformation As OSVERSIONINFO) As Long
Private Const CREATE_NEW As Long = 1
Private Const GENERIC_READ As Long = &H80000000
Private Const GENERIC_WRITE As Long = &H40000000
Private Const FILE_SHARE_READ As Long = &H1
Private Const FILE_SHARE_WRITE As Long = &H2
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 IDSECTORPrivate Function OpenSMART(ByVal nDrive As Byte) As Long Dim hSMARTIOCTL As Long
Dim hd As String
Dim VersionInfo As OSVERSIONINFO hSMARTIOCTL = INVALID_HANDLE_VALUE
VersionInfo.dwOSVersionInfoSize = Len(VersionInfo)
GetVersionEx VersionInfo
Select Case VersionInfo.dwPlatformId
Case VER_PLATFORM_WIN32s
OpenSMART = hSMARTIOCTL
Case VER_PLATFORM_WIN32_WINDOWS
'Windows 95 OSR2, Windows 98
hSMARTIOCTL = CreateFile("\\.\SMARTVSD", 0, 0, 0, CREATE_NEW, 0, 0)
Case VER_PLATFORM_WIN32_NT
'Windows NT, Windows 2000
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 = hSMARTIOCTLEnd FunctionPrivate 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.cBufferSize = IDENTIFY_BUFFER_SIZE pSCIP.irDriveRegs.bFeaturesReg = 0
pSCIP.irDriveRegs.bSectorCountReg = 1
pSCIP.irDriveRegs.bSectorNumberReg = 1
pSCIP.irDriveRegs.bCylLowReg = 0
pSCIP.irDriveRegs.bCylHighReg = 0 pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4) pSCIP.irDriveRegs.bCommandReg = bIDCmd
pSCIP.bDriveNumber = bDriveNum
pSCIP.cBufferSize = IDENTIFY_BUFFER_SIZE
DoIDENTIFY = CBool(DeviceIoControl(hSMARTIOCTL, DFP_RECEIVE_DRIVE_DATA, _
pSCIP, 32, pSCOP(0), 528, lpcbBytesReturned, 0))End FunctionPrivate Function DoEnableSMART(ByVal hSMARTIOCTL As Long, _
pSCIP As SENDCMDINPARAMS, pSCOP As SENDCMDOUTPARAMS, _
ByVal bDriveNum As Byte, lpcbBytesReturned As Long) As Boolean
'---------------------------------------------------------------------
pSCIP.cBufferSize = 0
pSCIP.irDriveRegs.bFeaturesReg = SMART_ENABLE_SMART_OPERATIONS
pSCIP.irDriveRegs.bSectorCountReg = 1
pSCIP.irDriveRegs.bSectorNumberReg = 1
pSCIP.irDriveRegs.bCylLowReg = SMART_CYL_LOW
pSCIP.irDriveRegs.bCylHighReg = SMART_CYL_HI
pSCIP.irDriveRegs.bDriveHeadReg = &HA0 Or ((bDriveNum And 1) * 2 ^ 4)
pSCIP.irDriveRegs.bCommandReg = IDE_EXECUTE_SMART_FUNCTION
pSCIP.bDriveNumber = bDriveNum DoEnableSMART = CBool(DeviceIoControl(hSMARTIOCTL, DFP_SEND_DRIVE_COMMAND, _
pSCIP, LenB(pSCIP) - 1, pSCOP, LenB(pSCOP) - 1, lpcbBytesReturned, 0))End FunctionPrivate Sub ChangeByteOrder(szString() As Byte, ByVal uscStrSize As Integer)
Dim i As Integer
Dim bTemp As Byte For i = 0 To uscStrSize - 1 Step 2
bTemp = szString(i)
szString(i) = szString(i + 1)
szString(i + 1) = bTemp
Next i
End SubPrivate Sub DisplayIdInfo(pids As IDSECTOR, pSCIP As SENDCMDINPARAMS, _
ByVal bIDCmd As Byte, ByVal bDfpDriveMap As Byte, ByVal bDriveNum As Byte)
'--------------------------------------------------------------------------
ChangeByteOrder pids.sModelNumber, UBound(pids.sModelNumber) + 1
ChangeByteOrder pids.sFirmwareRev, UBound(pids.sFirmwareRev) + 1
ChangeByteOrder pids.sSerialNumber, UBound(pids.sSerialNumber) + 1
End Sub'调用过程:GetDiskInfo 0 磁盘序列,从 0 开始
Public Function GetDiskInfo(ByVal nDrive As Byte) As Long
Dim hSMARTIOCTL As Long
Dim cbBytesReturned As Long
Dim VersionParams As GETVERSIONOUTPARAMS
Dim scip As SENDCMDINPARAMS
Dim scop() As Byte
Dim OutCmd As SENDCMDOUTPARAMS
Dim bDfpDriveMap As Byte
Dim bIDCmd As Byte
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) If Not (VersionParams.bIDEDeviceMap \ 2 ^ nDrive And &H10) Then
If DoEnableSMART(hSMARTIOCTL, scip, OutCmd, nDrive, cbBytesReturned) Then
bDfpDriveMap = bDfpDriveMap Or 2 ^ nDrive
End If
End If
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)
Call DisplayIdInfo(m_DiskInfo, scip, bIDCmd, bDfpDriveMap, nDrive)
CloseHandle hSMARTIOCTL
GetDiskInfo = 1
Exit Function
End If
CloseHandle hSMARTIOCTL
GetDiskInfo = 0
Else
GetDiskInfo = -1
End If
End Function'硬盘生产厂/型号
Public Property Get pSerialNumber() As String
pSerialNumber = Trim(StrConv(m_DiskInfo.sSerialNumber, vbUnicode))
End Property'硬盘序列号
Public Property Get pModelNumber() As String
pModelNumber = Trim(StrConv(m_DiskInfo.sModelNumber, vbUnicode))
End Property
Dim hdi As CDiskInfo
Set hdi = New CDiskInfo
Label1.Caption = hdi.pSerialNumber '硬盘序列号
Label2.Caption = hdi.pModelNumber '生产厂家/型号
End Sub结果没有任何显示,也没出错。请高手指教。