虚拟光驱可以方便我们将用 ROM 介质才能玩的游戏从硬盘启动,但是有些游戏,特别是日本的有些游戏为了以防盗版添加了检测虚拟光驱的程序,这样的程序可以通过检测两项注册表键值来实现,即检测
HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/Scsi
和
HKEY_LOCAL_MACHINE/SYSTEM/MountedDevices 两项键值。这两项键值包含了逻辑分区的一些信息,如果删除则可以轻松使得检测程序出错失效,而在重新启动计算机后,按常理系统将自动检测并修复两项注册表键值(若重启后出现错误,请参看本文最后的处理方法),所以重新启动计算机后,若游戏必须再进行删除,这样一来很不方便,所以想通过编写程序来自动删除键值。首先我们想到的是高级语言,便用 VB 调用
Windows API 中的
RegOpenKeyEx 和
RegDeleteKey 来编写如下程序进行注册表操作:
必须声明变量
声明函数、变量、类和常量
编写删除的主程序
调用程序
这样,我们只需要调用
DeleteRegistryKey
便可以删除某个键值,但在上文叙述中提到的
HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/Scsi 却因为受到保护而不能删除,所以我们又想到了Windows 的命令行工具
REG.EXE,其命令操作方法可在命令提示符中键入
REG DELETE /? 来查看,下面我们以
HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/Scsi 为例介绍简单的强制删除注册表键的方法:
这样我们便可以强制删除一项键值。
删除以上两键值后可能出现的错误
在重新启动计算机后,可能出现在 我的电脑 中只有系统逻辑分区,而且其它介质的分区的盘符也出现了错误,若出现这样的错误,我们可以通过 我的电脑 -> 控制面板 -> 管理工具 -> 计算机管理 -> 磁盘管理 来重新调整磁盘的逻辑分区的盘符。
必须声明变量
Option Explicit
''''//注册表 API 函数声明
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
(ByVal hKey As Long, ByVal lpSubKey As String) As Long
''''//注册表访问权
Const KEY_ALL_ACCESS = &H3F
'''//注册表基本键值列表
Public Enum RootKeyEnum
HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_USER = &H80000001
HKEY_LOCAL_MACHINE = &H80000002
HKEY_USERS = &H80000003
HKEY_PERFORMANCE_DATA_WIN2K_ONLY = &H80000004 ''''//仅Win2k
HKEY_CURRENT_CONFIG = &H80000005
HKEY_DYN_DATA = &H80000006
End Enum
Private Const ERR_NONE = 0
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
(ByVal hKey As Long, ByVal lpSubKey As String) As Long
''''//注册表访问权
Const KEY_ALL_ACCESS = &H3F
'''//注册表基本键值列表
Public Enum RootKeyEnum
HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_USER = &H80000001
HKEY_LOCAL_MACHINE = &H80000002
HKEY_USERS = &H80000003
HKEY_PERFORMANCE_DATA_WIN2K_ONLY = &H80000004 ''''//仅Win2k
HKEY_CURRENT_CONFIG = &H80000005
HKEY_DYN_DATA = &H80000006
End Enum
Private Const ERR_NONE = 0
Public Function DeleteRegistryKey(ByVal hKey As RootKeyEnum, _
RegKeyName As String) As Boolean
'运行后返回 Boolean 值:True 表示操作成功; False 表示操作失败
On Error GoTo ErrHandle
DeleteRegistryKey = False
Dim lRetval As Long ''''//打开和输出注册表键的返回值
Dim lRegHWND As Long ''''//打开注册表键的句柄
lRetval = RegOpenKeyEx(hKey, RegKeyName, 0, KEY_ALL_ACCESS, lRegHWND) '打开注册表键
If lRetval = ERR_NONE Then
lRetval = RegDeleteKey(hKey, RegKeyName) '若打开未出现错误则删除
If lRetval <> ERR_NONE Then Exit Function '出错退出
If lRetval = ERR_NONE Then DeleteRegistryKey = True
End If
Exit Function
ErrHandle:
End Function
RegKeyName As String) As Boolean
'运行后返回 Boolean 值:True 表示操作成功; False 表示操作失败
On Error GoTo ErrHandle
DeleteRegistryKey = False
Dim lRetval As Long ''''//打开和输出注册表键的返回值
Dim lRegHWND As Long ''''//打开注册表键的句柄
lRetval = RegOpenKeyEx(hKey, RegKeyName, 0, KEY_ALL_ACCESS, lRegHWND) '打开注册表键
If lRetval = ERR_NONE Then
lRetval = RegDeleteKey(hKey, RegKeyName) '若打开未出现错误则删除
If lRetval <> ERR_NONE Then Exit Function '出错退出
If lRetval = ERR_NONE Then DeleteRegistryKey = True
End If
Exit Function
ErrHandle:
End Function
If DeleteRegistryKey(HKEY_LOCAL_MACHINE, "SOFTWARE/Jmouse") = False Then
MsgBox "删除键 HKEY_LOCAL_MACHINE/SOFTWARE/Jmouse 出错!"
Else
MsgBox "成功删除键 HKEY_LOCAL_MACHINE/SOFTWARE/Jmouse !"
End If
MsgBox "删除键 HKEY_LOCAL_MACHINE/SOFTWARE/Jmouse 出错!"
Else
MsgBox "成功删除键 HKEY_LOCAL_MACHINE/SOFTWARE/Jmouse !"
End If
REG DELETE HKLM/HARDWARE/DEVICEMAP/Scsi /f
删除以上两键值后可能出现的错误
在重新启动计算机后,可能出现在 我的电脑 中只有系统逻辑分区,而且其它介质的分区的盘符也出现了错误,若出现这样的错误,我们可以通过 我的电脑 -> 控制面板 -> 管理工具 -> 计算机管理 -> 磁盘管理 来重新调整磁盘的逻辑分区的盘符。