Como executar a versão de registro de 64 bits do cmd.exe localizado em c: \ windows \ sysWow64

6

Eu tenho um aplicativo de 32 bits que precisa adicionar um valor à parte de x64 bits do registro.

Eu quero fazê-lo através da utilização de regedit.exe -s fileWithKeys.reg , No entanto, quando eu tento medir o regedit (no código do aplicativo, eu usei o diretório C:\windows\sysnative ), então eu recebo a versão de 32 bits. Eu preciso estender a versão de x64 bits da ferramenta (regedit) para adicionar essas chaves ao nó de x64 adequado.

Descobri que posso simular isso executando C:\Windows\SysWOW64\cmd.exe e chamando C:\Windows\regedit.exe de lá. Eu não sou capaz de executar a versão de 64 bits porque parece executar a versão de 32 bits do regedit.

Existe uma maneira de fazer isso?

    
por Darqer 07.05.2014 / 00:27

3 respostas

6

No Windows de 64 bits, existe o que é chamado de redirecionamento do sistema de arquivos e do registro. Eles existem para compatibilidade com aplicativos mais antigos que foram escritos para o Windows de 32 bits e para aplicativos desenvolvidos para versões mais antigas do Windows. O WoW64 conecta todas as chamadas de sistema feitas por processos de 32 bits, de modo que se meu aplicativo de 32 bits em execução em uma versão de 64 bits do Windows chamar C: \ Windows \ System32, o WoW64 o redirecionará para C: \ Windows \ SysWoW64, O diretório virtual C: \ Windows \ Sysnative direciona você para a versão native (a versão de 64 bits) do diretório, independentemente da quantidade de bits do encadeamento que referencia esse caminho do sistema de arquivos. / p>

Existe um mecanismo semelhante para o registro, que é a chave do WoW6432Node. Tecnicamente eu chamaria essas exibições de 32 bits e 64 bits do registro se eu quisesse ser conciso ... Ou pedante.

Eu escrevi algum código (em C #) não há muito tempo para acessar uma chave na parte nativa (64 bits) da seção de dentro de um processo de 32 bits. Aqui está um trecho abreviado:

// Accessing 64-bit registry key from 32-bit process
enum RegAccessFlag
{
    NONE                   = 0,
    KEY_QUERY_VALUE        = 0x0001,
    KEY_SET_VALUE          = 0x0002,
    KEY_CREATE_SUB_KEY     = 0x0004,
    KEY_ENUMERATE_SUB_KEYS = 0x0008,
    KEY_NOTIFY             = 0x0010,
    KEY_CREATE_LINK        = 0x0020,
    KEY_WOW64_64KEY        = 0x0100, // This is the ticket
    KEY_WOW64_32KEY        = 0x0200,
    KEY_WOW64_RES          = 0x0300
}

public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);

[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern int RegOpenKeyEx(UIntPtr hkey, string subKey, int ulOptions, int samDesired, out UIntPtr hkResult);

static void Main(string[] args)
{
    int statusCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE", 0, (int)RegAccessFlag.KEY_WOW64_64KEY | (int)RegAccessFlag.KEY_QUERY_VALUE, out hKey);
}

É claro que você ainda precisa ler um valor da chave uma vez que você a abriu, ou criar um novo valor, então lembre-se de fechar a chave quando terminar, mas isso o ajudaria se você se importasse com isso. escreva qualquer código.

Mas como você está falando sobre gerar um processo de 32 bits de outro processo de 32 bits, para que o processo filho possa acessar a exibição nativa do registro, em uma plataforma de 64 bits ... você está lidando com um combinação de redirecionamento do sistema de redirecionamento do sistema de arquivos e ambos ficando em seu caminho. E para superar tudo isso, o regedit.exe é um utilitário especial a esse respeito.

TL; DR: conceda C:\Windows\sysnative\regedt32.exe uma tentativa em vez de regedit.exe .

link

    
por 07.05.2014 / 04:54
3

A versão padrão de regedit.exe em um sistema operacional Windows de 64 bits é a versão de 64 bits .

O executável regedit localizado em C:\Windows\SysWOW64 é a versão de 32 bits e o executável em C:\Windows é a versão de 64 bits.

Então ... é por isso que você está vendo a versão de 32 bits quando você a executa a partir de SysWOW64 . Porque você está executando a versão de 32 bits. SysWOW64 é onde a versão de 32 bits está localizada e de onde é usada (já que é executada pelo sistema de 64 bits para permitir compatibilidade).

Você pode verificar / verificar qual versão do regedit você está executando através da existência da chave Wow6432Node em HKEY_LOCAL_MACHINE\SOFTWARE . Quando você executar o regedit de C:\Windows , esse nó existirá (exibirá a versão de 32 bits das chaves do Registro). Se você executar o regedit de C:\Windows\SysWOW64 , essa chave não existirá, porque você já está visualizando o registro de 32 bits.

C:\Windows\regedit.exe < = > Versão de 64 bits do regedit.
C:\Windows\SysWOW64\regedit.exe < = > Versão de 32 bits do regedit.

    
por 07.05.2014 / 00:57
1

Parece que "%systemroot%\regedit.exe" também faz algum tipo de redirecionamento.

A partir do Vista, isso funciona quando você está executando 32-bit cmd no sistema de 64 bits:

"%systemroot%\sysnative\cmd.exe" /c "%systemroot%\regedit.exe"
    
por 05.10.2016 / 15:38