El registro de 32 bits no se puede importar a sistemas de 64 bits.
Actualmente, los sistemas informáticos se han transformado gradualmente de 32 bits a 64 bits, y XP, 2003 y VISTA tienen versiones de 64 bits. Actualmente, las aplicaciones de 32 bits siguen representando la mayoría, pero algunas aplicaciones tienen versiones de 32 y 64 bits. Para garantizar que los programas de 32 bits puedan ejecutarse sin problemas en sistemas de 64 bits, Microsoft proporciona un mecanismo de simulación llamado WOW64. Este sistema suele denominarse WOW64. En general, WOW64 es una biblioteca de vínculos dinámicos en modo de usuario que puede traducir comandos emitidos por aplicaciones de 32 bits a un formato aceptable para sistemas de 64 bits. En la imagen siguiente, puede obtener una descripción general de cómo se ejecutan las aplicaciones de 32 bits en sistemas de 64 bits.
Cuando se ejecuta una aplicación de 32 bits, el cargador de biblioteca nativo se iniciará primero. El cargador reconoce que la aplicación es de 32 bits y la maneja de forma especial. El cargador creará un entorno de emulación WOW64 para aplicaciones de 32 bits y transferirá el control al Ntdll.dll de 32 bits. El entorno de emulación WOW64 que se ejecuta entre aplicaciones de 32 bits y Ntdll.dll de 64 bits traducirá las instrucciones de la aplicación de 32 bits a un método aceptable para Ntdll.dll de 64 bits y también puede traducir las instrucciones del sistema a un método. aceptable para la aplicación de 32 bits.
2¿Cómo determinar si el sistema es de 64 bits?
3 Cambios en el sistema de archivos
Los procesos de 32 bits no pueden cargar Dlls de 64 bits y los procesos de 64 bits no pueden cargar Dlls de 32 bits. El directorio del sistema de Windows contiene todas las aplicaciones instaladas y sus archivos DLL. Según las reglas que mencionamos, debe dividirse en un directorio para aplicaciones de 64 bits y un directorio para aplicaciones de 32 bits. Si no, no podemos diferenciar entre archivos Dll de 32 y 64 bits. Para aplicaciones de 64 bits, estos archivos normalmente se colocan en %windir%\system32 y %programfiles% (por ejemplo, c:\program files). Para aplicaciones de 32 bits, estos archivos generalmente se encuentran en %windir%\syswow64 y C:\program files (x86). Si usamos un programa de 32 bits para acceder a %windir%\system32, ya sea que usemos codificación física u otros métodos, el sistema cambiará automáticamente a %windir%\syswow64 por nosotros. De forma predeterminada, esta redirección está activada para todas las aplicaciones de 32 bits. Pero esta transformación no siempre es necesaria para nosotros. Luego podemos llamar a la API correspondiente en C# para activar y desactivar esta función. Hay tres funciones de uso común: Wow64DisableWow64FsRedirection, Wow64RevertWow64FsRedirection y Wow64EnableWow64FsRedirection. Sin embargo, Wow64EnableWow64FsRedirection no es confiable cuando está anidado, por lo que el Wow64RevertWow64FsRedirection anterior generalmente se usa para habilitar la función de redirección del sistema de archivos. En C#, podemos usar DllImport para llamar a estas dos funciones directamente. Sin embargo, cabe señalar que estas dos funciones no existen en el Kernel.dll de 32 bits. Entonces deberías usar LoadLibrary para cargar dinámicamente estas dos funciones en C++. De lo contrario, no podrá compilar porque no se pueden encontrar estas dos funciones. Y en el uso actual, descubrí que estas dos funciones tienen un pequeño problema. Si llamamos a la función GetOpenFileName de Comdlg32.dll después de llamar a Wow64DisableWow64FsRedirection, la llamada no será exitosa. Pero tampoco puedes obtener el valor del error. En C#, puede utilizar el siguiente código para cerrar y abrir la guía de archivos.
Declarar reglas de llamada
[DllImport( "Kernel32.dll ", CharSet=CharSet.Auto, SetLastError = true)]
public static extern bool wow 64 deshabilitar la redirección wow 64 fs (ref IntPtr ptr);
[DllImport( "Kernel32.dll ", CharSet=CharSet.Auto, SetLastError = true)]
public static extern bool wow 64 revertwow 64 fs redirección(IntPtr ptr);
Cerrar redirección
wow 64 deshabilitar wow 64 fs redirección(ref Ptr);
Abrir redirección
p>
wow 64 revertwow 64 fs redirección(Ptr);
Cabe señalar que el cierre y la apertura deben aparecer en pares. Para evitar comportamientos caóticos.
4 Desvío del Registro
Para evitar conflictos de entradas de registro, algunas entradas del registro también se dividen en dos partes. Una parte se usa especialmente para el acceso al sistema de 64 bits y la otra parte se usa especialmente para el acceso al sistema de 32 bits, ubicada en Wow6432Node. Cuando un programa de 32 bits accede a algunos valores clave, similar a la transferencia de archivos, el sistema transferirá automáticamente el acceso del programa a Wow6432Node. Wow6432Node Este nodo existe en HKEY_LOCAL_MACHINE y HKEY_CURRENT_USER. Si desea desactivar este turno, puede utilizar los métodos anteriores de Wow64DisableWow64FsRedirection y RegOpenKeyEx. El método RegOpenEx llama al método de declaración en C# de la siguiente manera:
[DllImport("Advapi32.dll ", CharSet = CharSet. Auto, SetLastError = true)]
public static extern uint RegOpenKeyEx( UIntPtr hKey, string lpSubKey, uint ulOptions, int samDesired, out IntPtr phkResult);
Lo que cabe destacar es el parámetro samDesired. Este parámetro puede ser equivalente a key_all_access, key_query_value, key_wow64_64 key (consulte MSDN para obtener más detalles). Después de haber cerrado el sistema de archivos, podemos usar: (clave _ consulta _ valor | clave _ wow 64 _ 64 clave) para obtener acceso completo al registro. Cabe señalar que en Vista, algunas claves de registro son de sólo lectura. Si se utiliza el parámetro KEY_ALL_ACCESS, se producirá el error "Acceso denegado" (ErrorCode = 5). Por lo tanto, es mejor no utilizar KEY_ALL_ACCESS si no escribe en el registro. Podemos utilizar el siguiente código para tener acceso completo al registro.
//Utilice esta función para transferir el nombre de la clave de cadena al identificador HKEY
UIntPtr TransferKeyName estático privado (String KeyName)
{
UIntPtr HKEY _Class_Root=(UIntPtr)0x 80000000;
UIntPtr HKEY _Current_User=(UIntPtr)0x 8000001;
UIntPtr HKEY _ LOCAL _ MACHINE =( UIntPtr)0x 80000002;
UIntPtr HKEY_user=(UIntPtr)0x 80000003;
UIntPtr HKEY_current_config=(UIntPtr)0x 80000005;
cambiar(nombre_clave)
{
Caso "HKEY_Class_Root":
Devuelve HKEY_Class_Root;
Caso "Usuario actual de HKEY":
Devuelve usuario actual de HKEY; p>
Caso "HKEY_LOCAL_MACHINE":
Devuelve HKEY_LOCAL_MACHINE
Caso "HKEY_user":
Devuelve HKEY_user;
Caso "Configuración actual de HKEY":
Devuelve la configuración actual de HKEY;
}
Devuelve HKEY_Class_Root;
}
Bool estático público OpenRegKey(string keyName, string subKeyName)
{
UIntPtr hKey = TransferKeyName(keyName);
UIntPtr phkResult = UIntPtr. Cero;
int LLAVE _ CONSULTA _ VALOR = (0x 0001);
int LLAVE _ guau 64 _ 64 LLAVE = (0x 0100); KEY _ ALL _ wow 64 = (KEY _ QUERY _ VALUE | KEY _ wow 64 _ 64 KEY);
si (es de 64 bitos & amp; & amp! está habilitada la redirección de wow 64)//sistema operativo Para 64 bits, la redirección de archivos está desactivada
{
samDesired = KEY _ ALL _ WOW64
}
if(RegOpenKeyEx (hKey, subKeyName, 0, samDesired, out phkResult)//ERROR _ SUCCESS = 0
{
Devuelve verdadero
}
int errCode = System. runtime.servicios de interoperabilidad.getlastwin 32 error();
Devuelve falso
}