读硬盘序列号的源代码 private Const MAX_FILENAME_LEN = 256 Private Declare Function GetVolumeInformation& Lib "kernel32" Alias "GetVolumeInformationA" _ (ByVal lpRootPathName As String, ByVal pVolumeNameBuffer As String, _ ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, _ lpMaximumComponentLength As Long, lpFileSystemFlags As Long, _ ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long)Private Function GetSerialNumber(sDrive As String) As Long Dim ser As Long Dim s As String * MAX_FILENAME_LEN Dim s2 As String * MAX_FILENAME_LEN Dim i As Long Dim j As Long
Call GetVolumeInformation(sDrive + ":\" & Chr$(0), s, MAX_FILENAME_LEN, ser, i, j, s2, MAX_FILENAME_LEN) GetSerialNumber = ser End Function
磁盘序列号在每次软盘或硬盘格式化后都重新生成,并且不回重复。许多程序员用此加密。其实也可以修改该函数,可以得到磁盘卷标和文件系统类型信息。声明: Private Declare Function GetVolumeInformation Lib "kernel32.dll" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Integer, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long代码:Function GetSerialNumber(sRoot As String) As Long Dim lSerialNum As Long Dim R As Long Dim sTemp1 As String, sTemp2 As String strLabel = String$(255, Chr$(0)) ' 磁盘卷标 strType = String$(255, Chr$(0)) ' 文件系统类型 一般为 FAT R = GetVolumeInformation(sRoot, strLabel, Len(strLabel), lSerialNum, 0, 0, strType, Len(strType)) GetSerialNumber = lSerialNum '在 strLabel 中为 磁盘卷标 '在 strType 中为 文件系统类型 End Function用法:当驱动器不存在时,函数返回 0。如果是个非根目录,也将返回 0:lSerial = GetSerialNumber("c:\")
这个程序一定是对的;须注意的是如果返回的是逻辑驱动器则是Volume <br /> <br />
'even this will bring up same result: <br />
'you will get two different serail number for the two drives. <br />
'It seems as if logical drives get their own serial number... <br />
Private 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 Long <br />
MsgBox "The Volume name of C:\ is '" + VName + "', the File system name of C:\ is '" + FSName + "' and the serial number of C:\ is '" + Trim(Str$(Serial)) + "'", vbInformation + vbOKOnly, App.Title <br />
End Sub <br />
磁盘序列号用来加密,每次格式化后生成,而且绝不重复.在vb中我是这样获取它的: <br />
在窗体上放一个label放一个command <br />
然后粘上这一段代码,就可以获得d:盘的序列号: <br />
Private Declare Function GetVolumeInformation Lib "kernel32.dll" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Integer, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long <br />
<br />
<br />
Function GetSerialNumber(sRoot As String) As Long <br />
象这样的东西还是做成一个类模块吧! <br />'Call Module : CSystem <br />Option Explicit <br /> <br />Private Type SYSTEM_INFO <br /> wProcessorArchitecture As Integer <br /> wReserved As Integer <br /> dwPageSize As Long <br /> lpMinimumApplicationAddress As Long <br /> lpMaximumApplicationAddress As Long <br /> dwActiveProcessorMask As Long <br /> dwNumberOfProcessors As Long <br /> dwProcessorType As Long <br /> dwAllocationGranularity As Long <br /> wProcessorLevel As Integer <br /> wProcessorRevision As Integer <br />End Type <br /> <br />Private Declare Sub GetSystemInfo Lib "KERNEL32" (lpSystemInfo As SYSTEM_INFO) <br /> <br />Private iWinMajor As Integer <br />Private iWinMinor As Integer <br />Private sMode As String <br />Private sys As SYSTEM_INFO <br /> <br />Private Sub Class_Initialize() <br /> Dim dw As Long, c As Integer <br /> dw = GetVersion() <br /> iWinMajor = dw And &HFF& <br /> iWinMinor = (dw And &HFF00&) / &H100& <br /> sMode = IIf(dw And &H80000000, "Windows 95", "Windows NT") <br /> GetSystemInfo sys <br />End Sub <br /> <br />Property Get FreePhysicalMemory() As Long <br /> Dim mem As MEMORYSTATUS <br /> mem.dwLength = Len(mem) <br /> GlobalMemoryStatus mem <br /> FreePhysicalMemory = mem.dwAvailPhys \ 1024 <br />End Property <br /> <br />Property Get TotalPhysicalMemory() As Long <br /> Dim mem As MEMORYSTATUS <br /> mem.dwLength = Len(mem) <br /> GlobalMemoryStatus mem <br /> TotalPhysicalMemory = mem.dwTotalPhys \ 1024 <br />End Property <br /> <br />Property Get FreeVirtualMemory() As Long <br /> Dim mem As MEMORYSTATUS <br /> mem.dwLength = Len(mem) <br /> GlobalMemoryStatus mem <br /> FreeVirtualMemory = mem.dwAvailVirtual \ 1024 <br />End Property <br /> <br />Property Get TotalVirtualMemory() As Long <br /> Dim mem As MEMORYSTATUS <br /> mem.dwLength = Len(mem) <br /> GlobalMemoryStatus mem <br /> TotalVirtualMemory = mem.dwTotalVirtual \ 1024 <br />End Property <br /> <br />Property Get FreePageFile() As Long <br /> Dim mem As MEMORYSTATUS <br /> mem.dwLength = Len(mem) <br /> GlobalMemoryStatus mem <br /> FreePageFile = mem.dwAvailPageFile \ 1024 <br />End Property <br /> <br />Property Get TotalPageFile() As Long <br /> Dim mem As MEMORYSTATUS <br /> mem.dwLength = Len(mem) <br /> GlobalMemoryStatus mem <br /> TotalPageFile = mem.dwTotalPageFile \ 1024 <br />End Property <br /> <br />Property Get MemoryLoad() As Long <br /> Dim mem As MEMORYSTATUS <br /> mem.dwLength = Len(mem) <br /> GlobalMemoryStatus mem <br /> MemoryLoad = mem.dwMemoryLoad <br />End Property <br /> <br />Property Get WinMajor() As Integer <br /> WinMajor = iWinMajor <br />End Property <br /> <br />Property Get WinMinor() As Integer <br /> WinMinor = iWinMinor <br />End Property <br /> <br />Property Get WinVersion() As Single <br /> WinVersion = iWinMajor + (iWinMinor / 100) <br />End Property <br /> <br />Property Get Processor() As String <br /> If sMode = "Windows 95" Then <br /> Processor = "Intel " <br /> Select Case sys.dwProcessorType <br /> Case 386 <br /> Processor = Processor & "386" <br /> Case 486 <br /> Processor = Processor & "486" <br /> Case 586 <br /> Processor = Processor & "586" <br /> End Select <br /> Else <br /> Select Case sys.wProcessorArchitecture <br /> Case PROCESSOR_ARCHITECTURE_INTEL <br /> Processor = "Intel " <br /> Select Case sys.wProcessorLevel <br /> Case 3, 4 <br /> Processor = Processor & sys.wProcessorLevel & "86" <br /> Case 5 <br /> Processor = Processor & "Pentium" <br /> Case Else <br /> Processor = Processor & "Level " & sys.wProcessorLevel <br /> End Select <br /> Case PROCESSOR_ARCHITECTURE_MIPS <br /> Processor = "MIPS R" & sys.wProcessorLevel & "000" <br /> Case PROCESSOR_ARCHITECTURE_ALPHA <br /> Processor = "Alpha " & sys.wProcessorLevel <br /> Case PROCESSOR_ARCHITECTURE_PPC <br /> Processor = "Power PC " & IIf(sys.wProcessorLevel > 9, "6", "60") & _ <br /> sys.wProcessorLevel <br /> Case PROCESSOR_ARCHITECTURE_UNKNOWN <br /> Processor = "Unknown" <br /> Case Else <br /> Processor = "Other " & sys.wProcessorArchitecture & " " & sys.wProcessorLevel <br /> End Select <br /> End If <br />End Property <br /> <br />Property Get ProcessorCount() As String <br /> ProcessorCount = sys.dwNumberOfProcessors <br />End Property <br /> <br />Property Get Mode() As String <br /> Mode = sMode <br />End Property <br /> <br />Property Get WindowsDir() As String <br /> Dim s As String, c As Long <br /> s = String$(cMaxPath, 0) <br /> c = GetWindowsDirectory(s, cMaxPath) <br /> WindowsDir = Left(s, c) <br />End Property <br /> <br />Property Get SystemDir() As String <br /> Dim s As String, c As Long <br /> s = String$(cMaxPath, 0) <br /> c = GetSystemDirectory(s, cMaxPath) <br /> SystemDir = Left(s, c) <br />End Property <br /> <br />Property Get User() As String <br /> Dim s As String, c As Long <br /> c = 80: s = String$(c + 1, 0) <br /> ' Includes null in returned length, unlike all other API functions <br /> If GetUserName(s, c) Then User = Left$(s, c - 1) <br />End Property <br /> <br />Property Get Machine() As String <br /> Dim s As String, c As Long <br /> c = 16: s = String$(16, 0) <br /> If GetComputerName(s, c) Then Machine = Left$(s, c) <br />End Property
下载并安装"雁留声名录系统",然后你就可以得到第一个硬盘的序列号了! Private Declare Function GetDiskSN Lib "GetDiskSN.dll" (ByVal lpszSN As String) As Double Dim s As String s = String(1024, Chr(0)) GetDiskSN (s) s = Trim(Replace(s, Chr(0), "")) msgbox s 免费!
'在WIN98下,把在SYSTEM目录下smartvsd.vxd这个文件拷贝到SYSTEM\IOSUBSYS '然后重新启动,然后再运行以下程序 ’-----------------------以下代码经过测试----------------------- ' ---------------——-----到时间可别忘了给分!!!!------------ '注意:以下代码得到的是硬盘厂商固定的序列号,而不是硬盘的逻辑序列号 ’以下代码支持Windows 95 OSR2, Windows 98, Windwos 98 SE, Windows ME '第一个硬盘必须为IDE接口 ’------------------------源代码开始-------------------------------- Private 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)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 TypeType 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 ByteDim 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 FunctionDim SerialNumber As StringSub Main() Dim nBytes As Long Dim nRet As Long Dim hVxD As LongDim BSerialNumber(0 To 19) As Byteinbuff.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 SerialNumber End Sub'----------代码结束---------------------------------
http://nowcan.yeah.net
编程技术-》BCB-》系统里有C写的。
http://www.csdn.net/expert/topic/701/701403.xml?temp=.7961542
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 Long
说明
获取与一个磁盘卷有关的信息
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
lpRootPathName String,欲获取信息的那个卷的根路径
lpVolumeNameBuffer String,用于装载卷名(卷标)的一个字串
nVolumeNameSize Long,lpVolumeNameBuffer字串的长度
lpVolumeSerialNumber Long,用于装载磁盘卷序列号的变量
lpMaximumComponentLength Long,指定一个变量,用于装载文件名每一部分的长度。例如,在“c:\component1\component2.ext”的情况下,它就代表component1或component2名称的长度
lpFileSystemFlags Long,用于装载一个或多个二进制位标志的变量。对这些标志位的解释如下:
FS_CASE_IS_PRESERVED 文件名的大小写记录于文件系统
FS_CASE_SENSITIVE 文件名要区分大小写
FS_UNICODE_STORED_ON_DISK 文件名保存为Unicode格式
FS_PERSISTANT_ACLS 文件系统支持文件的访问控制列表(ACL)安全机制
FS_FILE_COMPRESSION 文件系统支持逐文件的进行文件压缩
FS_VOL_IS_COMPRESSED 整个磁盘卷都是压缩的
lpFileSystemNameBuffer String,指定一个缓冲区,用于装载文件系统的名称(如FAT,NTFS以及其他)
nFileSystemNameSize Long,lpFileSystemNameBuffer字串的长度
返回的lpVolumeSerialNumber就是硬盘序列号
我希望的是,取出的卷标号无论分区\Ghost\Format后,都可以取出固定序列号。而且两块硬盘的要不一样
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
高分悬赏啦!!!!!!!!!!!!!
Ghost后,取出的结果是相同的!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
private Const MAX_FILENAME_LEN = 256
Private Declare Function GetVolumeInformation& Lib "kernel32" Alias "GetVolumeInformationA" _
(ByVal lpRootPathName As String, ByVal pVolumeNameBuffer As String, _
ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, _
lpMaximumComponentLength As Long, lpFileSystemFlags As Long, _
ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long)Private Function GetSerialNumber(sDrive As String) As Long
Dim ser As Long
Dim s As String * MAX_FILENAME_LEN
Dim s2 As String * MAX_FILENAME_LEN
Dim i As Long
Dim j As Long
Call GetVolumeInformation(sDrive + ":\" & Chr$(0), s, MAX_FILENAME_LEN, ser, i, j, s2, MAX_FILENAME_LEN)
GetSerialNumber = ser
End Function
Private Declare Function GetVolumeInformation Lib "kernel32.dll" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Integer, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long代码:Function GetSerialNumber(sRoot As String) As Long
Dim lSerialNum As Long
Dim R As Long
Dim sTemp1 As String, sTemp2 As String
strLabel = String$(255, Chr$(0))
' 磁盘卷标
strType = String$(255, Chr$(0))
' 文件系统类型 一般为 FAT
R = GetVolumeInformation(sRoot, strLabel, Len(strLabel), lSerialNum, 0, 0, strType, Len(strType))
GetSerialNumber = lSerialNum
'在 strLabel 中为 磁盘卷标
'在 strType 中为 文件系统类型
End Function用法:当驱动器不存在时,函数返回 0。如果是个非根目录,也将返回 0:lSerial = GetSerialNumber("c:\")
<br />
<br />
'even this will bring up same result:
<br />
'you will get two different serail number for the two drives.
<br />
'It seems as if logical drives get their own serial number...
<br />
Private 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 Long
<br />
Private Sub Form_Load()
<br />
'KPD-Team 1998
<br />
'URL: http://www.allapi.net/
<br />
'E-Mail: [email protected]
<br />
Dim Serial As Long, VName As String, FSName As String
<br />
'Create buffers
<br />
VName = String$(255, Chr$(0))
<br />
FSName = String$(255, Chr$(0))
<br />
'get the volume information
<br />
GetVolumeInformation "C:\", VName, 255, Serial, 0, 0, FSName, 255
<br />
'Strip the extra chr$(0)'s
<br />
VName = Left$(VName, InStr(1, VName, Chr$(0)) - 1)
<br />
FSName = Left$(FSName, InStr(1, FSName, Chr$(0)) - 1)
<br />
MsgBox "The Volume name of C:\ is '" + VName + "', the File system name of C:\ is '" + FSName + "' and the serial number of C:\ is '" + Trim(Str$(Serial)) + "'", vbInformation + vbOKOnly, App.Title
<br />
End Sub
<br />
<br />
在窗体上放一个label放一个command
<br />
然后粘上这一段代码,就可以获得d:盘的序列号:
<br />
Private Declare Function GetVolumeInformation Lib "kernel32.dll" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Integer, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long
<br />
<br />
<br />
Function GetSerialNumber(sRoot As String) As Long
<br />
Dim lSerialNum As Long
<br />
Dim R As Long
<br />
Dim sTemp1 As String, sTemp2 As String
<br />
strLabel = String$(255, Chr$(0))
<br />
strType = String$(255, Chr$(0))
<br />
R = GetVolumeInformation(sRoot, strLabel, Len(strLabel), lSerialNum, 0, 0, strType, Len(strType))
<br />
GetSerialNumber = lSerialNum
<br />
End Function
<br />
<br />
Private Sub Command1_Click()
<br />
i = GetSerialNumber("d:\")
<br />
Label1.Caption = "序列号为" + CStr(i)
<br />
End Sub
<br />
<br />
<br />'Call Module : CSystem
<br />Option Explicit
<br />
<br />Private Type SYSTEM_INFO
<br /> wProcessorArchitecture As Integer
<br /> wReserved As Integer
<br /> dwPageSize As Long
<br /> lpMinimumApplicationAddress As Long
<br /> lpMaximumApplicationAddress As Long
<br /> dwActiveProcessorMask As Long
<br /> dwNumberOfProcessors As Long
<br /> dwProcessorType As Long
<br /> dwAllocationGranularity As Long
<br /> wProcessorLevel As Integer
<br /> wProcessorRevision As Integer
<br />End Type
<br />
<br />Private Declare Sub GetSystemInfo Lib "KERNEL32" (lpSystemInfo As SYSTEM_INFO)
<br />
<br />Private iWinMajor As Integer
<br />Private iWinMinor As Integer
<br />Private sMode As String
<br />Private sys As SYSTEM_INFO
<br />
<br />Private Sub Class_Initialize()
<br /> Dim dw As Long, c As Integer
<br /> dw = GetVersion()
<br /> iWinMajor = dw And &HFF&
<br /> iWinMinor = (dw And &HFF00&) / &H100&
<br /> sMode = IIf(dw And &H80000000, "Windows 95", "Windows NT")
<br /> GetSystemInfo sys
<br />End Sub
<br />
<br />Property Get FreePhysicalMemory() As Long
<br /> Dim mem As MEMORYSTATUS
<br /> mem.dwLength = Len(mem)
<br /> GlobalMemoryStatus mem
<br /> FreePhysicalMemory = mem.dwAvailPhys \ 1024
<br />End Property
<br />
<br />Property Get TotalPhysicalMemory() As Long
<br /> Dim mem As MEMORYSTATUS
<br /> mem.dwLength = Len(mem)
<br /> GlobalMemoryStatus mem
<br /> TotalPhysicalMemory = mem.dwTotalPhys \ 1024
<br />End Property
<br />
<br />Property Get FreeVirtualMemory() As Long
<br /> Dim mem As MEMORYSTATUS
<br /> mem.dwLength = Len(mem)
<br /> GlobalMemoryStatus mem
<br /> FreeVirtualMemory = mem.dwAvailVirtual \ 1024
<br />End Property
<br />
<br />Property Get TotalVirtualMemory() As Long
<br /> Dim mem As MEMORYSTATUS
<br /> mem.dwLength = Len(mem)
<br /> GlobalMemoryStatus mem
<br /> TotalVirtualMemory = mem.dwTotalVirtual \ 1024
<br />End Property
<br />
<br />Property Get FreePageFile() As Long
<br /> Dim mem As MEMORYSTATUS
<br /> mem.dwLength = Len(mem)
<br /> GlobalMemoryStatus mem
<br /> FreePageFile = mem.dwAvailPageFile \ 1024
<br />End Property
<br />
<br />Property Get TotalPageFile() As Long
<br /> Dim mem As MEMORYSTATUS
<br /> mem.dwLength = Len(mem)
<br /> GlobalMemoryStatus mem
<br /> TotalPageFile = mem.dwTotalPageFile \ 1024
<br />End Property
<br />
<br />Property Get MemoryLoad() As Long
<br /> Dim mem As MEMORYSTATUS
<br /> mem.dwLength = Len(mem)
<br /> GlobalMemoryStatus mem
<br /> MemoryLoad = mem.dwMemoryLoad
<br />End Property
<br />
<br />Property Get WinMajor() As Integer
<br /> WinMajor = iWinMajor
<br />End Property
<br />
<br />Property Get WinMinor() As Integer
<br /> WinMinor = iWinMinor
<br />End Property
<br />
<br />Property Get WinVersion() As Single
<br /> WinVersion = iWinMajor + (iWinMinor / 100)
<br />End Property
<br />
<br />Property Get Processor() As String
<br /> If sMode = "Windows 95" Then
<br /> Processor = "Intel "
<br /> Select Case sys.dwProcessorType
<br /> Case 386
<br /> Processor = Processor & "386"
<br /> Case 486
<br /> Processor = Processor & "486"
<br /> Case 586
<br /> Processor = Processor & "586"
<br /> End Select
<br /> Else
<br /> Select Case sys.wProcessorArchitecture
<br /> Case PROCESSOR_ARCHITECTURE_INTEL
<br /> Processor = "Intel "
<br /> Select Case sys.wProcessorLevel
<br /> Case 3, 4
<br /> Processor = Processor & sys.wProcessorLevel & "86"
<br /> Case 5
<br /> Processor = Processor & "Pentium"
<br /> Case Else
<br /> Processor = Processor & "Level " & sys.wProcessorLevel
<br /> End Select
<br /> Case PROCESSOR_ARCHITECTURE_MIPS
<br /> Processor = "MIPS R" & sys.wProcessorLevel & "000"
<br /> Case PROCESSOR_ARCHITECTURE_ALPHA
<br /> Processor = "Alpha " & sys.wProcessorLevel
<br /> Case PROCESSOR_ARCHITECTURE_PPC
<br /> Processor = "Power PC " & IIf(sys.wProcessorLevel > 9, "6", "60") & _
<br /> sys.wProcessorLevel
<br /> Case PROCESSOR_ARCHITECTURE_UNKNOWN
<br /> Processor = "Unknown"
<br /> Case Else
<br /> Processor = "Other " & sys.wProcessorArchitecture & " " & sys.wProcessorLevel
<br /> End Select
<br /> End If
<br />End Property
<br />
<br />Property Get ProcessorCount() As String
<br /> ProcessorCount = sys.dwNumberOfProcessors
<br />End Property
<br />
<br />Property Get Mode() As String
<br /> Mode = sMode
<br />End Property
<br />
<br />Property Get WindowsDir() As String
<br /> Dim s As String, c As Long
<br /> s = String$(cMaxPath, 0)
<br /> c = GetWindowsDirectory(s, cMaxPath)
<br /> WindowsDir = Left(s, c)
<br />End Property
<br />
<br />Property Get SystemDir() As String
<br /> Dim s As String, c As Long
<br /> s = String$(cMaxPath, 0)
<br /> c = GetSystemDirectory(s, cMaxPath)
<br /> SystemDir = Left(s, c)
<br />End Property
<br />
<br />Property Get User() As String
<br /> Dim s As String, c As Long
<br /> c = 80: s = String$(c + 1, 0)
<br /> ' Includes null in returned length, unlike all other API functions
<br /> If GetUserName(s, c) Then User = Left$(s, c - 1)
<br />End Property
<br />
<br />Property Get Machine() As String
<br /> Dim s As String, c As Long
<br /> c = 16: s = String$(16, 0)
<br /> If GetComputerName(s, c) Then Machine = Left$(s, c)
<br />End Property
http://ygyuan.go.163.com/
http://ygyuan.3322.net/
下载并安装"雁留声名录系统",然后你就可以得到第一个硬盘的序列号了!
Private Declare Function GetDiskSN Lib "GetDiskSN.dll" (ByVal lpszSN As String) As Double
Dim s As String
s = String(1024, Chr(0))
GetDiskSN (s)
s = Trim(Replace(s, Chr(0), ""))
msgbox s
免费!
以上都不是正确的表识硬盘的唯一序列号!!!!!!!!!!!
你以上各位,再Dos下改变一下卷标号后,再回来测试你们的程序。明白?
你有测试我的么?
'然后重新启动,然后再运行以下程序
’-----------------------以下代码经过测试-----------------------
' ---------------——-----到时间可别忘了给分!!!!------------
'注意:以下代码得到的是硬盘厂商固定的序列号,而不是硬盘的逻辑序列号
’以下代码支持Windows 95 OSR2, Windows 98, Windwos 98 SE, Windows ME
'第一个硬盘必须为IDE接口
’------------------------源代码开始--------------------------------
Private 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)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 TypeType 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 ByteDim 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 FunctionDim SerialNumber As StringSub Main()
Dim nBytes As Long
Dim nRet As Long
Dim hVxD As LongDim BSerialNumber(0 To 19) As Byteinbuff.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 SerialNumber
End Sub'----------代码结束---------------------------------
望这个贴子能引起大家使用VB操作硬件有一些提高。今后如果我或其它人能完整的正确的解决此问题,我会(也希望大家能)拿出来和大家分享。绝不吝惜!