Option Explicit
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)
Public 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 Sub cmdGenKey_Click()
Dim Code1, Code2, HardDiskSerial, Serial1, Serial2 As Long
Dim Key, PassWord As String
If Val(txtID.Text) < 100000000000000# Then
MsgBox "身份证号码至少为15位,请重新输入!", vbCritical, "警告"
txtID.Text = ""
txtID.SetFocus
Exit Sub
End If
HardDiskSerial = GetSerialNumber("c")
Code1 = 1000000 - Val(Mid(txtID.Text, 6, 6))
Code2 = 1000000 - Val(Mid(txtID.Text, 1, 6))
Serial1 = 2371 + Int(Val(HardDiskSerial) / 923)
Serial2 = 1807 + Int(Val(HardDiskSerial) / 737)
Key = Str(3 * (Serial1 + Code2) + (Serial2 + Code1))
Key = RTrim(LTrim(Key))
PassWord = "R" + Key + "Y"
PassWord = RTrim(LTrim(PassWord))
txtPassword.Text = PassWord
End Sub