次の方法で共有


NtCreateFile 関数 (winternl.h)

新しいファイルまたはディレクトリを作成するか、既存のファイル、デバイス、ディレクトリ、またはボリュームを開きます。

 

この関数は、Windows Driver Kit (WDK) に記載されている ZwCreateFile 関数と同等のユーザー モードです。

構文

__kernel_entry NTSTATUS NtCreateFile(
  [out]          PHANDLE            FileHandle,
  [in]           ACCESS_MASK        DesiredAccess,
  [in]           POBJECT_ATTRIBUTES ObjectAttributes,
  [out]          PIO_STATUS_BLOCK   IoStatusBlock,
  [in, optional] PLARGE_INTEGER     AllocationSize,
  [in]           ULONG              FileAttributes,
  [in]           ULONG              ShareAccess,
  [in]           ULONG              CreateDisposition,
  [in]           ULONG              CreateOptions,
  [in]           PVOID              EaBuffer,
  [in]           ULONG              EaLength
);

パラメーター

[out] FileHandle

呼び出しが成功した場合にファイル ハンドルを受け取る変数へのポインター。

[in] DesiredAccess

呼び出し元がファイルまたはディレクトリに対して必要とするアクセスの種類を表す ACCESS_MASK 値。 システム定義の DesiredAccess フラグのセットは、ファイル オブジェクトに対する次の特定のアクセス権を決定します。

意味
DELETE
ファイルは削除できます。
FILE_READ_DATA
ファイルからデータを読み取ることができます。
FILE_READ_ATTRIBUTES
FileAttributes フラグは 、後で説明しますが、読み取ることができます。
FILE_READ_EA
ファイルに関連付けられている拡張属性を読み取ることができます。 このフラグは、デバイスドライバーと中間ドライバーとは無関係です。
READ_CONTROL
ファイルに関連付けられているアクセス制御リスト (ACL) と所有権情報を読み取ることができます。
FILE_WRITE_DATA
ファイルにデータを書き込むことができます。
FILE_WRITE_ATTRIBUTES
FileAttributes フラグを 書き込むことができます。
FILE_WRITE_EA
ファイルに関連付けられている拡張属性 (EA) を書き込むことができます。 このフラグは、デバイスドライバーと中間ドライバーとは無関係です。
FILE_APPEND_DATA
データはファイルに追加できます。
WRITE_DAC
ファイルに関連付けられている随意アクセス制御リスト (DACL) を書き込むことができます。
WRITE_OWNER
ファイルに関連付けられている所有権情報を書き込むことができます。
SYNCHRONIZE
返された FileHandle は、I/O 操作の完了との同期を待機できます。 FileHandle が同期 I/O 用に開かれていた場合、この値は無視されます。
FILE_EXECUTE
システム ページング I/O を使用して、ファイルからデータをメモリに読み込むことができます。 このフラグは、デバイスドライバーと中間ドライバーには関係ありません。
 

ディレクトリを作成または開くときに、 FILE_READ_DATAFILE_WRITE_DATAFILE_APPEND_DATA、または FILE_EXECUTE を指定しないでください。

NtCreateFile の呼び出し元は、ディレクトリ ファイルを表さないファイル オブジェクトに対して、ビットごとの OR と、前の DesiredAccess フラグ リストの追加の互換性フラグを使用して、次の 1 つまたは組み合わせを指定できます。

意味
FILE_GENERIC_READ
STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE
FILE_GENERIC_WRITE
STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE
FILE_GENERIC_EXECUTE
STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE
 

FILE_GENERIC_EXECUTE値は、デバイスドライバーと中間ドライバーには関係ありません。

STANDARD_RIGHTS_XXX は、システム オブジェクトにセキュリティを適用するために使用される定義済みのシステム値です。

CreateOptions パラメーターで示されているように、ディレクトリ ファイルを開いたり作成したりするために、NtCreateFile の呼び出し元は、ビットごとの OR を使用して、前の DesiredAccess フラグ リストの 1 つ以上の互換性のあるフラグを使用して、次の 1 つまたは複数の組み合わせを指定できます。

意味
FILE_LIST_DIRECTORY
ディレクトリ内のファイルを一覧表示できます。
FILE_TRAVERSE
ディレクトリは走査できます。つまり、ファイルのパス名の一部にすることができます。

[in] ObjectAttributes

InitializeObjectAttributes で既に初期化されている構造体へのポインター。 ファイル オブジェクトのこの構造体のメンバーは、次のとおりです。

意味
ULONG の長さ
指定された ObjectAttributes データのバイト数を指定します。 この値は、少なくとも sizeof(OBJECT_ATTRIBUTES) である必要があります。
HANDLE RootDirectory
必要に応じて、 NtCreateFile の前の呼び出しによって取得されたディレクトリへのハンドルを指定します。 この値が NULL の場合、 ObjectName メンバーは、ターゲット ファイルへの完全パスを含む完全修飾ファイル仕様である必要があります。 この値が NULL 以外の場合、 ObjectName メンバーは、このディレクトリに対する相対ファイル名を指定します。
PUNICODE_STRING ObjectName
作成または開くファイルの名前を指定するバッファー内の Unicode 文字列を指します。 RootDirectory で指定されたディレクトリに対するファイルの名前でない限り、この値は完全修飾ファイル指定またはデバイス オブジェクトの名前である必要があります。 たとえば、\Device\フロッピー 1\myfile.datや \??\B:\myfile.dat は、フロッピー ドライバーと上にあるファイル システムが既に読み込まれている場合に、完全修飾ファイル仕様である可能性があります。 詳細については、「 ファイル名、パス、および名前空間」を参照してください。
ULONG 属性
ファイル オブジェクト属性を制御するフラグのセットです。 この値は 0 または OBJ_CASE_INSENSITIVEできます。これは、名前参照コードが完全一致検索を実行するのではなく 、ObjectName メンバーの大文字と小文字を無視する必要があることを示します。 OBJ_INHERIT値は、デバイスドライバーと中間ドライバーとは無関係です。
PSECURITY_DESCRIPTOR SecurityDescriptor
必要に応じて、ファイルに適用するセキュリティ記述子を指定します。 このようなセキュリティ記述子で指定された ACL は、作成時にのみファイルに適用されます。 ファイルの作成時に値が NULL の 場合、ファイルに配置される ACL はファイル システムに依存します。ほとんどのファイル システムは、そのような ACL の一部を、呼び出し元の既定の ACL と組み合わせて親ディレクトリ ファイルから伝達します。 デバイス ドライバーと中間ドライバーは、このメンバーを NULL に設定できます。
PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService
クライアントのセキュリティ コンテキストに対してサーバーに付与する必要があるアクセス権を指定します。 この値は、保護されたサーバーへの接続が確立されている場合にのみ NULL 以外であり、呼び出し元は、呼び出し元のセキュリティ コンテキストのどの部分をサーバーで使用できるか、およびサーバーが呼び出し元の偽装を許可されているかどうかを制御できます。

[out] IoStatusBlock

最終的な完了状態と要求された操作に関する情報を受け取る変数へのポインター。 NtCreateFile から返された場合、Information メンバーには次のいずれかの値が含まれます。

  • FILE_CREATED
  • FILE_OPENED
  • FILE_OVERWRITTEN
  • FILE_SUPERSEDED
  • FILE_EXISTS
  • FILE_DOES_NOT_EXIST

[in, optional] AllocationSize

ファイルの初期割り当てサイズ (バイト単位)。 0 以外の値は、ファイルが作成、上書き、または置き換えられている場合を除き、効果はありません。

[in] FileAttributes

ファイル属性。 明示的に指定された属性は、ファイルが作成、置き換えられる、または場合によっては上書きされた場合にのみ適用されます。 既定では、この値は FILE_ATTRIBUTE_NORMALであり、Wdm.h および NtDdk.h で定義されている 1 つ以上の FILE_ATTRIBUTE_xxxx フラグの ORed の組み合わせによってオーバーライドできます。 NtCreateFile で使用できるフラグの一覧については、「CreateFile」を参照してください。

[in] ShareAccess

呼び出し元がファイルで使用する共有アクセスの種類。0、または 1 つまたは次の値の組み合わせとして使用します。

意味
FILE_SHARE_READ
ファイルは、 NtCreateFile に対する他のスレッドの呼び出しによって読み取りアクセス用に開くことができます。
FILE_SHARE_WRITE
ファイルは、 NtCreateFile に対する他のスレッドの呼び出しによって書き込みアクセス用に開くことができます。
FILE_SHARE_DELETE
ファイルは、 NtCreateFile に対する他のスレッドの呼び出しによって削除アクセス用に開くことができます。
 

詳細については、Windows SDKを参照してください。

[in] CreateDisposition

ファイルが既に存在するかどうかに応じて、次のいずれかの値として、何を行うかを指定します。

意味
FILE_SUPERSEDE
ファイルが既に存在する場合は、指定したファイルに置き換えます。 そうでない場合は、指定されたファイルを作成します。
FILE_CREATE
ファイルが既に存在する場合は、要求に失敗し、指定されたファイルを作成または開かないでください。 そうでない場合は、指定されたファイルを作成します。
FILE_OPEN
ファイルが既に存在する場合は、新しいファイルを作成する代わりに開きます。 そうでない場合は、要求に失敗し、新しいファイルを作成しません。
FILE_OPEN_IF
ファイルが既に存在する場合は、ファイルを開きます。 そうでない場合は、指定されたファイルを作成します。
FILE_OVERWRITE
ファイルが既に存在する場合は、ファイルを開いて上書きします。 そうでない場合は、要求に失敗します。
FILE_OVERWRITE_IF
ファイルが既に存在する場合は、ファイルを開いて上書きします。 そうでない場合は、指定されたファイルを作成します。

[in] CreateOptions

次のフラグの互換性のある組み合わせとして、ファイルを作成または開くときに適用されるオプション。

意味
FILE_DIRECTORY_FILE
作成または開いているファイルはディレクトリ ファイルです。 このフラグでは、CreateDisposition パラメーターを FILE_CREATE、FILE_OPEN、またはFILE_OPEN_IFに設定する必要があります。 このフラグを使用すると、互換性のある他の CreateOptions フラグには、FILE_SYNCHRONOUS_IO_ALERTFILE_SYNCHRONOUS_IO _NONALERT、FILE_WRITE_THROUGHFILE_OPEN_FOR_BACKUP_INTENT、FILE_OPEN_BY_FILE_IDのみがまれます
FILE_NON_DIRECTORY_FILE
開いているファイルがディレクトリ ファイルではないか、この呼び出しが失敗します。 開いているファイル オブジェクトは、データ ファイル、論理、仮想、または物理デバイス、またはボリュームを表すことができます。
FILE_WRITE_THROUGH
ファイルにデータを書き込むアプリケーションは、要求された書き込み操作が完了したと見なされる前に、実際にデータをファイルに転送する必要があります。 このフラグは、 CreateOptions フラグ FILE_NO_INTERMEDIATE _BUFFERING が設定されている場合に自動的に設定されます。
FILE_SEQUENTIAL_ONLY
ファイルへのアクセスはすべてシーケンシャルです。
FILE_RANDOM_ACCESS
ファイルへのアクセスはランダムにできるため、FSD またはシステムによってファイルに対して順次先読み操作を実行する必要はありません。
FILE_NO_INTERMEDIATE_BUFFERING
ファイルは、ドライバーの内部バッファーにキャッシュまたはバッファーすることはできません。 このフラグは DesiredAccessFILE_APPEND_DATA フラグと互換性がありません。
FILE_SYNCHRONOUS_IO_ALERT
ファイルに対するすべての操作は同期的に実行されます。 呼び出し元に代わって待機すると、アラートが早期に終了する可能性があります。 また、このフラグにより、I/O システムはファイル位置コンテキストを維持します。 このフラグを設定する場合は、 DesiredAccessSYNCHRONIZE フラグも設定する必要があります。
FILE_SYNCHRONOUS_IO_NONALERT
ファイルに対するすべての操作は同期的に実行されます。 システムで I/O キューの同期を待機し、完了はアラートの対象になりません。 また、このフラグにより、I/O システムはファイル位置コンテキストを維持します。 このフラグを設定する場合は、 DesiredAccessSYNCHRONIZE フラグも設定する必要があります。
FILE_CREATE_TREE_CONNECTION
ネットワーク経由で開くために、このファイルのツリー接続を作成します。 このフラグは、デバイス ドライバーと中間ドライバーでは使用されません。
FILE_NO_EA_KNOWLEDGE
開かれている既存のファイルの拡張属性が、呼び出し元がファイルを正しく解釈するために EA を理解する必要があることを示している場合は、呼び出し元が EA の処理方法を理解していないため、この要求を失敗させます。 このフラグは、デバイスドライバーと中間ドライバーには関係ありません。
FILE_OPEN_REPARSE_POINT
再解析ポイントを持つファイルを開き、ファイルの通常の再解析ポイント処理をバイパスします。 詳細については、「解説」を参照してください。
FILE_DELETE_ON_CLOSE
最後のハンドルが NtClose に渡されたときにファイルを削除します。 このフラグが設定されている場合は、 DesiredAccess パラメーターで DELETE フラグを設定する必要があります。
FILE_OPEN_BY_FILE_ID
ObjectAttributes パラメーターで指定されたファイル名には、ファイルの 8 バイトのファイル参照番号が含まれています。 この番号は、 によって割り当てられ、特定のファイル システムに固有です。 ファイルが再解析ポイントの場合、ファイル名にはデバイスの名前も含まれます。 FAT ファイル システムでは、このフラグはサポートされていないことに注意してください。 このフラグは、デバイス ドライバーと中間ドライバーでは使用されません。
FILE_OPEN_FOR_BACKUP_INTENT
バックアップ インテント用にファイルが開かれています。 したがって、システムは特定のアクセス権をチェックし、ファイルのセキュリティ記述子に対して DesiredAccess パラメーターをチェックする前に、呼び出し元にファイルへの適切なアクセス権を付与する必要があります。 このフラグは、デバイスドライバーと中間ドライバーでは使用されません。
FILE_RESERVE_OPFILTER
このフラグを使用すると、アプリケーションはフィルターの日和見ロック (oplock) を要求して、他のアプリケーションが共有違反を受け取ることを防ぐことができます。 既に開いているハンドルがある場合、作成要求は STATUS_OPLOCK_NOT_GRANTEDで失敗します。 詳細については、「解説」を参照してください。
FILE_OPEN_REQUIRING_OPLOCK
ファイルが開き、ファイルの日和見ロック (oplock) が 1 つのアトミック操作として要求されています。 ファイル システムは、作成操作を実行する前に oplock をチェックし、結果が既存の oplock を中断する場合は 、STATUS_CANNOT_BREAK_OPLOCK のリターン コードで作成を失敗します。 詳細については、「解説」セクションを参照してください。Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: このフラグはサポートされていません。

このフラグは、NTFS、FAT、exFAT のファイル システムでサポートされています。

FILE_COMPLETE_IF_OPLOCKED
呼び出し元のスレッドをブロックするのではなく、ターゲット ファイルが oplocked の場合は 、STATUS_OPLOCK_BREAK_IN_PROGRESS の代替成功コードを使用して、この操作をすぐに完了します。 ファイルが oplocked の場合、別の呼び出し元は既にファイルにアクセスできます。 このフラグは、デバイス ドライバーと中間ドライバーでは使用されません。

[in] EaBuffer

拡張属性を渡すために使用される EA バッファーへのポインター。

メモ 一部のファイル システムでは、EA バッファーがサポートされない場合があります。
 

[in] EaLength

EA バッファーの長さ。

戻り値

NtCreateFile、STATUS_SUCCESS または適切なエラー状態を返します。 エラー状態が返された場合、呼び出し元は IoStatusBlock を確認することで、エラーの原因に関する詳細情報を見つけることができます。 このチェックを簡略化するために、アプリケーションでは、NT_SUCCESSNT_ERRORおよびNT_WARNINGマクロを使用できます。

注釈

NtCreateFile によって指定されたハンドルは、後続の呼び出しで、ファイル内のデータ、またはファイル オブジェクトの状態または属性を操作するために使用できます。

NtCreateFile を使用して作成または開くファイルの名前を指定するには、次の 2 つの方法があります。

  • 完全修飾パス名として、入力 ObjectAttributesObjectName メンバーで指定されます
  • 入力 ObjectAttributesRootDirectory メンバーのハンドルによって表されるディレクトリ ファイルに対する相対パス名として
特定の DesiredAccess フラグとフラグの組み合わせには、次の効果があります。
  • 呼び出し元が、返された FileHandle を待機して I/O 完了を同期するには、 SYNCHRONIZE フラグを設定する必要があります。
  • DesiredFlags に 0 を渡すことは無効です。
  • FILE_APPEND_DATAフラグと SYNCHRONIZE フラグのみが設定されている場合、呼び出し元はファイルの末尾にのみ書き込むことができます。ファイルへの書き込みに関するオフセット情報は無視されます。 ただし、この種類の書き込み操作では、必要に応じてファイルが自動的に拡張されます。
  • ファイルの FILE_WRITE_DATA フラグを設定すると、ファイルの末尾を超える書き込みも行われます。 ファイルは、この種類の書き込みでも自動的に拡張されます。
  • FILE_EXECUTEフラグと SYNCHRONIZE フラグのみが設定されている場合、呼び出し元は、返された FileHandle を使用してファイル内のデータを直接読み取ったり書き込んだりすることはできません。つまり、命令とデータアクセスに応答して、ファイルに対するすべての操作がシステム ポケットベルを介して行われます。
ShareAccess パラメーターは、個別のスレッドが同じファイルに同時にアクセスできるかどうかを決定します。 指定した方法でファイルにアクセスする権限を両方のファイル・オープン機能に持っている場合は、ファイルを正常に開いて共有できます。 NtCreateFile の元の呼び出し元がFILE_SHARE_READFILE_SHARE_WRITE、またはFILE_SHARE_DELETEを指定しない場合、ファイルに対して他の開いている操作を実行することはできません。つまり、元の呼び出し元には、ファイルへの排他的アクセス権が付与されます。

共有ファイルを正常に開くには、ファイルに対して要求された DesiredAccess パラメーターが、NtClose でまだリリースされていない上記のすべてのオープンの DesiredAccess 仕様と ShareAccess 仕様の両方と互換性がある必要があります。 つまり、特定のファイルに対して NtCreateFile に指定された DesiredAccess パラメーターは、ファイルの他の opener が許可していないアクセスと競合しないようにする必要があります。

CreateDispositionFILE_SUPERSEDE、呼び出し元が既存のファイル オブジェクトに対する DELETE アクセス権を持っている必要があります。 その場合、既存のファイルでFILE_SUPERSEDEを使用して NtCreateFile を正常に呼び出すと、そのファイルが実質的に削除され、再作成されます。 これは、ファイルが既に別のスレッドによって開かれている場合は、FILE_SHARE_DELETE フラグが設定された ShareAccess パラメーターを指定してファイルを開くことを意味します。 この種類の処理は、ファイルを上書きする POSIX スタイルと一致することに注意してください。 CreateDisposition の値FILE_OVERWRITE_IFFILE_SUPERSEDEは似ています。 既存のファイルで ZwCreateFile が呼び出され、これらの CreateDisposition 値のいずれかが呼び出された場合、ファイルは置き換えられます。

ファイルの上書きは、次を除き、置き換え操作と意味的に同等です。

  • 呼び出し元は、アクセス権を削除するのではなく、ファイルへの書き込みアクセス権を持っている必要があります。 これは、ファイルが既に別のスレッドによって開かれている場合は、入力 ShareAccess パラメーターに FILE_SHARE_WRITE フラグを設定してファイルを開くことを意味します。
  • 指定されたファイル属性は、ファイルに既に存在する属性と論理的に ORed です。 これは、ファイルが既に別のスレッドによって開かれている場合、 NtCreateFile の後続の呼び出し元は既存の FileAttributes フラグを無効にすることはできませんが、同じファイルに対して追加のフラグを有効にできることを意味します。 ファイルを上書きするこのスタイルは、MS-DOS、Windows 3.1、OS/2 オペレーティング システムと一致することに注意してください。
CreateOptionsFILE_DIRECTORY_FILE値は、作成または開くファイルがディレクトリ ファイルであることを指定します。 ディレクトリ ファイルが作成されると、ファイル システムはディスク上に適切な構造を作成し、その特定のファイル システムのディスク上の構造の空のディレクトリを表します。 このオプションが指定されていて、開く指定されたファイルがディレクトリ ファイルではない場合、または呼び出し元が一貫性のない CreateOptions または CreateDisposition 値を指定した場合、 NtCreateFile の呼び出しは失敗します。

CreateOptionsFILE_NO_INTERMEDIATE_BUFFERING フラグを指定すると、ファイル システムが呼び出し元に代わって中間バッファリングを実行できなくなります。 この値を指定すると、次のような他の NtXXXファイル ルーチンに対して、呼び出し元のパラメーターに特定の制限が設定されます。

  • NtReadFile 関数または NtWriteFile 関数に渡される任意の ByteOffset は、セクター サイズの整数である必要があります。
  • NtReadFile または NtWriteFile渡される長さは、セクター サイズの整数である必要があります。 長さがセクター サイズであるバッファーに対して読み取り操作を指定すると、転送中にファイルの末尾に達した場合に、そのバッファーに転送される有効バイト数が少なくなる可能性があることに注意してください。
  • バッファーは、基になるデバイスの配置要件に従って調整する必要があります。 この情報を取得するには、 NtCreateFile を呼び出して物理デバイスを表すファイル オブジェクトのハンドルを取得し、そのハンドルを使用 して NtQueryInformationFile を呼び出します。 システム FILE_XXX_ALIGNMENT 値の一覧については、Windows SDKドキュメントを参照してください。
  • FileInformationClass パラメーターを FilePositionInformation に設定して NtSetInformationFile を呼び出すには、セクター サイズの整数であるオフセットを指定する必要があります。
CreateOptionsFILE_SYNCHRONOUS_IO_ALERTフラグとFILE_SYNCHRONOUS_IO_NONALERT フラグは、名前が示すとおりに相互に排他的であり、返された FileHandle によって参照されるファイル オブジェクトを介して行われる限り、ファイルに対するすべての I/O 操作を同期するように指定します。 このようなファイルのすべての I/O は、返されたハンドルを使用して、すべてのスレッドにわたってシリアル化されます。 これらの CreateOptions のいずれかを使用して、I/O マネージャーが同期オブジェクトとしてファイル オブジェクトを使用するように DesiredAccessSYNCHRONIZE フラグを設定する必要があります。 これらの CreateOptions のいずれかが設定されている場合、I/O マネージャーは、ファイル オブジェクトの "ファイル位置コンテキスト" (内部の現在のファイル位置オフセット) を保持します。 このオフセットは、NtReadFile と NtWriteFile の呼び出しで使用できます。 その位置は、 NtQueryInformationFileNtSetInformationFile で照会または設定することもできます。

CreateOptions パラメーターで FILE_OPEN_REPARSE_POINT フラグを指定し、NtCreateFile が再解析ポイントを持つファイルを開いた場合、通常の再解析処理は行われず、NtCreateFile は再解析ポイント ファイルを直接開こうとします。 FILE_OPEN_REPARSE_POINT フラグが指定されていない場合は、ファイルに対して通常の再解析ポイント処理が行われます。 どちらの場合も、開いている操作が成功した場合、 NtCreateFileSTATUS_SUCCESSを返します。それ以外の場合は、エラー コード。 NtCreateFile 関数は、STATUS_REPARSEを返しません。

CreateOptions パラメーターの FILE_OPEN_REQUIRING_OPLOCK フラグを使用すると、ファイルを開いて、サード パーティがファイルを開くことができる可能性のある oplock を要求してから共有違反が発生するまでの時間を短縮できます。 アプリケーションでは、NtCreateFileFILE_OPEN_REQUIRING_OPLOCK フラグを使用し、任意の oplock を要求できます。 これにより、共有違反の原因となる後続のオープン要求が oplock 所有者に確実に通知されます。

Windows 7 では、アプリケーションがこのフラグを使用するときにファイルに他のハンドルが存在する場合、作成操作は STATUS_OPLOCK_NOT_GRANTEDで失敗します。 この制限は、Windows 8以降は存在しません。

この作成操作によってファイルに既に存在する oplock が中断される場合、 FILE_OPEN_REQUIRING_OPLOCK フラグを設定すると、作成操作は STATUS_CANNOT_BREAK_OPLOCK で失敗します。 この作成操作では、既存の oplock は破損しません。

このフラグを使用するアプリケーションは、この呼び出しが成功した後に oplock を要求する必要があります。または、ファイルを開こうとする後続のすべての試行は、通常の oplock 処理の利点なしにブロックされます。 同様に、この呼び出しが成功しても後続の oplock 要求が失敗した場合、このフラグを使用するアプリケーションは、oplock 要求が失敗したことを検出した後、ハンドルを閉じる必要があります。

メモFILE_OPEN_REQUIRING_OPLOCK フラグは、Windows 7、Windows Server 2008 R2 以降のオペレーティング システムで、NTFS、FAT、exFAT の各ファイル システムで使用できます。
 

CreateOptions パラメーターの FILE_RESERVE_OPFILTER フラグを使用すると、アプリケーションはレベル 1、Batch、または Filter oplock を要求して、他のアプリケーションが共有違反を受け取ることを防ぐことができます。 ただし、実際には、 FILE_RESERVE_OPFILTER はフィルター 操作ロックにのみ役立ちます。 これを使用するには、次の手順を実行する必要があります。

  1. CreateOptionsFILE_RESERVE_OPFILTERDesiredAccess が正確にFILE_READ_ATTRIBUTESShareAccess が 正確に (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE)で作成要求を発行します。 考えられるエラーは次のとおりです。
    • 既に開いているハンドルがある場合、作成要求は STATUS_OPLOCK_NOT_GRANTEDで失敗し、次に要求された oplock も失敗します。
    • FILE_READ_ATTRIBUTES より多 くのアクセス権を持つ、またはより (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE)少ない共有で を開いた場合、要求は STATUS_OPLOCK_NOT_GRANTED で失敗します。
  2. 作成要求が成功した場合は、oplock を要求します。
  3. ファイルの別のハンドルを開いて I/O を実行します。
手順 3 では、これはフィルター 操作ロックに対してのみ実用的です。 手順 3 で開いたハンドルには、 の最大値(FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | SYNCHRONIZE | READ_CONTROL)を含む DesiredAccess を使用できますが、フィルター 操作ロックは解除されません。 ただし、 を超える (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE)DesiredAccess では、レベル 1 または Batch oplock が解除され、FILE_RESERVE_OPFILTER フラグがこれらの oplock 型では役に立たなくなります。

NTFS は、 FILE_RESERVE_OPFILTERを実装する唯一の Microsoft ファイル システムです。

oplock の詳細については、「 Oplock セマンティクス」を参照してください。

WDK ヘッダー ファイル NtDef.h は、 InitializeObjectAttributes マクロと同様に、多くの定数定義に必要であることに注意してください。 LoadLibrary 関数と GetProcAddress 関数を使用して、NtDll.dll に動的にリンクすることもできます。

要件

要件
対象プラットフォーム Windows
ヘッダー winternl.h
Library ntdll.lib
[DLL] ntdll.dll