Windows Vista での Win32 I/O キャンセルのサポート

 

Microsoft Corporation

2005 年 9 月

ジェラルド・マッフェオとポール・スリウォヴィチ
Microsoft Corporation

要約

このホワイトペーパーは、独立系ソフトウェア ベンダーや、Windows アプリケーションの堅牢性を向上させるために新しいキャンセル サポートを活用することに関心がある他のユーザーを対象としています。 これにより、低速またはブロックされたファイルの入出力から直接取り消しと回復を行うことで、カスタマー エクスペリエンスを向上させることができます。

Windows Vista では、カーネルとドライバーの機能強化、および新しい Win32 アプリケーション プログラミング インターフェイスが提供され、ネイティブ Win32 ファイル管理機能の延長取り消しが可能になります。 これには、同期操作を取り消す新しいサポートが含まれます。

このホワイトペーパーでは、開発者にファイル I/O キャンセルのサポートをアプリケーションに組み込むのに十分な詳細な情報を提供します。

内容

はじめに
バックグラウンド
Vista の取り消しの機能強化
新しいファイル I/O キャンセル API の使用
非同期 I/O の取り消し
同期 I/O の取り消し
まとめ
関連リンク
付録 A: 新しい I/O キャンセル API
付録 B: 取り消し可能なファイル I/O API

はじめに

このホワイトペーパーでは、Windows Vista での Win32 ファイル入出力 (I/O) 操作の新しいキャンセル サポートについて説明し、ネイティブ (アンマネージド) アプリケーションでの使用を可能にする詳細情報を提供します。

このペーパーの説明は、ネイティブ コードにのみ適用されることに注意してください。 .Net Framework ライブラリ (WinFX) の取り消しは、現在、低レベルのファイル I/O の取り消しをサポートするために使用できません。

バックグラウンド

アプリケーションの終了エラー

Windows アプリケーションは、ユーザーが閉じようとした後 (たとえば、タイトル バーの Red-X をクリックして) 完全に終了できない場合があります。 このような場合のアプリケーションは終了しているように見えますが、さらに検査すると、アプリケーションのプロセスがプロセス リストに保持されていることが示されます (これは "ゾンビ" プロセスと呼ばれます)。 ゾンビを殺す試みは失敗します。 これにより、多くの場合、アプリケーションの再起動の試行がブロックされるか、予期しない動作が発生する可能性があります。 多くの場合、回復するためにコンピュータを再起動する必要があります。

この動作に関する多くの逸話的な報告があり、障害のあるドライバーが原因であると考えましたが、根本的な原因とその修正方法を判断するには、ハード データが必要でした。 このデータを収集するために、スタックプロセスのためにまだ保留中のドライバー要求を含むカーネルデータを収集して報告する特別にインストルメント化されたバージョンのWindows XPを開発しました。 このインストルメンテーションは、Microsoft の内部ユーザーと、特別なテクニカル ベータ プログラムを通じて選択した顧客の両方に展開しました。

これらのレポートでは、予期した内容だけでなく、終了エラーの大部分とアプリケーションの応答が原因で、ドライバーの作成要求を取り消すウィンドウとドライバーの機能が不足していることも確認されました。 これらのエラーに対処するには、Windows で変更が必要になります。

アプリケーションの取り消しサポート

ファイル操作によって、アプリケーションのスレッドの継続が正当にブロックされる可能性があります。 適切に設計された応答性の高いアプリケーションは、少なくとも 2 つのスレッドで構成されます。1 つはユーザー インターフェイス (UI) にサービスを提供し、応答しなくなる可能性のある API を直接または間接的に呼び出しません。 ブロック操作を実行するために、1 つ以上の "worker" スレッドが呼び出されます。

これにより、アプリケーションは [キャンセル] または [停止] ボタンと進行状況インジケーターを使用して取り消しをサポートできます。 多くの場合、ユーザーが操作を中止することにした場合、ワーカー スレッドを無視 (破棄) するだけで十分です。 たとえば、ドメイン ネーム サービス (DNS) リゾルバーまたはその他のネットワーク呼び出しの呼び出しは最終的にタイムアウトになるため、ワーカー スレッドはそれ自体の後にクリーンできます。

ただし、実際の I/O キャンセルをサポートするために必要または望ましい状況は他にもあります。 たとえば、非常に低速な OpenFile デバイスの呼び出しを停止します。特に、別のパラメーターを使用して呼び出しをすぐに再試行する必要がある場合は特にです。 ユーザーが待機する唯一の代替手段は、(おそらく無期限に) アプリケーションを終了することです (前述のように、それ自体が失敗する可能性があります)。 明らかに、要求をキャンセルする機能を顧客に提供することがはるかに好ましいです。 これには、同期キャンセルのサポートを含め、Windows とそのドライバーが完全に取り消しをサポートする必要があります。

Vista の取り消しの機能強化

カーネル、I/O マネージャーの追加

Vista では、ドライバーの作成要求 (IRP_MJ_CREATE) を取り消す機能がサポートされています。 ドライバーの作成要求にマップされる Win32 API には、 と OpenFileが含まれますCreateFile

これは、これらの要求が基になるドライバーによって受け入れられます保証されないことに注意してください。 作成要求の完了に長い時間がかかるドライバーは、取り消しサポートを実装する必要があります。 ドライバー I/O 入力/取り消しのガイドラインを次のように開発しました。 Vista のドライバー検証ツール v2 の新しいオプションと、テストの完了と取り消しの動作をサポートします (「関連リンクのドライバー ハング検証ツール」を参照)。

Microsoft が提供するドライバーでは、必要に応じて作成要求の取り消しがサポートされます。特に、Microsoft Multi-UNC Provider (MUP) と Redirector です。

新しいファイル I/O キャンセル API

Windows XP および Windows Server 2003 ファイル I/O API には、 関数を使用して CancelIo 制限付き I/O キャンセル サポートが存在します。この API は、指定されたファイル ハンドルに対して呼び出し元スレッドによって発行された保留中の非同期 I/O を取り消します。 ただし、 CancelIo 取り消しはサポートされていないため、非常に限られています

  • 他のスレッドによってファイル ハンドルに対して発行された I/O 操作。
  • 特定の I/O 操作。
  • 同期 I/O 操作は、オペレーティング システム内の (定義によって) ブロックされるためです。
  • 完了ポートに発行された I/O、または IOSB 範囲に関連付けられている I/O。

そのため、Longhorn には新しい Win32 キャンセル API が実装されています。 とは異なり CancelIo、新しい CancelIoEx API と CancelSynchronousIo API は保留中の I/O 要求に取り消しのマークを付け、すぐに返すだけです。 これに起因するいくつかの重要なポイント:

  • 取り消し要求をキャンセルする要求にもかかわらず、I/O 要求が正常に完了する可能性があるため、取り消しと完了の間には固有の競合状態があります。
  • 操作が正常に完了したか、取り消されたかを確認する必要があります (キャンセル API を使用して要求を取り消すと、最終的に完了します)。
  • 完了の状態コードは、操作が正常に完了したか、取り消されたか (ERROR_OPERATION_ABORTED)、または他のエラーで失敗したかを示します。

これらの新しい API のプロトタイプを使用できます。関連リンクを参照してください。 詳細については、「付録 A: 新しい I/O 取り消し API」を参照してください。

取り消し可能なファイル I/O API

ほとんどのファイル I/O API は取り消し可能です。

など CopyFile 、少数の複雑な Win32 API はキャンセルできません。 これらの API のキャンセル可能な形式 (例: CopyFileEx) が提供されており、使用する必要があります。 これらの API には、キャンセルのサポートに加えて、呼び出しの進行状況の追跡をサポートするためのコールバックも組み込まれています。

取り消し可能なファイル I/O API の一覧については、付録 B を参照してください。

新しいファイル I/O キャンセル API の使用

非同期 I/O の取り消し

I/O を発行したプロセス内の任意のスレッドから非同期 I/O を取り消すことができます。 I/O が実行されたハンドルと、必要に応じて、I/O の実行に使用された重複した構造体を指定するだけで済みます。 次の例は、タイムアウトを受け取り、読み取りを試行するルーチンを示しています。タイムアウトが切れた場合は を使用 CancelIoEx して取り消します。 呼び出し CancelIoEx は、読み取りが取り消されることを保証するものではありません。読み取りを処理しているドライバーは、それをサポートする必要があり、取り消し可能な状態である必要があります。

非同期の場合は、重複した構造体を取得したとき、または完了コールバックで状態を調べることで、キャンセルが実際に行われたかどうかを確認できます。 ERROR_OPERATION_ABORTEDの状態は、操作が取り消されたことを示します。

BOOL DoCancelableRead(HANDLE hFile,
                 LPVOID lpBuffer,
                 DWORD nNumberOfBytesToRead,
                 LPDWORD lpNumberOfBytesRead,
                 LPOVERLAPPED lpOverlapped,
                 DWORD dwTimeout,
                 LPBOOL pbCancelCalled)
//
// Parameters:
//
//      hFile - An open handle to a readable file or device.
//
//      lpBuffer - A pointer to the buffer to store the data being read.
//
//      nNumberOfBytesToRead - The number of bytes to read from the file or
//          device. Must be less than or equal to the actual size of
//          the buffer referenced by lpBuffer.
//
//      lpNumberOfBytesRead - A pointer to a DWORD to receive the number
//          of bytes read after all I/O is complete or cancelled.
//
//      lpOverlapped - A pointer to a preconfigured OVERLAPPED structure that
//          has a valid hEvent.
//          If the caller does not properly initialize this structure, this
//          routine will fail.
//
//      dwTimeout - The desired time-out, in milliseconds, for the I/O read.
//          After this time expires, the I/O is cancelled.
//
//      pbCancelCalled - A pointer to a Boolean to notify the caller if this
//          routine attempted to perform an I/O cancel.
//
// Return Value:
//
//      TRUE on success, FALSE on failure.
//
{
    BOOL result;
    DWORD waitResult;
    DWORD waitTimer;
    BOOL bIoComplete = FALSE;
    const DWORD PollInterval = 100; // milliseconds

    // Initialize "out" parameters
    *pbCancelCalled = FALSE;
    *lpNumberOfBytesRead = 0;

    // Perform the I/O, in this case a read operation.
    result = ReadFile(hFile,
                  lpBuffer,
                  nNumberOfBytesToRead,
                  lpNumberOfBytesRead,
                  lpOverlapped );

    if (result == FALSE)
    {
        if (GetLastError() != ERROR_IO_PENDING)
        {
            // The function call failed. ToDo: Error logging and recovery.
            return FALSE;
        }
    }
    else
    {
        // The I/O completed, done.
        return TRUE;
    }

    // The I/O is pending, so wait and see if the call times out.
    // If so, cancel the I/O using the CancelIoEx function.

    for (waitTimer = 0; waitTimer < dwTimeout; waitTimer += PollInterval)
    {
        result = GetOverlappedResult( hFile, lpOverlapped, lpNumberOfBytesRead, FALSE );
        if (result == FALSE)
        {
            if (GetLastError() != ERROR_IO_PENDING)
            {
                // The function call failed. ToDo: Error logging and recovery.
                return FALSE;
            }
            Sleep(PollInterval);
        }
        else
        {
            bIoComplete = TRUE;
            break;
        }
    }

    if (bIoComplete == FALSE)
    {
        result = CancelIoEx( hFile, lpOverlapped );

        *pbCancelCalled = TRUE;

        if (result == TRUE || GetLastError() != ERROR_NOT_FOUND)
        {
            // Wait for the I/O subsystem to acknowledge our cancellation.
            // Depending on the timing of the calls, the I/O might complete with a
            // cancellation status, or it might complete normally (if the ReadFile was
            // in the process of completing at the time CancelIoEx was called, or if
            // the device does not support cancellation).
            // This call specifies TRUE for the bWait parameter, which will block
            // until the I/O either completes or is cancelled, thus resuming execution,
            // provided the underlying device driver and associated hardware are functioning
            // properly. If there is a problem with the driver it is better to stop
            // responding, or "hang," here than to try to continue while masking the problem.

            result = GetOverlappedResult( hFile, lpOverlapped, lpNumberOfBytesRead, TRUE );

            // ToDo: check result and log errors.
        }
    }

    return result;
}

同期 I/O の取り消し

I/O を発行したプロセス内の任意のスレッドから同期 I/O を取り消すことができます。 同期 I/O を取り消すには、現在 I/O を実行しているスレッドにハンドルを指定します。

次の例は、2 つのルーチンを示しています。

  • SynchronousIoWorker は、CreateFile の呼び出しから始まる同期ファイル I/O を実装するワーカー スレッドです。 成功した場合は、その後に追加の操作が続きます (表示されません)。 グローバル変数 gCompletionStatus を使用すると、すべての操作が成功したか、操作が失敗したか取り消されたかを判断できます。 グローバル変数 は、 dwOperationInProgressファイル I/O がまだ進行中かどうかを示します。 (この例では、UI スレッドでワーカー スレッドの存在をチェックすることもできます)。では、ファイル I/O 呼び出し間の短い期間取り消しが要求された場合、残りの操作が取り消されることを確認するために、追加の手動チェック (この例では示されていません) が必要SynchronousIoWorkerであることに注意してください。
  • MainUIThreadMessageHandler は、UI スレッドのウィンドウ プロシージャ内のメッセージ ハンドラーをシミュレートします。 ユーザーは、コントロールをクリックして同期ファイル操作のセットを要求します。これにより、ユーザー定義ウィンドウ メッセージ WM_MYSYNCOPSが生成されます。 このコードにより、開始ルーチンを使用 CreateFileThread, して新しいスレッドが作成されます SynchronousIoWorker. 。UI スレッドは、要求された I/O をワーカー スレッドが実行している間もメッセージを処理し続けます。 ユーザーが (通常はキャンセル ボタンを押して) 未完了の操作を取り消すことにした場合、WM_MYCANCELのコードは、 によってCreateFileThread返されるスレッド ハンドルを使用してを呼び出しますCancelSynchronousIoCancelSynchronousIo 取り消しを試みた直後に が返されます。作成が取り消される保証はありません。 最後に、ユーザーまたはアプリケーションは、ファイル操作が完了したかどうかに依存する他の操作を後で要求する場合があります。 この場合、WM_PROCESSDATAのサンプル コードは、最初に操作が完了したことを確認してから、クリーンアップ コードを実行します。 この例では、一連の操作の任意の場所で取り消しが発生していた可能性があるため、呼び出し元は、続行する前に状態が一貫しているか、少なくとも理解されていることを確認する必要がある場合があります。
DWORD gCompletionStatus;      // Completion status for last operation
DWORD dwOperationInProgress;   // TRUE if operation is in progress

VOID
SynchronousIoWorker( VOID * pv )
{
    LPCSTR lpFileName = (LPCSTR) *pv;
    HANDLE hEvent = lpCreateParams->hEvent;
    HANDLE hFile;

    dwOperationInProgress = TRUE;
    gCompletionStatus = ERROR_SUCCESS;
    hFile = CreateFileA( lpFileName,
                         GENERIC_READ,
                         0,
                         NULL,
                         OPEN_EXISTING,
                         0,
                         NULL );


    if (hFile != INVALID_HANDLE_VALUE) {
  
        /* TODO: CreateFile succeeded. Do more synchronous calls with hFile */
        
        if (result == FALSE) {
            // Some operation failed or was cancelled. If cancelled,
            // GetLastError() will return ERROR_OPERATION_ABORTED

            gCompletionStatus = GetLastError();            
        }
             
        CloseHandle(hFile);

    } else {
        // CreateFile failed or was cancelled. If cancelled,
        // GetLastError() will return ERROR_OPERATION_ABORTED
        gCompletionStatus = GetLastError();
    }

    dwOperationInProgress = FALSE;
}



LRESULT
CALLBACK
MainUIThreadMessageHandler(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
)
{
    HANDLE syncThread;

    /* TODO: Miscellaneous initializations, etc. */

    switch (uMsg) {

    case WM_MYSYNCOPS:   // User requested an operation on a file
        /* TODO: Retrieve filename from parameters */

        syncThread = CreateThread( NULL,
                                0,
                                (LPTHREAD_START_ROUTINE)SynchronousIoWorker,
                                &lpFileName,
                                0,
                                NULL );

        if (syncThread == INVALID_HANDLE_VALUE) {
            /* TODO: Handle failure */
        }
        break;
   
    // User clicked a cancel button
    case WM_MYCANCEL:
        if (syncThread != INVALID_HANDLE_VALUE) {
            CancelSynchronousIo(syncThread);
        }
        Break;

    case WM_PROCESSDATA:
        if (!dwOperationInProgress) {
            if (gCompletionStatus == ERROR_OPERATION_ABORTED) {
                /* TODO: Do appropriate cleanup */
            } else if (...) {
                /* TODO: Handle other cases */
            }
        }
        break;
   
    case ...:
        /* TODO: Handle any other cases */
    }

    return TRUE;
}

キャンセルの問題

障害のあるドライバー

残念ながら、基になるドライバーがキャンセルを正しくサポートするという保証はありません。 取り消しが正しく要求されていても、ドライバーは要求された操作の完了をブロックする可能性があります。 さらに悪いことに、取り消しサポートが正しく機能するアプリケーションは、システムの再構成後 (たとえば、ウイルス対策ドライバーやファイアウォール フィルター ドライバーなど) のインストールや更新後に、キャンセル要求への応答を突然停止する可能性があります。

潜在的な競合状態

他のスレッドで I/O 操作を取り消す場合、開発者が認識する必要がある同期の問題があります。

重複する構造体が指定されていない非同期の場合、 の CancelIoEx 呼び出しは、プロセス内のすべてのスレッドでファイル上のすべての未処理の I/O を取り消そうとします。 各スレッドを個別に処理するため、スレッドが処理された後、他のすべてのスレッドがファイルの I/O を取り消す前に、ファイルで別の I/O を開始する可能性があることに注意してください。

さらに、重複する構造体の再利用とターゲットキャンセルを組み合わせる場合は、開発者が注意する必要があります。 I/O 操作が完了すると (正常に、または取り消された状態で) 呼び出 CancelIoEx. した直後に構造体を再利用しても安全ではありません。その後、重複した構造体はシステムによって使用されなくなり、再利用できます。

同期の場合、 の CancelSynchronousIo 呼び出しはスレッドの現在の同期呼び出しを取り消そうとします。 慎重に同期しないと、一連の呼び出しで間違った呼び出しが取り消される可能性があります。 これらは予測不可能であり、まれに発生する傾向があるため、診断が非常に困難です。 考えられるシナリオとして、 が CancelSynchronousIo 呼び出されます。 特定の同期操作を対象としていますが、この操作は、その操作が完了した直後 (通常はエラー) でのみ開始されます。 最初の操作を呼び出したスレッドが別の同期呼び出しを開始すると、キャンセル呼び出しによってこの新しい I/O が中断される可能性があります。 これは大きな影響を与える可能性があります。

スレッド プール スレッドなど、アプリケーションのさまざまな部分間でスレッドが共有されるたびに、同期 I/O にも同様の競合状態が存在する可能性があります。

例として、サブアプリ 1 がスレッド 2 で を呼び出 CreateFile し、スレッド 1 から取り消しを発行するとします。 サブアプリ 2 もスレッド 2 を共有し、それを使用して を呼び出 Flushし、別のスレッドから取り消します。 これらが調整されていない場合、取り消し要求によって間違った操作が取り消される可能性があります。

まとめ

Windows Vista カーネルと多くのドライバーでキャンセルのサポートが改善されました。 同期ファイル要求を取り消せるようにする新しい Win32 アプリケーション プログラミング インターフェイスを使用できます。 これらは、アプリケーション終了の信頼性を向上させることによって Vista の顧客満足度を向上させるように設計されています。 これらは、低速またはブロックされたファイル I/O からの直接取り消しと回復をサポートすることで、ユーザー エクスペリエンスの向上を可能にするようにさらに設計されています。

このホワイトペーパー、特にその参照と付録は、開発者に、アプリケーションへのファイル I/O キャンセルのサポートの構築を開始するための十分な詳細な情報を提供します。

詳細については、次のリソースを参照してください。

付録 A: 新しい I/O キャンセル API

このセクションに含まれる情報は、Vista の新しいキャンセル API に関する追加情報を提供します (関連リンクで使用できる情報を超えています)。 注意: この情報は暫定版であり、変更することがあります。

CancelIoEx

メモ このドキュメントは暫定的なものであり、変更される可能性があります。

CancelIoEx 関数を使用すると、現在のプロセスで指定されたファイル ハンドルに対するすべての保留中の I/O 操作は、どのスレッドが発行したかにかかわらず、取り消し済みとしてマークされます。

BOOL CancelIoEx(
  HANDLE hFile,
  LPOVERLAPPED lpOverlapped
);

パラメーター

  • hFile
    [入力]操作を取り消すファイルを処理します。

  • lpOverlapped
    [入力]非同期 (重複) I/O に使用されるデータを提供する OVERLAPPED データ構造へのポインター。

    lpOverlapped が NULL でない場合、指定された重複した構造体で発行された要求のみが取り消し済みとしてマークされます。それ以外の場合は、ファイル ハンドルに対するすべての I/O 要求が取り消されます。

戻り値

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

関数が失敗した場合は、0 を返します。 拡張エラー情報を取得するには、 GetLast Error を呼び出します。

解説

CancelIoEx はCancelIo と異なり、 CancelIo は CancelIoを呼び出すのと同じスレッドによって発行されたキャンセルされた要求のみをマークします。

指定したファイル ハンドルに対して保留中の I/O 操作が進行中の場合、 CancelIoEx 関数によって取り消しがマークされます。 ほとんどの種類の操作は直ちに取り消すことができますが、他の操作は、実際に取り消されて呼び出し元に通知される前に完了に向けて続行される場合があります。 CancelIoExは、取り消されたすべての操作が完了するまで待機しません。

取り消される操作は最終的に完了します。 完了状態をチェックして、操作が正常に完了したかどうか (キャンセル要求に関係なく発生する可能性があります)、操作が取り消された (完了状態がERROR_OPERATION_ABORTED) かどうか、または操作が他のエラーで失敗したかどうかを判断する必要があります。

必要条件

Client Windows Vista が必要です。
サーバー Windows Server Vista が必要です。
Header Winbase.h で宣言されています。
ライブラリ Kernel32.lib へのリンク。
[DLL] Kernel32.dllが必要です。

CancelSynchronousIo

メモ このドキュメントは暫定的なものであり、変更される可能性があります。

CancelSynchronousIo 関数を使用すると、指定したスレッドによって発行された保留中の同期 I/O 操作が取り消し済みとしてマークされます。

BOOL CancelSynchronousIo(
  HANDLE hThread
);

パラメーター

  • hThread
    [入力]同期 I/O でブロックされているスレッドを処理します。

戻り値

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

関数が失敗した場合は、0 を返します。 拡張エラー情報を取得するには、 GetLast Error を呼び出します。

解説

指定されたスレッドによって発行された保留中の同期 I/O 操作は、取り消し済みとしてマークされます。 ほとんどの種類の操作は直ちに取り消すことができますが、他の操作は、実際に取り消されて呼び出し元に通知される前に完了に向けて続行される場合があります。 CancelSynchronousIoExは、取り消されたすべての操作が完了するまで待機しません。

取り消される操作は最終的に完了します。 完了状態をチェックして、操作が正常に完了したかどうか (キャンセル要求に関係なく発生する可能性があります)、操作が取り消された (完了状態がERROR_OPERATION_ABORTED) かどうか、または操作が他のエラーで失敗したかどうかを判断する必要があります。 このサービスは、ユーザーがまだファイルへのハンドルを持っていないので、キャンセルする必要がある作成要求が発行されている場合に最も便利です。

必要条件

Client Windows Vista が必要です。
サーバー Windows Server Vista が必要です。
Header Winbase.h で宣言されています。
ライブラリ Kernel32.lib へのリンク。
[DLL] Kernel32.dllが必要です。

付録 B: 取り消し可能なファイル I/O API

API 名 キャンセル。 取り消しメカニズム
WalkTree 部分的 WalkTree 自体はキャンセルをサポートしていませんが、列挙コールバックを使用して "ウォーキング" を実行します。このコールバックは、取り消しをサポートし、取り消された場合は列挙を停止するために使用できます。
DeleteTree いいえ 取り消しをサポートしない WalkTree のコールバック。
AreFileApisANSI 該当なし  
CheckNameLegalDOS8Dot3 該当なし  
CloseHandle 該当なし  
CopyFile いいえ CopyFileEx を使用します。
CopyFileEx はい PROGRESS_CANCELを返すことによって進行状況ルーチンで取り消すことができます 。または 、変数 pbCancel を渡し、別の場所で TRUE に設定すると、取り消しが発生します。
CreateFile はい  
CreateHardLink はい  
DeleteFile はい  
FindClose はい  
FindFirstFile はい  
FindFirstFileEx はい  
FindFirstStreamW はい  
FindNextFile はい  
FindNextStreamW はい  
GetBinaryType はい  
GetCompressedFileSize はい  
GetFileAttributes はい  
GetFileAttributesEx はい  
GetFileInformationByHandle はい  
GetFileSize はい  
GetFileSizeEx はい  
GetFileTime はい  
GetFileType はい  
GetFullPathName はい  
GetLongPathName はい  
GetShortPathName はい  
GetTempFileName はい  
GetTempPath はい  
MoveFile いいえ MoveFileWithProgress を使用します。
MoveFileEx いいえ MoveFileWithProgress を使用します。
MoveFileWithProgress はい 進行状況ルーチンは、PROGRESS_STOPまたはPROGRESS_CANCELを返して操作を停止できます。は、CopyFile のようにブール型のキャンセルをサポートしていません。
ReplaceFile いいえ 取り消し不可能なストリーム コピーの一部を実行します。
SearchPath はい  
SetFileApisToANSI 該当なし  
SetFileApisToOEM 該当なし  
SetFileAttributes はい  
SetFileSecurity はい  
SetFileShortName はい  
SetFileTime はい  
SetFileValidData はい  
CreateIoCompletionPort 該当なし  
FlushFileBuffers はい  
GetQueuedCompletionStatus はい ユーザー モードの待機は中断される可能性があります。
LockFile はい  
LockFileEx はい  
PostQueuedCompletionStatus 該当なし  
ReadFile はい  
ReadFileEx はい  
ReadFileScatter はい  
SetEndOfFile はい  
SetFilePointer はい  
SetFilePointerEx はい  
UnlockFile はい  
UnlockFileEx はい  
WriteFile はい  
WriteFileEx はい  
WriteFileGather はい  
CreateFileMapping はい  
FlushViewOfFile はい  
MapViewOfFile はい  
MapViewOfFileEx はい  
OpenFileMapping 該当なし  
UnmapViewOfFile 該当なし  

 

このドキュメントに含まれる情報は、取り上げている問題についての、公開時点における Microsoft Corporation の見解を表します。 Microsoft は変化する市場状況に対応する必要があるため、これを Microsoft による確約と解釈しないでください。Microsoft は、記載されている情報の公開後の正確さを保証できません。

このドキュメントは、参考目的でのみ使用してください。 マイクロソフトは、明示であると黙示であるとを問わず、このドキュメントに記載された情報について一切の保証を行いません。

お客様ご自身の責任において、適用されるすべての著作権関連法規に従ったご使用を願います。 このソフトウェアおよびマニュアルのいかなる部分も、米国 Microsoft Corporation の書面による許諾を受けることなく、その目的を問わず、どのような形態であっても、複製または譲渡することは禁じられています。ここでいう形態とは、複写や記録など、電子的な、または物理的なすべての手段を含みます。

Microsoft は、このマニュアルに記載されている内容に関し、特許、特許申請、商標、著作権、またはその他の無体財産権を有する場合があります。 別途マイクロソフトのライセンス契約上に明示の規定がない限り、このドキュメントはこれらの特許、商標、著作権、またはその他の無体財産権に関する権利をお客様に許諾するものではありません。

このソフトウェアおよび関連するドキュメントで例として使用している会社、組織、製品、人物、出来事などの名称は架空のものです。 実在する商品名、団体名、個人名などとは一切関係ありません。 © 2004 Microsoft Corporation. All rights reserved.

Microsoft、Windows、Windows Vista は、米国およびその他の国における Microsoft Corporation の登録商標または商標です。

本ドキュメントで説明する実際の製造元および製品名は、それぞれの所有者の商標である場合があります。