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 フラグのセットは、ファイル オブジェクトに対する次の特定のアクセス権を決定します。
ディレクトリを作成または開くときに、 FILE_READ_DATA、 FILE_WRITE_DATA、 FILE_APPEND_DATA、または FILE_EXECUTE を指定しないでください。
NtCreateFile の呼び出し元は、ディレクトリ ファイルを表さないファイル オブジェクトに対して、ビットごとの OR と、前の DesiredAccess フラグ リストの追加の互換性フラグを使用して、次の 1 つまたは組み合わせを指定できます。
FILE_GENERIC_EXECUTE値は、デバイスドライバーと中間ドライバーには関係ありません。
STANDARD_RIGHTS_XXX は、システム オブジェクトにセキュリティを適用するために使用される定義済みのシステム値です。
CreateOptions パラメーターで示されているように、ディレクトリ ファイルを開いたり作成したりするために、NtCreateFile の呼び出し元は、ビットごとの OR を使用して、前の DesiredAccess フラグ リストの 1 つ以上の互換性のあるフラグを使用して、次の 1 つまたは複数の組み合わせを指定できます。
値 | 意味 |
---|---|
|
ディレクトリ内のファイルを一覧表示できます。 |
|
ディレクトリは走査できます。つまり、ファイルのパス名の一部にすることができます。 |
[in] ObjectAttributes
InitializeObjectAttributes で既に初期化されている構造体へのポインター。 ファイル オブジェクトのこの構造体のメンバーは、次のとおりです。
値 | 意味 |
---|---|
|
指定された ObjectAttributes データのバイト数を指定します。 この値は、少なくとも sizeof(OBJECT_ATTRIBUTES) である必要があります。 |
|
必要に応じて、 NtCreateFile の前の呼び出しによって取得されたディレクトリへのハンドルを指定します。 この値が NULL の場合、 ObjectName メンバーは、ターゲット ファイルへの完全パスを含む完全修飾ファイル仕様である必要があります。 この値が NULL 以外の場合、 ObjectName メンバーは、このディレクトリに対する相対ファイル名を指定します。 |
|
作成または開くファイルの名前を指定するバッファー内の Unicode 文字列を指します。 RootDirectory で指定されたディレクトリに対するファイルの名前でない限り、この値は完全修飾ファイル指定またはデバイス オブジェクトの名前である必要があります。 たとえば、\Device\フロッピー 1\myfile.datや \??\B:\myfile.dat は、フロッピー ドライバーと上にあるファイル システムが既に読み込まれている場合に、完全修飾ファイル仕様である可能性があります。 詳細については、「 ファイル名、パス、および名前空間」を参照してください。 |
|
ファイル オブジェクト属性を制御するフラグのセットです。 この値は 0 または OBJ_CASE_INSENSITIVEできます。これは、名前参照コードが完全一致検索を実行するのではなく 、ObjectName メンバーの大文字と小文字を無視する必要があることを示します。 OBJ_INHERIT値は、デバイスドライバーと中間ドライバーとは無関係です。 |
|
必要に応じて、ファイルに適用するセキュリティ記述子を指定します。 このようなセキュリティ記述子で指定された ACL は、作成時にのみファイルに適用されます。 ファイルの作成時に値が NULL の 場合、ファイルに配置される ACL はファイル システムに依存します。ほとんどのファイル システムは、そのような ACL の一部を、呼び出し元の既定の ACL と組み合わせて親ディレクトリ ファイルから伝達します。 デバイス ドライバーと中間ドライバーは、このメンバーを NULL に設定できます。 |
|
クライアントのセキュリティ コンテキストに対してサーバーに付与する必要があるアクセス権を指定します。 この値は、保護されたサーバーへの接続が確立されている場合にのみ 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 つまたは次の値の組み合わせとして使用します。
詳細については、Windows SDKを参照してください。
[in] CreateDisposition
ファイルが既に存在するかどうかに応じて、次のいずれかの値として、何を行うかを指定します。
[in] CreateOptions
次のフラグの互換性のある組み合わせとして、ファイルを作成または開くときに適用されるオプション。
値 | 意味 |
---|---|
|
作成または開いているファイルはディレクトリ ファイルです。 このフラグでは、CreateDisposition パラメーターを FILE_CREATE、FILE_OPEN、またはFILE_OPEN_IFに設定する必要があります。 このフラグを使用すると、互換性のある他の CreateOptions フラグには、FILE_SYNCHRONOUS_IO_ALERT、FILE_SYNCHRONOUS_IO _NONALERT、FILE_WRITE_THROUGH、FILE_OPEN_FOR_BACKUP_INTENT、FILE_OPEN_BY_FILE_IDのみが含まれます。 |
|
開いているファイルがディレクトリ ファイルではないか、この呼び出しが失敗します。 開いているファイル オブジェクトは、データ ファイル、論理、仮想、または物理デバイス、またはボリュームを表すことができます。 |
|
ファイルにデータを書き込むアプリケーションは、要求された書き込み操作が完了したと見なされる前に、実際にデータをファイルに転送する必要があります。 このフラグは、 CreateOptions フラグ FILE_NO_INTERMEDIATE _BUFFERING が設定されている場合に自動的に設定されます。 |
|
ファイルへのアクセスはすべてシーケンシャルです。 |
|
ファイルへのアクセスはランダムにできるため、FSD またはシステムによってファイルに対して順次先読み操作を実行する必要はありません。 |
|
ファイルは、ドライバーの内部バッファーにキャッシュまたはバッファーすることはできません。 このフラグは DesiredAccessFILE_APPEND_DATA フラグと互換性がありません。 |
|
ファイルに対するすべての操作は同期的に実行されます。 呼び出し元に代わって待機すると、アラートが早期に終了する可能性があります。 また、このフラグにより、I/O システムはファイル位置コンテキストを維持します。 このフラグを設定する場合は、 DesiredAccessSYNCHRONIZE フラグも設定する必要があります。 |
|
ファイルに対するすべての操作は同期的に実行されます。 システムで I/O キューの同期を待機し、完了はアラートの対象になりません。 また、このフラグにより、I/O システムはファイル位置コンテキストを維持します。 このフラグを設定する場合は、 DesiredAccessSYNCHRONIZE フラグも設定する必要があります。 |
|
ネットワーク経由で開くために、このファイルのツリー接続を作成します。 このフラグは、デバイス ドライバーと中間ドライバーでは使用されません。 |
|
開かれている既存のファイルの拡張属性が、呼び出し元がファイルを正しく解釈するために EA を理解する必要があることを示している場合は、呼び出し元が EA の処理方法を理解していないため、この要求を失敗させます。 このフラグは、デバイスドライバーと中間ドライバーには関係ありません。 |
|
再解析ポイントを持つファイルを開き、ファイルの通常の再解析ポイント処理をバイパスします。 詳細については、「解説」を参照してください。 |
|
最後のハンドルが NtClose に渡されたときにファイルを削除します。 このフラグが設定されている場合は、 DesiredAccess パラメーターで DELETE フラグを設定する必要があります。 |
|
ObjectAttributes パラメーターで指定されたファイル名には、ファイルの 8 バイトのファイル参照番号が含まれています。 この番号は、 によって割り当てられ、特定のファイル システムに固有です。 ファイルが再解析ポイントの場合、ファイル名にはデバイスの名前も含まれます。 FAT ファイル システムでは、このフラグはサポートされていないことに注意してください。 このフラグは、デバイス ドライバーと中間ドライバーでは使用されません。 |
|
バックアップ インテント用にファイルが開かれています。 したがって、システムは特定のアクセス権をチェックし、ファイルのセキュリティ記述子に対して DesiredAccess パラメーターをチェックする前に、呼び出し元にファイルへの適切なアクセス権を付与する必要があります。 このフラグは、デバイスドライバーと中間ドライバーでは使用されません。 |
|
このフラグを使用すると、アプリケーションはフィルターの日和見ロック (oplock) を要求して、他のアプリケーションが共有違反を受け取ることを防ぐことができます。 既に開いているハンドルがある場合、作成要求は STATUS_OPLOCK_NOT_GRANTEDで失敗します。 詳細については、「解説」を参照してください。 |
|
ファイルが開き、ファイルの日和見ロック (oplock) が 1 つのアトミック操作として要求されています。 ファイル システムは、作成操作を実行する前に oplock をチェックし、結果が既存の oplock を中断する場合は 、STATUS_CANNOT_BREAK_OPLOCK のリターン コードで作成を失敗します。 詳細については、「解説」セクションを参照してください。Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: このフラグはサポートされていません。
このフラグは、NTFS、FAT、exFAT のファイル システムでサポートされています。 |
|
呼び出し元のスレッドをブロックするのではなく、ターゲット ファイルが oplocked の場合は 、STATUS_OPLOCK_BREAK_IN_PROGRESS の代替成功コードを使用して、この操作をすぐに完了します。 ファイルが oplocked の場合、別の呼び出し元は既にファイルにアクセスできます。 このフラグは、デバイス ドライバーと中間ドライバーでは使用されません。 |
[in] EaBuffer
拡張属性を渡すために使用される EA バッファーへのポインター。
[in] EaLength
EA バッファーの長さ。
戻り値
NtCreateFile は 、STATUS_SUCCESS または適切なエラー状態を返します。 エラー状態が返された場合、呼び出し元は IoStatusBlock を確認することで、エラーの原因に関する詳細情報を見つけることができます。 このチェックを簡略化するために、アプリケーションでは、NT_SUCCESS、NT_ERROR、およびNT_WARNINGマクロを使用できます。
注釈
NtCreateFile によって指定されたハンドルは、後続の呼び出しで、ファイル内のデータ、またはファイル オブジェクトの状態または属性を操作するために使用できます。
NtCreateFile を使用して作成または開くファイルの名前を指定するには、次の 2 つの方法があります。
- 完全修飾パス名として、入力 ObjectAttributes の ObjectName メンバーで指定されます
- 入力 ObjectAttributes の RootDirectory メンバーのハンドルによって表されるディレクトリ ファイルに対する相対パス名として
- 呼び出し元が、返された FileHandle を待機して I/O 完了を同期するには、 SYNCHRONIZE フラグを設定する必要があります。
- DesiredFlags に 0 を渡すことは無効です。
- FILE_APPEND_DATAフラグと SYNCHRONIZE フラグのみが設定されている場合、呼び出し元はファイルの末尾にのみ書き込むことができます。ファイルへの書き込みに関するオフセット情報は無視されます。 ただし、この種類の書き込み操作では、必要に応じてファイルが自動的に拡張されます。
- ファイルの FILE_WRITE_DATA フラグを設定すると、ファイルの末尾を超える書き込みも行われます。 ファイルは、この種類の書き込みでも自動的に拡張されます。
- FILE_EXECUTEフラグと SYNCHRONIZE フラグのみが設定されている場合、呼び出し元は、返された FileHandle を使用してファイル内のデータを直接読み取ったり書き込んだりすることはできません。つまり、命令とデータアクセスに応答して、ファイルに対するすべての操作がシステム ポケットベルを介して行われます。
共有ファイルを正常に開くには、ファイルに対して要求された DesiredAccess パラメーターが、NtClose でまだリリースされていない上記のすべてのオープンの DesiredAccess 仕様と ShareAccess 仕様の両方と互換性がある必要があります。 つまり、特定のファイルに対して NtCreateFile に指定された DesiredAccess パラメーターは、ファイルの他の opener が許可していないアクセスと競合しないようにする必要があります。
CreateDisposition 値FILE_SUPERSEDE、呼び出し元が既存のファイル オブジェクトに対する DELETE アクセス権を持っている必要があります。 その場合、既存のファイルでFILE_SUPERSEDEを使用して NtCreateFile を正常に呼び出すと、そのファイルが実質的に削除され、再作成されます。 これは、ファイルが既に別のスレッドによって開かれている場合は、FILE_SHARE_DELETE フラグが設定された ShareAccess パラメーターを指定してファイルを開くことを意味します。 この種類の処理は、ファイルを上書きする POSIX スタイルと一致することに注意してください。 CreateDisposition の値FILE_OVERWRITE_IFとFILE_SUPERSEDEは似ています。 既存のファイルで ZwCreateFile が呼び出され、これらの CreateDisposition 値のいずれかが呼び出された場合、ファイルは置き換えられます。
ファイルの上書きは、次を除き、置き換え操作と意味的に同等です。
- 呼び出し元は、アクセス権を削除するのではなく、ファイルへの書き込みアクセス権を持っている必要があります。 これは、ファイルが既に別のスレッドによって開かれている場合は、入力 ShareAccess パラメーターに FILE_SHARE_WRITE フラグを設定してファイルを開くことを意味します。
- 指定されたファイル属性は、ファイルに既に存在する属性と論理的に ORed です。 これは、ファイルが既に別のスレッドによって開かれている場合、 NtCreateFile の後続の呼び出し元は既存の FileAttributes フラグを無効にすることはできませんが、同じファイルに対して追加のフラグを有効にできることを意味します。 ファイルを上書きするこのスタイルは、MS-DOS、Windows 3.1、OS/2 オペレーティング システムと一致することに注意してください。
CreateOptionsFILE_NO_INTERMEDIATE_BUFFERING フラグを指定すると、ファイル システムが呼び出し元に代わって中間バッファリングを実行できなくなります。 この値を指定すると、次のような他の NtXXXファイル ルーチンに対して、呼び出し元のパラメーターに特定の制限が設定されます。
- NtReadFile 関数または NtWriteFile 関数に渡される任意の ByteOffset は、セクター サイズの整数である必要があります。
- NtReadFile または NtWriteFile に渡される長さは、セクター サイズの整数である必要があります。 長さがセクター サイズであるバッファーに対して読み取り操作を指定すると、転送中にファイルの末尾に達した場合に、そのバッファーに転送される有効バイト数が少なくなる可能性があることに注意してください。
- バッファーは、基になるデバイスの配置要件に従って調整する必要があります。 この情報を取得するには、 NtCreateFile を呼び出して物理デバイスを表すファイル オブジェクトのハンドルを取得し、そのハンドルを使用 して NtQueryInformationFile を呼び出します。 システム FILE_XXX_ALIGNMENT 値の一覧については、Windows SDKドキュメントを参照してください。
- FileInformationClass パラメーターを FilePositionInformation に設定して NtSetInformationFile を呼び出すには、セクター サイズの整数であるオフセットを指定する必要があります。
CreateOptions パラメーターで FILE_OPEN_REPARSE_POINT フラグを指定し、NtCreateFile が再解析ポイントを持つファイルを開いた場合、通常の再解析処理は行われず、NtCreateFile は再解析ポイント ファイルを直接開こうとします。 FILE_OPEN_REPARSE_POINT フラグが指定されていない場合は、ファイルに対して通常の再解析ポイント処理が行われます。 どちらの場合も、開いている操作が成功した場合、 NtCreateFile は STATUS_SUCCESSを返します。それ以外の場合は、エラー コード。 NtCreateFile 関数は、STATUS_REPARSEを返しません。
CreateOptions パラメーターの FILE_OPEN_REQUIRING_OPLOCK フラグを使用すると、ファイルを開いて、サード パーティがファイルを開くことができる可能性のある oplock を要求してから共有違反が発生するまでの時間を短縮できます。 アプリケーションでは、NtCreateFile で FILE_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 要求が失敗したことを検出した後、ハンドルを閉じる必要があります。
CreateOptions パラメーターの FILE_RESERVE_OPFILTER フラグを使用すると、アプリケーションはレベル 1、Batch、または Filter oplock を要求して、他のアプリケーションが共有違反を受け取ることを防ぐことができます。 ただし、実際には、 FILE_RESERVE_OPFILTER はフィルター 操作ロックにのみ役立ちます。 これを使用するには、次の手順を実行する必要があります。
- CreateOptions が FILE_RESERVE_OPFILTER、DesiredAccess が正確にFILE_READ_ATTRIBUTES、ShareAccess が 正確に
(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 で失敗します。
- 作成要求が成功した場合は、oplock を要求します。
- ファイルの別のハンドルを開いて I/O を実行します。
(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 |
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示