文件和注册表的重定向解决方法

注册表重定向解决办法:

32位程序如何访问64位的注册表(HKLM/Software)

? 在调用函数RegCreateKeyEx创建注册表项时,对其第六个参数REGSAM samDesired设置中添加参数KEY_WOW64_64KEY,这样可以实现对64位注册表的访问;

? 在调用函数RegOpenKeyEx打开注册表项时,要对其第四个参数REGSAM samDesired设置中添加参数KEY_WOW64_64KEY,这样可以实现对64位注册表的访问;

64位程序如何访问32位的注册表(HKLM/Software/Wow6432Node)

? 在调用函数RegCreateKeyEx创建注册表项时,对其第六个参数REGSAM samDesired设置中添加参数KEY_WOW32_64KEY,这样可以实现对32位注册表的访问;

? 在调用函数RegOpenKeyEx打开注册表项时,要对其第四个参数REGSAM samDesired设置中添加参数KEY_WOW32_64KEY,这样可以实现对32位注册表的访问;

文件重定向解决办法:

我们可以调用相关的API来关闭和打开这种转向。常用的函数有3个:

Wow64DisableWow64FsRedirection(关闭系统转向),

Wow64RevertWow64FsRedirection (打开系统转向),

Wow64EnableWow64FsRedirection (打开系统转向)。

但是Wow64EnableWow64FsRedirection在嵌套使用的时候不可靠,所以通常用上面的Wow64RevertWow64FsRedirection来打开文件系统转向功能。

执行批处理与代码调用批处理的区别:

(1)在64位系统上直接双击运行批处理文件QQBrowser.reg,

结果会导入到目录 HKEY_LOCAL_MACHINE\SOFTWARE\Tencent\QQBrowser

Windows Registry Editor Version 5.00
[<span style="color:#ff0000;">HKEY_LOCAL_MACHINE\SOFTWARE\Tencent\QQBrowser</span>]
"Version"="7.7.28658.400"
"InstallDir"="{AutoPath}QQ浏览器{/AutoPath}"
"INSTLANG"="2052"
"Exe"="{AutoPath}QQ浏览器{/AutoPath}\\QQBrowser.exe"
"SupplyID"="607"

(2)在64位系统上直接双击运行批处理文件QQBrowser.reg,

结果会导入到目录 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tencent\QQBrowser

<pre name="code" class="cpp">Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tencent\QQBrowser]
"Version"="7.7.28658.400"
"InstallDir"="{AutoPath}QQ浏览器{/AutoPath}"
"INSTLANG"="2052"
"Exe"="{AutoPath}QQ浏览器{/AutoPath}\\QQBrowser.exe"
"SupplyID"="607"

(3)如果在VC编译的32位程序中调用"regedit.exe /s QQBrowser.reg"命令来实现导入批处理文件,

则结果将导入到 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tencent\QQBrowser

<pre name="code" class="html">Windows Registry Editor Version 5.00
[<span style="color:#ff0000;">HKEY_LOCAL_MACHINE\SOFTWARE\Tencent\QQBrowser</span>]
"Version"="7.7.28658.400"
"InstallDir"="{AutoPath}QQ浏览器{/AutoPath}"
"INSTLANG"="2052"
"Exe"="{AutoPath}QQ浏览器{/AutoPath}\\QQBrowser.exe"
"SupplyID"="607"

(4)如果在VC编译的32位程序中调用"regedit.exe /s QQBrowser.reg"命令来实现导入批处理文件,

则结果也将导入到 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tencent\QQBrowser

Windows Registry Editor Version 5.00
[<span style="color:#ff0000;">HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tencent\QQBrowser</span>]
"Version"="7.7.28658.400"
"InstallDir"="{AutoPath}QQ浏览器{/AutoPath}"
"INSTLANG"="2052"
"Exe"="{AutoPath}QQ浏览器{/AutoPath}\\QQBrowser.exe"
"SupplyID"="607"

(5)先删除注册表节点HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tencent,即删除QQBrowser的父目录Tencent,

然后通过VC编译的32位程序中调用"regedit.exe /s QQBrowser.reg"命令来实现导入批处理文件,

则结果会自动创建并导入 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tencent\QQBrowser

Windows Registry Editor Version 5.00
[<span style="color:#ff0000;">HKEY_LOCAL_MACHINE\SOFTWARE\Tencent\QQBrowser</span>]
"Version"="7.7.28658.400"
"InstallDir"="{AutoPath}QQ浏览器{/AutoPath}"
"INSTLANG"="2052"
"Exe"="{AutoPath}QQ浏览器{/AutoPath}\\QQBrowser.exe"
"SupplyID"="607"

(6)先删除注册表节点HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tencent,即删除QQBrowser的父目录Tencent,

然后通过VC编译的32位程序中调用"regedit.exe /s QQBrowser.reg"命令来实现导入批处理文件,

则结果会多创建一级Wow6432Node目录,即导入到了 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Wow6432Node\Tencent

<pre name="code" class="html">Windows Registry Editor Version 5.00
[<span style="color:#ff0000;">HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tencent\QQBrowser</span>]
"Version"="7.7.28658.400"
"InstallDir"="{AutoPath}QQ浏览器{/AutoPath}"
"INSTLANG"="2052"
"Exe"="{AutoPath}QQ浏览器{/AutoPath}\\QQBrowser.exe"
"SupplyID"="607"
说明:

(1)和(2)由于是在64位操作系统上,所以直接双击运行批处理文件,相当执行64位DOS应用程序,所以会如期导入到指定的目录下;

(3)但通过VC编译的32位程序来调用"regedit.exe /s QQBrowser.reg“命令实现导入批处理文件,结果却不如所料,虽然指定导入到HKEY_LOCAL_MACHINE\SOFTWARE\Tencent\QQBrowser,但实际却导入到了HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tencent\QQBrowser,

要想导入到HKEY_LOCAL_MACHINE\SOFTWARE\Tencent\QQBrowser,必须在导入之前关闭重定向,导入完成之后回复重定向。

解决(3)和(6)的异常,都需要在导入之前先关闭重定向,代码如下:

//判断操作系统是否x64
BOOL IsWow64()
{
	BOOL bIsWow64 = FALSE;
	typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
	LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process");
	if (NULL != fnIsWow64Process)
	{
		fnIsWow64Process(GetCurrentProcess(), &bIsWow64);
	}

	return bIsWow64;
}

//注册回调,用于跟WOW64相关的操作
void InitDriver(lpFunc func, LPVOID lpParam)
{
	if (NULL == func)
	{
		return;
	}

	if (IsWow64())
	{
		PVOID oldValue = NULL;
		BOOL IssysWow64 = IsWow64();

		//关闭WOW64重定向(在导注册表时很重要,避免文件被写到Wow6432Node)
		if (IssysWow64)
		{
			typedef BOOL(WINAPI *LPFN_Wow64DisableWow64FsRedirection)(PVOID *OldValue);
			LPFN_Wow64DisableWow64FsRedirection fnWow64DisableWow64FsRedirection;

			fnWow64DisableWow64FsRedirection = (LPFN_Wow64DisableWow64FsRedirection)GetProcAddress(
				GetModuleHandle(TEXT("kernel32")), "Wow64DisableWow64FsRedirection");

			if (fnWow64DisableWow64FsRedirection != NULL)
			{
				fnWow64DisableWow64FsRedirection(&oldValue);
			}
		}

		//当关闭重定向后,32位会导入到64位系统的64位节点下,例如:
		//预计导入节点:[HKEY_LOCAL_MACHINE\SOFTWARE\Tencent\QQBrowser]
		//实际导入节点:[HKEY_LOCAL_MACHINE\SOFTWARE\Tencent\QQBrowser]
		func(lpParam);

		//恢复WOW64重定向
		if (IssysWow64)
		{
			typedef	BOOL(WINAPI *LPFN_Wow64RevertWow64FsRedirection)(PVOID OlValue);
			LPFN_Wow64RevertWow64FsRedirection fnWow64RevertWow64FsRedirection;
			fnWow64RevertWow64FsRedirection = (LPFN_Wow64RevertWow64FsRedirection)GetProcAddress(
				GetModuleHandle(TEXT("kernel32")), "Wow64RevertWow64FsRedirection");

			if (fnWow64RevertWow64FsRedirection != NULL)
			{
				fnWow64RevertWow64FsRedirection(oldValue);
			}
		}
	}
	else
	{
		//32位会重定向导入到64位系统的32位节点WOW6432Node下,例如:
		//预计导入节点:[HKEY_LOCAL_MACHINE\SOFTWARE\Tencent\QQBrowser]
		//实际导入节点:[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tencent\QQBrowser]
		func(lpParam);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Windows 操作系统中,可以通过以下步骤删除 Python 取消安装后的残余文件注册表项: 1. 删除 Python 安装文件和临时文件 在取消 Python 安装后,可能会留下一些临时文件或安装文件。这些文件通常位于 `C:\Users\<用户名>\AppData\Local\Temp` 或 `C:\Windows\Temp` 目录下,可以手动删除。 2. 删除 Python 安装目录 如果 Python 已经安装在系统中,但未完成安装,则可能会留下一些 Python 安装目录。可以手动删除这些目录,例如默认的 Python 目录位于 `C:\PythonXX`,其中 `XX` 表示 Python 的版本号。 3. 删除 Python 相关的注册表项 在取消 Python 安装后,可能会留下一些 Python 相关的注册表项。可以使用系统自带的注册表编辑器来删除这些注册表项,具体步骤如下: - 按下 Windows 键 + R 组合键,打开运行对话框; - 输入 `regedit`,点击确定按钮,打开注册表编辑器; - 在注册表编辑器中,依次展开以下路径:`HKEY_CURRENT_USER\Software\Python` 和 `HKEY_LOCAL_MACHINE\SOFTWARE\Python`; - 右键点击需要删除的注册表项,选择删除。 需要注意的是,删除注册表项可能会对系统产生负面影响,因此在删除之前请确保已经备份了系统注册表。另外,如果不确定是否需要删除某个注册表项,请先备份该项后再进行删除。 总之,删除 Python 取消安装后的残余文件注册表项需要谨慎操作,建议备份系统和注册表,避免误删重要文件和信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值