2017-07-07 3 views
-1

Je suis confrontée à un problème avec Wow64DisableWow64FsRedirection().La fonction Wow64DisableWow64FsRedirection() ne fonctionne pas lorsqu'elle est compilée pour 64 bits dans Visual Studio dans Windows 10

Lorsque je compile une plate-forme 64 bits dans Visual Studio 2010, il ne fonctionne pas dans la fenêtre 10, il revient avec l'erreur 1.

Mais, quand je compile une plate-forme 32 bits à la place, la fonction est disponible dans la fenêtre 10.

typedef BOOL(__stdcall *tFSRED)(HMODULE); 

HMODULE hKernel = LoadLibrary(_T("Kernel32.dll")); // Get Kernel module handle 
if (hKernel == NULL) 
{ 
    return 2; 
} 

tFSRED pFunc; 
pFunc = (tFSRED) GetProcAddress(hKernel, "Wow64DisableWow64FsRedirection"); 
ret = pFunc(&oldValue); // Turn the file the file system redirector off 
if (ret == FALSE) 
{ 
    _tprintf(_T("\nFile System Redirection could not be turned off. Reason: %d"), GetLastError()); 
    return 4; 
} 
// ret is always TRUE when compile through 32-bit platform 
// but ret return FALSE when compile through 64-bit platform 

dans Visual studio, si je compile pour la plate-forme 64 bits, puis après la compilation si j'ouvre le fichier EXE généré en depends.exe, il montre 64 devant l'EXE. Après la sélection d'une plate-forme 32 bits, le fichier EXE généré est de 32 bits. Ce EXE fonctionne dans mon cas, mais je veux que mon EXE soit 64 bits, donc je sélectionne la plate-forme 64 bits et j'obtiens un EXE 64 bits, mais cela ne fonctionne pas comme je l'ai expliqué ci-dessus.

+0

Incluez le code dans le corps de la question afin de pouvoir le formater correctement en tant que code. – zett42

Répondre

0

L'émulation WOW64 s'applique uniquement aux exécutables 32 bits exécutés sur un système 64 bits. Un EXE 64 bits ne devrait pas essayer d'utiliser les fonctions WOW64 (autres que peut-être IsWow64Process()) car le fichier EXE ne fonctionnera pas dans WOW64 pour commencer. C'est pourquoi vous obtenez le code d'erreur 1 (ERROR_INVALID_FUNCTION) dans votre fichier EXE 64 bits.

Alors, que ce soit:

  • ifdef le code pour sauter les fonctions WOW64 dans une compilation 64 bits:

    #ifndef _WIN64 
    typedef BOOL (WINAPI *tFSDisable)(PVOID*); 
    typedef BOOL (WINAPI *tFSRevert(PVOID); 
    
    HMODULE hKernel = GetModuleHandle(_T("Kernel32")); 
    tFSDisable pDisableFunc = (tFSDisable) GetProcAddress(hKernel, "Wow64DisableWow64FsRedirection"); 
    tFSRevert pRevertFunc = (tFSRevert) GetProcAddress(hKernel, "Wow64RevertWow64FsRedirection"); 
    
    PVOID oldValue; 
    
    if ((pDisableFunc) && (pRevertFunc)) 
    { 
        if (!pDisableFunc(&oldValue)) // Turn off the file system redirector 
        { 
         _tprintf(_T("\nFile System Redirection could not be turned off. Reason: %d"), GetLastError()); 
         return 4; 
        } 
    } 
    #endif 
    
    // do file system operations as needed... 
    
    #ifndef _WIN64 
    if ((pDisableFunc) && (pRevertFunc)) 
    { 
        if (!pRevertFunc(oldValue)) // Restore the file system redirector 
        { 
         _tprintf(_T("\nFile System Redirection could not be restored. Reason: %d"), GetLastError()); 
         return 5; 
        } 
    } 
    #endif 
    
  • omettent le ifdef et il suffit d'appeler les fonctions de WOW64 que si IsWow64Process() rapports le processus actuel fonctionne réellement à l'intérieur de WOW64:

    typedef BOOL (WINAPI tW64P)(HANDLE, PBOOL); 
    typedef BOOL (WINAPI *tFSDisable)(PVOID*); 
    typedef BOOL (WINAPI *tFSRevert(PVOID); 
    
    HMODULE hKernel = GetModuleHandle(_T("Kernel32")); 
    
    tW64P pIsWow64Func = (tW64P) GetProcAddress(hKernel, "IsWow64Process"); 
    tFSDisable pDisableFunc = NULL; 
    tFSRevert pRevertFunc = NULL; 
    
    BOOL bIsWow64 = FALSE; 
    if (pIsWow64Func) 
    { 
        pIsWow64Func(GetCurrentProcess(), &bIsWow64); 
        if (bIsWow64) 
        { 
         pDisableFunc = (tFSDisable) GetProcAddress(hKernel, "Wow64DisableWow64FsRedirection"); 
         pRevertFunc = (tFSRevert) GetProcAddress(hKernel, "Wow64RevertWow64FsRedirection"); 
        } 
    } 
    
    PVOID oldValue; 
    
    if ((pDisableFunc) && (pRevertFunc)) 
    { 
        if (!pDisableFunc(&oldValue)) // Turn off the file system redirector 
        { 
         _tprintf(_T("\nFile System Redirection could not be turned off. Reason: %d"), GetLastError()); 
         return 4; 
        } 
    } 
    
    // do file system operations as needed... 
    
    if ((pDisableFunc) && (pRevertFunc)) 
    { 
        if (!pRevertFunc(oldValue)) // Restore the file system redirector 
        { 
         _tprintf(_T("\nFile System Redirection could not be restored. Reason: %d"), GetLastError()); 
         return 5; 
        } 
    }