Como permitir que 32 aplicativos bits em 64 bits do Windows para executar 64 aplicativos bit fornecidas no Windows \ System32
-
21-08-2019 - |
Pergunta
Digamos que você tenha um aplicativo, que pretende fornecer aos usuários a capacidade de navegar na pasta system32 e executar programas em (como telnet).
O que é o melhor método para apoiar este em que você precisa para apoiar XP em diante como um cliente e 2k em diante para o servidor?
Tendo escrito tudo isso eu me pergunto se é muito pouco tempo / esforço em fornecer uma procura para fazer isso, onde eles poderiam simplesmente copiá-lo do explorador. Ainda requer capacidade de lançamento.
Eu encontrei alguma discussão sobre Nynaeve .
Até agora parece que há as seguintes opções
- Crie uma pasta sysnative no Windows que permitirá que você navegue / executar 64 bit. Questões são:
- disponível apenas no Vista / Longhorn, de modo nenhum suporte para XP 64
- leva a diferentes nomenclatura caminho, não pode usar mesmo caminho em várias versões.
- estará ativo para toda de janelas, não apenas nosso aplicativo
- não pode (provavelmente não é) apropriado para fazer ao instalar o aplicativo
- permite especificar explicitamente através único caminho a versão do aplicativo para lançamento se houver um 32 bits ea versão de 64 bits
- Use a API do Windows para desativar temporariamente o redirecionamento ao mostrar listas de arquivos ou os usuários que executam executar comandos. Questões são:
- Apenas disponível em 64 bits - tem que mexer com GetProcAddress
- disponível apenas sob certas service packs
- deve identificar individualmente todos os locais que este deve ser implementado
- usuário precisará fornecer informações separado sobre se este é um aplicativo de 64 bits ou 32 bits.
Se alguém teve algum código de exemplo que exibiu um diálogo do Windows OpenFile (digamos usando MFC CFileDialog) mostrando nativly para XP / Vista e permitindo a visualização de diretório system32 64 bit, que seria fantástico.
Se alguém tinha um exemplo de lançar o aplicativo chamado, que também seria ótimo!
Edit:
Atualmente nós usamos CreateProcess para lançar o aplicativo (que está falhando).
err = CreateProcess((wchar_t*)exeName.c_str(), (wchar_t*)cmdLine.c_str(), NULL, NULL, FALSE, CREATE_SEPARATE_WOW_VDM, NULL, workingDir.c_str(), &startupInfo, &processInfo);
Solução
Eu tenho ido com a opção 2, Para aqueles que possam estar interessados; aqui está a minha rápida corte em uma versão escopo do gerenciamento da desativação do Wow64 redirecionamento com base em notas de MS. Irá redirecionar se o API está disponível, espera que kernel32.dll já está disponível.
class Wow64RedirectOff {
typedef BOOL (WINAPI *FN_Wow64DisableWow64FsRedirection) ( __out PVOID *OldValue );
typedef BOOL (WINAPI *FN_Wow64RevertWow64FsRedirection) ( __in PVOID OldValue );
public:
Wow64RedirectOff() {
LPFN_Disable = (FN_Wow64DisableWow64FsRedirection)GetProcAddress(
GetModuleHandle(TEXT("kernel32")),"Wow64DisableWow64FsRedirection");
if( LPFN_Disable ) {
LPFN_Disable(&OldValue);
}
}
~Wow64RedirectOff() {
if( LPFN_Disable ) {
FN_Wow64RevertWow64FsRedirection LPFN_Revert = (FN_Wow64RevertWow64FsRedirection)GetProcAddress(
GetModuleHandle(TEXT("kernel32")),"Wow64RevertWow64FsRedirection");
if( LPFN_Revert ) {
LPFN_Revert(OldValue);
}
}
}
private:
FN_Wow64DisableWow64FsRedirection LPFN_Disable;
PVOID OldValue;
};
E, assim, o uso seria
Wow64RedirectOff scopedRedirect;
//CFileOpen
//CreateProcess
Outras dicas
Você está sendo redirecionado para Windows / SysWoW64? Posso lançar aplicativos de 64 bits do Windows / System32 de um OpenFile em um 32-bit conseguiu executável.