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

Microsoft Corporation

2005 年 9 月

日本語版最終更新日 2006 年 6 月 19 日

Gerald Maffeo および Paul Sliwowicz

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 アプリケーションは、ユーザーがアプリケーションを閉じたときに (タイトル バーの [X] をクリックした場合など)、正常に終了しないことがあります。このような場合、アプリケーションのウィンドウは閉じますが、よく調べると、アプリケーションのプロセスがプロセス リストに残ったままになっています。このようなプロセスは、"ゾンビ" プロセスと呼ばれます。ゾンビ プロセスは強制終了できません。ゾンビ プロセスによってアプリケーションの再起動ができない場合があり、予期しない動作が行われることもあります。復旧するには、コンピュータの再起動が必要になる場合があります。

マイクロソフトでは、このような動作に関する事例報告を多数受けており、その原因は障害のあるドライバによるものと推測していました。また、根本的な原因を特定し、その解決方法を明確にするために、信頼のできるデータを調査していました。このようなデータを収集するために、特殊な機能を備えた Windows XP のバージョンを開発しました。このバージョンは、カーネル データの収集とレポートを行います。このデータには、スタック プロセスを待機するドライバ要求に関するデータも含まれています。特別なテクニカル ベータ プログラムを通じて、このバージョンを、マイクロソフトの内部ユーザー、および選抜した顧客に対して展開しました。

報告されたレポートを調べると、弊社で推測していた原因だけでなく、終了時の障害やアプリケーションからの応答がないという問題は、Windows やドライバに、ドライバでの作成要求をキャンセルする機能がないということも原因であることが確認されました。このような障害を解決するために、Windows を修正する必要があったのです。

アプリケーションのキャンセル サポート

ファイル操作では、アプリケーションのスレッドをブロックして、処理の継続を中断できます。適切に設計され、正常に応答するアプリケーションは、少なくとも 2 つのスレッドから構成されます。このようなアプリケーションのスレッドでは、ユーザー インタフェース (UI) のサービスを行い、未応答の原因となり得る API を直接的にも間接的にも呼び出しません。操作をブロックする場合は、1 つ以上の "ワーカー" スレッドが起動されます。

このワーカー スレッドを利用することにより、アプリケーションで、[Cancel] や [Stop] ボタン、または処理状況インジケータを使用したキャンセルをサポートできます。多くの場合、ユーザーが操作を中止するときは、ワーカー スレッドを無視しても問題はありません (ワーカー スレッドに対して操作を行わない)。たとえば、ドメイン ネーム サービス (DNS) リゾルバの呼び出しや、他のネットワーク呼び出しが、最終的にタイム アウトになると、ワーカー スレッドはワーカー スレッド自身をクリーン アップします。

ただし、能動的な I/O キャンセルのサポートが必要になる場合もあります。その例として、非常に低速なデバイスに対する OpenFile 呼び出しの停止が挙げられます。この呼び出しを直ちに再実行するとき、場合によっては、別のパラメータの使用が必要になります。このような状況が発生した場合、ユーザーが必要とする唯一の対処方法は、アプリケーションの終了です (前に説明したように、アプリケーションが予期しない動作をしてしまう可能性があります)。このことからも、要求のキャンセル機能をユーザーに提供することが、非常に期待されていることは明らかです。前にも説明しましたが、これを実現するには、Windows とそのドライバ群がキャンセルを完全にサポートする必要があります。このサポートでは、同期操作のキャンセルも対象となります。

Vista でのキャンセルの拡張

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

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

このような要求は、基礎となるドライバによって必ずしも発生するというわけではありません。作成要求の完了に時間のかかるドライバには、キャンセル   サポートを実装する必要があります。マイクロソフトでは、ドライバ I/O の完了とキャンセルに関するガイドラインを作成しました。また、Vista のドライバ検証ツール v2 用の新しいオプションを開発し、完了動作とキャンセル動作のテストをサポートしています (関連リンクの Driver Hang Verifier を参照してください)。

マイクロソフト提供のドライバは、必要に応じて作成要求のキャンセルをサポートします。特に Microsoft Multi-UNC Provider (MUP) やリダイレクタでは、頻繁に利用されます。

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

Windows XP や Windows Server 2003 のファイル I/O API は、制限付きの I/O キャンセル サポート機能を備えています。このサポートでは、特定のファイル ハンドルに対する呼び出しスレッドによって発行された、保留中の非同期 I/O を、 CancelIo 関数を使用してキャンセルします。ただし、 CancelIo は機能が限定されており、以下のキャンセルはサポートしていません。

  • 他のスレッドがファイルハンドルに対して発行した I/O 操作

  • 特定の I/O 操作

  • 同期 I/O 操作 (この操作がオペレーティング システムで事実上ブロックされた以降)

  • 完了ポートに対して発行された I/O、または IOSB 範囲に関連付けられている I/O

以上のような理由により、新しい Win32 キャンセル API が Windows Vista に実装されました。CancelIo とは異なり、新しい CancelIoEx と CancelSynchronousIo API は、キャンセルの対象となる保留中の I/O 要求にマークを付け、直ちに返します。このため、次のことが重要なポイントとなります。

  • キャンセルと完了の間には固有の競合状態があります。これは、I/O 要求をキャンセルする要求が存在しても、I/O 要求は正常に完了することができるためです。

  • 操作が正常に完了したか、キャンセルされたかを検証する必要があります (キャンセル API を使用して要求をキャンセルした場合、最終的には要求は完了します)。

  • 完了のステータス コードは、操作が正常に完了したか、キャンセルされた (ERROR_OPERATION_ABORTED) かを示します。また何らかのエラーによって、失敗したことを示す場合もあります。

これらの新しい API のプロトタイプを利用できます。関連リンクを参照してください。完全な情報は、「付録A : 新しい I/O キャンセル API」に記載されています。

キャンセル可能なファイル I/O API

ほとんどのファイル I/O API はキャンセルが可能です。

ただし、 CopyFile などの、一部の複雑な Win32 API は、キャンセルできません。 CopyFileEx などのキャンセル可能な API が提供されていますので、そちらの使用を推奨します。これらの API には、キャンセルのサポートだけでなく、呼び出しの進行状況を追跡するためのコールバックが組み込まれています。

キャンセル可能なファイル I/O API の一覧については、「付録 B」を参照してください。

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

非同期 I/O のキャンセル

非同期 I/O は、I/O を発行したプロセス内のどのスレッドからでもキャンセルできます。これを行うには、I/O が実行されているハンドルを指定するだけです。オプションとして、I/O の実行で使用された、オーバーラップした構造体も指定できます。次の例で示すルーチンでは、タイムアウトを使用し、読み取りを実行します。タイムアウトの期限が切れると、 CancelIoEx によって読み取りがキャンセルされます。ただし、CancelIoEx の呼び出しによって読み取りが必ずキャンセルされるとは限りません。キャンセル処理するドライバが、このキャンセル可能な API をサポートしている必要がある点に注意してください。

非同期の場合は、オーバーラップした構造体を受け取るときや、完了コールバック使用時のステータスを調べることによってキャンセルを実行するかどうかを判別できます。ERROR_OPERATION_ABORTED のステータスは、操作がキャンセルされたことを示します。

BOOL
DoCancelableRead(
    HANDLE hFile,
    LPVOID lpBuffer,
    DWORD nNumberOfBytesToRead,
    LPDWORD lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped,
    DWORD dwTimeout,
    LPBOOL bCancelCalled
)
{
    BOOL result;
    DWORD waitResult;
 
    *bCancelCalled = FALSE;
    result = ReadFile( hFile,
                       lpBuffer,
                       nNumberOfBytesToRead,
                       lpNumberOfBytesRead,
                       lpOverlapped );
 
if (!result) {
        if (GetLastError() != ERROR_IO_PENDING) {
            return result; 
        }
    } else {
        return result;
    }
 
    //
    // I/O が保留状態になりました。タイムアウトを待機します。
    // ルーチンを呼び出す前に
    // オーバーラップしたイベントが設定されている必要があります。
    //
    waitResult = WaitForSingleObject( lpOverlapped->hEvent,
                                      dwTimeout );
 
    if (waitResult == WAIT_TIMEOUT) {
        result = CancelIoEx( hFile,
                             lpOverlapped );
 
        *bCancelCalled = TRUE;
 
        //
        // I/O の完了を待機します (キャンセルされる場合と
        // キャンセルされない場合があります)
        //
     waitResult = WaitForSingleObject( lpOverlapped->hEvent,
                                          0 );
    }
 
    return result;
}

同期 I/O のキャンセル

同期 I/O は、I/O を発行したプロセス内のどのスレッドからでもキャンセルできます。同期 I/O をキャンセルするには、現在 I/O を実行しているスレッドに対するハンドルを指定します。

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

  • SynchronousIoWorker は、CreateFile の呼び出しから始まる、同期ファイル I/O を実装するワーカー スレッドです。同期ファイル I/O が成功すると、後続の操作が実行されます (この例では示されていません)。グローバル変数 gCompletionStatus は、すべての操作が成功したかどうか、または操作が失敗/キャンセルされたかどうかを判別する場合に使用されます。グローバル変数 dwOperationInProgress は、ファイル I/O が処理中であるかどうかを示します。この例では、UI スレッドはワーカー スレッドの存在をチェックできます。SynchronousIoWorker では、手動による補足のチェック (この例では示されていません) が必要になることに注意してください。これは、各ファイル I/O の呼び出し間のわずかな期間にキャンセルが要求されたことを確認するための操作です。キャンセルが要求された場合は、残りの操作はキャンセルされます。

  • MainUIThreadMessageHandler は、UI スレッドのウィンドウ プロシージャ内にあるメッセージ ハンドラをシミュレートします。コントロールをクリックすると、同期ファイル操作のセットが要求されます。これにより、ユーザー定義のウィンドウ メッセージ WM_MYSYNCOPS が生成されます。このメッセージ用のコードによって、 SynchronousIoWorker で始まるルーチンである CreateFileThread を含んだ新しいスレッドが作成されます。要求された I/O をワーカー スレッドが実行している間、UI スレッドはメッセージの処理を継続します。未完了の操作をキャンセルする場合 (通常はキャンセル ボタンをクリック)、WM_MYCANCEL のコードでは、CreateFileThread によって返されたスレッド ハンドルを使用して、CancelSynchronousIo を呼び出します。CancelSynchronousIo は、キャンセルの実行後直ちに制御を戻します。ただし、作成操作は、必ずしもキャンセルされるとは限りません。ユーザーまたはアプリケーションは、後で、ファイル操作が完了したかどうかの影響を受ける他の操作を要求する場合があります。このような場合、WM_PROCESSDATA 部分のサンプル コードでは、最初に操作の完了状態を確認し、その次にクリーンアップ コードを実行します。この例では、操作シーケンスのどの部分でもキャンセルが発生し、完了状態が変化してしまう可能性があります。このため、処理を継続する場合、呼び出し元は、完了状態が変化していないこと確認しておくか、少なくとも状態が変化してはならないことを理解しておく必要があります。

DWORD gCompletionStatus;      // 前回の操作の完了状態
DWORD dwOperationInProgress;   // 操作が実行中の場合は TRUE
 
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 が成功した場合は、hFile を使用してさらに同期呼び出しを実行 */
        if (result == FALSE) {
            // 操作が失敗、またはキャンセルされました。キャンセルされた場合は
            // GetLastError() は ERROR_OPERATION_ABORTED を返します。
 
            gCompletionStatus = GetLastError();            
        }
        CloseHandle(hFile);
 
    } else {
        // CreateFile が失敗、またはキャンセルされました。キャンセルされた場合は、
        // GetLastError() は ERROR_OPERATION_ABORTED を返します。
        gCompletionStatus = GetLastError();
    }
 
    dwOperationInProgress = FALSE;
}
 
 
 
LRESULT
CALLBACK
MainUIThreadMessageHandler(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
)
{
    HANDLE syncThread;
 
    /* TODO: その他の初期処理など. */
 
    switch (uMsg) {
 
    case WM_MYSYNCOPS:   // ユーザーがファイルに対する操作を要求しました
        /* TODO: パラメータからファイル名を取得 */
 
        syncThread = CreateThread( NULL,
                                0,
                                (LPTHREAD_START_ROUTINE)SynchronousIoWorker,
                                &lpFileName,
                                0,
                                NULL );
 
        if (syncThread == INVALID_HANDLE_VALUE) {
            /* TODO: 失敗時の処理 */
        }
        break;
    // ユーザーがキャンセル ボタンをクリックしました
    case WM_MYCANCEL:
        if (syncThread != INVALID_HANDLE_VALUE) {
            CancelSynchronousIo(syncThread);
        }
        Break;
 
    case WM_PROCESSDATA:
        if (!dwOperationInProgress) {
            if (gCompletionStatus == ERROR_OPERATION_ABORTED) {
                /* TODO: 適切なクリーンアップを実行 */
            } else if (...) {
                /* TODO: 他のケースを処理 */
            }
        }
        break;
    case ...:
        /* TODO: 他のすべてのケースを処理 */
    }
 
    return TRUE;
}

キャンセルの原因

障害のあるドライバ

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

潜在的な競合状態

別のスレッドで I/O 操作をキャンセルする場合、開発者が考慮する必要のある同期の問題が発生します。

非同期の場合、オーバーラップした構造体を指定しないと、CancelIoEx の呼び出しによって、プロセス内にあるすべてのスレッドにおける未処理のファイル I/O がキャンセルされます。この API はスレッドを個別に処理するため、1 つのスレッドを処理した後で、ファイルに対する別の I/O のキャンセルが処理されます。他のすべてのスレッドにおけるファイル I/O のキャンセルが終了するまで、このような処理が行われることに注意してください。

また開発者は、オーバーラップした構造体と対象となるキャンセルを組み合わせて再使用する場合にも注意する必要があります。 CancelIoEx を呼び出した直後に構造体を再使用するのは、安全ではありません。I/O 操作が完了すると (ステータスが成功またはキャンセルのどちらの場合でも)、オーバーラップした構造体はシステムでは未使用になり、再使用が可能になります。

同期の場合、CancelSynchronousIo の呼び出しによって、スレッドでの現在の同期呼び出しがキャンセルされます。同期を慎重に行わないと、一連の呼び出しで間違った呼び出しがキャンセルされる場合があります。呼び出しは予測不可能であり、めったに発生しない場合もあります。このため、呼び出しの分析は非常に困難です。呼び出しの分析に使用できる方法として、CancelSynchronousIo の呼び出しがあります。この API は指定された同期操作のみに使用できるものですが、その操作の完了後 (正常終了やエラーの発生に関わらず) のみに起動されます。スレッドが最初の操作を呼び出した後で、別の同期呼び出しを開始する場合、キャンセル呼び出しによって、この新しい I/O が中断される場合があります。これが原因で重大な結果が生じることもあるため、キャンセルには注意が必要です。

同期 I/O には、もう一つ同様な競合状態があります。スレッドが、スレッド プール スレッドなどの、アプリケーションの異なる部分で共有される場合です。

その例として、サブアプリケーション 1 がスレッド 2 で CreateFile を呼び出し、スレッド 1 からキャンセルを発行する場合を考えてみましょう。また、サブアプリケーション 2 がスレッド 2 を共有し、これを使用して、別のスレッドからキャンセルを実行する Flush を呼び出すとします。これらのスレッドが適切に調整されていない場合、キャンセル要求によって、間違った操作がキャンセルされる可能性があります。

まとめ

Windows Vista のカーネルやドライバでは、キャンセル サポートの機能が向上しています。新しい Win32 アプリケーション プログラミング インターフェイスを使用すると、ファイルへの同期要求をキャンセルできます。これらの API は、アプリケーションの終了に関する信頼性を高めて、Vista のユーザー要求を満足させるために開発されました。また、低速なファイル入出力やブロックされたファイル入出力に関するダイレクト キャンセルおよび復旧のサポートによって、ユーザー エクスペリエンスが向上します。

このホワイトペーパー (参照情報や付録を含む) では、開発者向けの詳細な情報について説明し、アプリケーションにファイル I/O キャンセルのサポートを組み込むことができるようにします。

関連リンク

詳細情報については、以下のリソースをご覧ください。

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

この付録に記載されている情報は、Vista の新しいキャンセル API (「関連リンク」を参照) に関する追加情報です。ただし、この情報は暫定的なものであり、変更される場合があります。

CancelIoEx

注意    この情報は暫定的なものであり、変更される場合があります。

CancelIoEx 関数によって、現在のプロセス内にある、指定されたファイル ハンドルに対して保留中のすべての I/O 操作がキャンセルとマークされます。これは、I/O 操作を発行したすべてのスレッドに対して行われます。

BOOL CancelIoEx(
  HANDLE Error! Hyperlink reference not valid.,
  LPOVERLAPPED Error! Hyperlink reference not valid.
);
パラメータ

hFile

[入力] キャンセルされる I/O 操作の対象となるファイルへのハンドルです。

lpOverlapped

[入力] OVERLAPPED (英語) データ構造体へのポインタです。非同期の (オーバーラップした) I/Oで使用されるデータを提供します。

lpOverlapped が NULL でない場合、指定のオーバーラップした構造体を使用して発行された要求だけが、キャンセルとマークされます。NULL の場合は、ファイル ハンドルに対するすべての I/O 要求がキャンセルされます。

戻り値

キャンセル操作が成功すると、戻り値は 0 以外の値になります。

この関数が失敗すると、戻り値は 0 になります。詳細なエラー情報が必要な場合は、GetLast Error (英語) を呼び出します。

参考

CancelIoExCancelIo は異なります。CancelIo は、CancelIo を呼び出したスレッドによって発行された I/O 要求だけがキャンセルとマークされます。

指定したファイル ハンドルに対して保留中の I/O 操作が存在する場合、CancelIoEx 関数では、それらすべての操作がキャンセルとマークされます。ほとんどの種類の操作は、直ちにキャンセルできます。キャンセルされなかった操作は、完了に向けて処理を続行しますが、実際にキャンセルされるときは、呼び出し元は通知を受けます。CancelIoEx は、キャンセルされるすべての操作が完了するのを待機しません

キャンセルされる操作は、最終的には完了します。完了ステータスを調べて、操作が正常に完了したか (キャンセル要求は無視された)、操作がキャンセルされたか (完了ステータス ERROR_OPERATION_ABORTED)、または操作が何らかのエラーによって失敗したかを判断する必要があります。

要件
クライアント

Windows Vista が必要

サーバー

Windows Server Vista が必要

ヘッダー

Winbase.h で宣言

ライブラリ

Kernel32.lib へリンク

DLL

Kernel32.dll が必要

CancelSynchronousIo

注意    この情報は暫定的なものであり、変更される場合があります。

CancelSynchronousIo 関数によって、指定されたスレッドが発行した保留中の同期 I/O 操作がキャンセルとマークされます。

BOOL CancelSynchronousIo(
  HANDLE Error! Hyperlink reference not valid.
);
パラメータ

hThread

[入力] 同期 I/O 操作でブロックされるスレッドへのハンドルです。

戻り値

キャンセル操作が成功すると、戻り値は 0 以外の値になります。

この関数が失敗すると、戻り値は 0 になります。詳細なエラー情報が必要な場合は、GetLast Error (英語) を呼び出します。

参考

指定したスレッドによって発行された保留中の同期 I/O 操作が、キャンセルとマークされます。ほとんどの種類の操作は、直ちにキャンセルできます。キャンセルされなかった操作は、完了に向けて処理を続行しますが、実際にキャンセルされるときは、呼び出し元は通知を受けます。CancelSynchronousIoExは、キャンセルされるすべての操作が完了するのを待機しません

キャンセルされる操作は、最終的には完了します。完了ステータスを調べて、操作が正常に完了したか (キャンセル要求は無視された)、操作がキャンセルされたか (完了ステータス ERROR_OPERATION_ABORTED)、または操作が何らかのエラーによって失敗したかを判断する必要があります。このサービスは、発行した作成要求をキャンセルする場合に便利です。これは、ユーザーがファイルへのハンドルをまだ保持していないためです。

要件
クライアント

Windows Vista が必要

サーバー

Windows Server Vista が必要

ヘッダー

Winbase.h で宣言

ライブラリ

Kernel32.lib へリンク

DLL

Kernel32.dll が必要

付録B : キャンセル可能なファイル I/O API

API 名

キャンセルの可否

キャンセルのメカニズム

WalkTree

部分的

WalkTree 自体はキャンセルをサポートしません。ただし、この API は列挙コールバックを使用して、"ウォーキング" を実行します。このコールバックではキャンセルがサポートされます。キャンセルされた場合は列挙を停止できます。

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 の書面による許諾を受けることなく、その目的を問わず、どのような形態であっても、複製または譲渡することは禁じられています。ここでいう形態とは、複写や記録など、電子的な、または物理的なすべての手段を含みます。ただしこれは、著作権法上のお客様の権利を制限するものではありません。 マイクロソフトは、このドキュメントに記載されている内容に関し、特許、特許申請、商標、著作権、またはその他の無体財産権を有する場合があります。別途マイクロソフトのライセンス契約上に明示の規定のない限り、このドキュメントはこれらの特許、商標、著作権、またはその他の無体財産権に関する権利をお客様に許諾するものではありません。このソフトウェアおよび関連するドキュメントで使用している会社、組織、製品、人物、出来事などの名称は架空のものです。実在する商品名、団体名、個人名などとは一切関係ありません。©2004 Microsoft Corporation.All rights reserved.Microsoft、Windows、および Windows Vista は、米国 Microsoft Corporation の米国およびその他の国における登録商標または商標です。記載されている会社名、製品名には、各社の商標のものもあります。

表示: