谁有能取出真正的硬盘序列号(我有一个三星、一个钻石)的程序.(Ghost、Format、Fdisk作为测试依据)。用VB! 测试通过既给510分全给

trentliu 2002-05-06 05:04:09
一种硬盘给200分。
...全文
205 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
happygreat 2002-05-09
  • 打赏
  • 举报
回复
你查看以前的贴子,有说明的
trentliu 2002-05-07
  • 打赏
  • 举报
回复
在全盘镜像Ghost的情况下
trentliu 2002-05-07
  • 打赏
  • 举报
回复
请大家听好,我再三申明,要经过Fdisk\format\Ghost。以上的方法我还没有测试完成!(但基度山伯爵的程序无法通过测试!)
Ghost后,取出的结果是相同的!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
xiyixiaowm50 2002-05-07
  • 打赏
  • 举报
回复
同意 jdsbjcailei(基度山伯爵 )的看法!
trentliu 2002-05-07
  • 打赏
  • 举报
回复
不对啊,各位大哥,在GetVolumeInformation取的不是确切的硬盘序列号,我曾经测试过。假如取完后进行第二次fDisk分区.或进行格式化后,取出的序列号不同!这不是我的初衷,也无法当作加密因子。这本来就是卷标号
我希望的是,取出的卷标号无论分区\Ghost\Format后,都可以取出固定序列号。而且两块硬盘的要不一样


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
高分悬赏啦!!!!!!!!!!!!!
jyu1221 2002-05-07
  • 打赏
  • 举报
回复
本来可以通过直接操作端口来实现,这样就不需要VXD文件了,不过由于在WIN32下,直接操作端口给系统做了屏蔽。在WIN98下直接操作0x300之类的普通地址(不是系统占用的地址)是可以了,操作系统占用的地址(如0x1F0-0x1F7IDE控制器),是不可以的,只能通过VXD技术,或者在RING3上通过比较特殊的方法直接跳到RING0,才可以。
trentliu 2002-05-07
  • 打赏
  • 举报
回复
天同!我感觉你夺魁的希望非常之大。
trentliu 2002-05-07
  • 打赏
  • 举报
回复
DeviceIOControl的思路似乎比较正确,但现在还没有找到可以直接读取的任何函数。希望大家能多从更底层抛开已经有的API的角度去考虑。(可能用VB确实有难度!)现存的已经有的API或MSDN上能查到的基本查过!,并不能作为可靠加密因子。大家如果有更详细的想法欢迎继续探讨。此贴将于5月10号下午6:00结贴。如果没有合适答案。凡使用GetVolumeInformation 的将给分,但不会超过20分,因为雷同或相同贴子太多!大家并没有正确理解题意。对硬件底层有较深认识的同志或能给予较好提示的同志将给予较大分数,望海涵。
望这个贴子能引起大家使用VB操作硬件有一些提高。今后如果我或其它人能完整的正确的解决此问题,我会(也希望大家能)拿出来和大家分享。绝不吝惜!
lyqof908 2002-05-07
  • 打赏
  • 举报
回复
我有一个读硬盘物理序列号的DLL,用BCB写的。

要的话给我发短信息,WINDOWS操作系统全支持。
jyu1221 2002-05-07
  • 打赏
  • 举报
回复
'在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 Type

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
Next

End Function

Dim SerialNumber As String

Sub Main()
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 SerialNumber
End Sub

'----------代码结束---------------------------------



trentliu 2002-05-07
  • 打赏
  • 举报
回复
楼上两位同志,测试过程是漫长的。
ltpao 2002-05-07
  • 打赏
  • 举报
回复
Win98支持DeviceIOControl,不过要安装smartvsd.vxd,该文件默认不安装,需要手工解压到SYSTEM\IOSUBSYS目录下
y1g1y1 2002-05-07
  • 打赏
  • 举报
回复
to: BuilderC(+密)
你有测试我的么?
trentliu 2002-05-07
  • 打赏
  • 举报
回复
你们都全盘克隆(Ghost)一个试试!!!!!!!谁有不一样他要什么我给什么!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
你以上各位,再Dos下改变一下卷标号后,再回来测试你们的程序。明白?
trentliu 2002-05-07
  • 打赏
  • 举报
回复
不对,克隆硬盘后,你们说序列号应该和克隆前的硬盘一样吗?Fdisk分区后,取的序列号应该是不同的吗?
以上都不是正确的表识硬盘的唯一序列号!!!!!!!!!!!
y1g1y1 2002-05-07
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/topic/577/577681.xml?temp=.9733698


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


免费!

liuzhanwen 2002-05-07
  • 打赏
  • 举报
回复
象这样的东西还是做成一个类模块吧!
<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
liuzhanwen 2002-05-07
  • 打赏
  • 举报
回复
磁盘序列号用来加密,每次格式化后生成,而且绝不重复.在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 />

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 />


liuzhanwen 2002-05-07
  • 打赏
  • 举报
回复
这个程序一定是对的;须注意的是如果返回的是逻辑驱动器则是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 />

Private Sub Form_Load()
<br />

'KPD-Team 1998
<br />

'URL: http://www.allapi.net/
<br />

'E-Mail: KPDTeam@Allapi.net
<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 />


cwbboy 2002-05-07
  • 打赏
  • 举报
回复
up
加载更多回复(12)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧