Come consentire le applicazioni a 32 bit a 64 bit di windows per eseguire 64 bit app incluse in Windows\System32

StackOverflow https://stackoverflow.com/questions/509989

Domanda

Dire che si dispone di un app che si desidera fornire agli utenti la possibilità di sfogliare la directory system32 ed eseguire programmi (come telnet).

Qual è il metodo migliore per sostenere questo quando è necessario il supporto di XP in poi come un client e 2k in poi per il server?

Dopo aver scritto tutto questo mi chiedo se è solo troppo tempo/sforzo nel fornire una sfoglia per fare questo, dove si può solo copiare da explorer.Ancora richiede la capacità di lancio.

Ho trovato qualche discussione sulla Nynaeve.

Finora sembra che ci siano le seguenti opzioni

  1. Creare una cartella sysnative in windows che vi permetterà di navigare/esecuzione a 64 bit.I problemi sono:
    • disponibile solo in Vista/Longhorn, in modo che nessun supporto per XP 64
    • porta a diversa denominazione del percorso, non è possibile utilizzare stesso percorso in più versioni.
    • sarà attivo per tutto windows, non solo la nostra app
    • non può (probabilmente non lo è) opportuno fare quando si installa l'applicazione
    • permette di specificare, attraverso un percorso solo la versione dell'app per il lancio se c'è una versione a 32 bit e a 64 bit
  2. Utilizzare l'API di windows per disattivare temporaneamente il reindirizzamento durante la visualizzazione di elenchi di file o l'esecuzione di utenti di eseguire comandi.I problemi sono:
    • Disponibile solo nella versione a 64 bit sono a pasticciare con GetProcAddress
    • disponibile solo in determinate service pack
    • deve identificare singolarmente tutte le sedi che questo dovrebbe essere implementato
    • l'utente dovrà fornire separata informazioni su se questo è un 64 bit app o 32 bit.

Se qualcuno aveva qualche esempio di codice che ha mostrato un Windows OpenFile finestra di dialogo (per esempio utilizzando MFC CFileDialog) mostrando nativly for XP/Vista e che consentono la visione di 64 bit directory system32, sarebbe fantastico.

Se qualcuno avesse un esempio di lanciare il nome dell'app, che sarebbe anche grande!

Edit:
Attualmente utilizziamo CreateProcess per il lancio dell'app (che non risponde).

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);
È stato utile?

Soluzione

Sono andato con l'opzione 2, Per coloro che potrebbero essere interessati;qui è il mio rapido hack in un ambito versione di gestire la disattivazione di Wow64 reindirizzamento basato su appunti da MS.Sarà reindirizzare se l'API è disponibile, si aspetta che kernel32.dll è già disponibile.

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 così l'uso sarebbe

Wow64RedirectOff scopedRedirect;
//CFileOpen
//CreateProcess

Altri suggerimenti

Si sono sempre reindirizzati a Windows/SysWoW64?Sono in grado di lanciare a 64 bit app dal Windows/System32 da un OpenFile in un gestito a 32 bit eseguibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top