Wow64DisableWow64FsRedirection 関数 (wow64apiset.h)

呼び出し元スレッドのファイル システム リダイレクトを無効にします。 ファイル システムのリダイレクトは、既定で有効になっています。

構文

BOOL Wow64DisableWow64FsRedirection(
  [out] PVOID *OldValue
);

パラメーター

[out] OldValue

WOW64 ファイル システムのリダイレクト値。 システムは、このパラメーターを使用して、ファイル システムのリダイレクトを元に戻す (再有効化) するために必要な情報を格納します。

メモ この値は、システムでのみ使用されます。 予期しない動作を回避するには、この値を何らかの方法で変更しないでください。
 

戻り値

関数が成功した場合、戻り値は 0 以外の値になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

この関数は、ネイティブ system32 ディレクトリにアクセスする 32 ビット アプリケーションに役立ちます。 既定では、WOW64 ファイル システムのリダイレクトが有効になっています。

Wow64DisableWow64FsRedirection/Wow64RevertWow64FsRedirection 関数のペアリングは、Wow64EnableWow64FsRedirection 関数の機能に代わるものです。

ファイル システムのリダイレクトを復元するには、 Wow64RevertWow64FsRedirection 関数を呼び出します。 Wow64DisableWow64FsRedirection 関数が正常に呼び出されるたびに、Wow64RevertWow64FsRedirection 関数を呼び出す必要があります。 これにより、リダイレクトが再び有効になり、関連するシステム リソースが解放されます。

メモWow64DisableWow64FsRedirection 関数は、現在のスレッドによって実行されるすべてのファイル操作に影響します。これにより、ファイル システムのリダイレクトが長時間無効になっている場合に意図しない結果が生じる可能性があります。 たとえば、DLL の読み込みはファイル システムのリダイレクトに依存するため、ファイル システムのリダイレクトを無効にすると、DLL の読み込みが失敗します。 また、多くの機能実装では遅延読み込みが使用され、リダイレクトが無効になっている間は失敗します。 初期遅延読み込み操作の失敗状態は保持されるため、後続の遅延読み込み関数の使用は、ファイル システムのリダイレクトが再度有効になった後でも失敗します。 これらの問題を回避するには、リダイレクトしてはならない特定のファイル I/O 関数 ( CreateFile など) を呼び出す直前にファイル システムのリダイレクトを無効にし、 Wow64RevertWow64FsRedirection を使用してすぐにファイル システムのリダイレクトを再度有効にします。
 
ファイル システムのリダイレクトを無効にすると、現在のスレッドによって行われた操作にのみ影響します。 CreateProcessAsUser などの一部の関数は、呼び出し元スレッドのファイル システム リダイレクトの状態の影響を受けず、別のスレッドで作業を行います。

Windows 8 と Windows Server 2012 では、この関数は、次のテクノロジによってサポートされています。

テクノロジ サポートされています
サーバー メッセージ ブロック (SMB) 3.0 プロトコル いいえ
SMB 3.0 Transparent Failover (TFO) いいえ
スケールアウト ファイル共有 (SO) を使う SMB 3.0 いいえ
クラスターの共有ボリューム ファイル システム (CsvFS) はい
Resilient File System (ReFS) いいえ
 

次の例では 、Wow64DisableWow64FsRedirection を使用してファイル システムのリダイレクトを無効にして、WOW64 で実行されている 32 ビット アプリケーションが %SystemRoot%\SysWOW64 の 32 ビット バージョンにリダイレクトされるのではなく、%SystemRoot%\System32 で 64 ビット バージョンの Notepad.exe を開くことができるようにします。

#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0501

#ifdef NTDDI_VERSION
#undef NTDDI_VERSION
#endif
#define NTDDI_VERSION 0x05010000

#include <Windows.h>

void main()
{
    HANDLE hFile = INVALID_HANDLE_VALUE;
    PVOID OldValue = NULL;

    //  Disable redirection immediately prior to the native API
    //  function call.
    if( Wow64DisableWow64FsRedirection(&OldValue) ) 
    {
        //  Any function calls in this block of code should be as concise
        //  and as simple as possible to avoid unintended results.
        hFile = CreateFile(TEXT("C:\\Windows\\System32\\Notepad.exe"),
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);

        //  Immediately re-enable redirection. Note that any resources
        //  associated with OldValue are cleaned up by this call.
        if ( FALSE == Wow64RevertWow64FsRedirection(OldValue) )
        {
            //  Failure to re-enable redirection should be considered
            //  a critical failure and execution aborted.
            return;
        }
    }
    
    //  The handle, if valid, now can be used as usual, and without
    //  leaving redirection disabled. 
    if( INVALID_HANDLE_VALUE != hFile )  
    {
        // Use the file handle
    }
}

要件

要件
サポートされている最小のクライアント Windows Vista、Windows XP Professional x64 Edition [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008、Windows Server 2003 SP1 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー wow64apiset.h (Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

File Management 関数

ファイル システム リダイレクター

Wow64EnableWow64FsRedirection

Wow64RevertWow64FsRedirection