Win32 API 日本語リファレンス
ホームStorage.FileSystem › CreateFile2

CreateFile2

関数
拡張パラメータを指定してファイルを作成または開く。
DLLKERNEL32.dll呼出規約winapiSetLastErrorあり対応OSwindows8.0

シグネチャ

// KERNEL32.dll
#include <windows.h>

HANDLE CreateFile2(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    FILE_SHARE_MODE dwShareMode,
    FILE_CREATION_DISPOSITION dwCreationDisposition,
    CREATEFILE2_EXTENDED_PARAMETERS* pCreateExParams   // optional
);

パラメーター

名前方向説明
lpFileNameLPCWSTRin

作成または開くファイルまたはデバイスの名前。

特殊なデバイス名については、 Defining an MS-DOS Device Name を参照してください。

ファイルストリームを作成するには、ファイル名、コロン、続いてストリーム名を指定します。詳細については、 File Streams を参照してください。

Tip Windows 10 バージョン 1607 以降では、"\\?\" を前に付けることなく MAX_PATH の制限を解除するオプトインが可能です。詳細については、Naming Files, Paths, and Namespaces の「Maximum Path Length Limitation」セクションを参照してください。
dwDesiredAccessDWORDin

ファイルまたはデバイスへの要求するアクセス権で、読み取り、書き込み、その両方、またはなし(ゼロ)のいずれかにまとめられます。

最も一般的に使用される値は、GENERIC_READGENERIC_WRITE、またはその両方 (GENERIC_READ | GENERIC_WRITE)です。詳細については、 Generic Access RightsFile Security and Access RightsFile Access Rights Constants、および ACCESS_MASK を参照してください。

このパラメーターがゼロの場合、アプリケーションはファイルまたはデバイスにアクセスすることなく、ファイル、ディレクトリ、デバイスの属性などの特定のメタデータを照会できます。これは、GENERIC_READ アクセスが拒否されるような場合でも可能です。

既にハンドルが開かれているオープン要求において、dwShareMode パラメーターで指定された共有モードと競合するアクセスモードを要求することはできません。

詳細については、本トピックの「解説」セクションおよび Creating and Opening Files を参照してください。

dwShareModeFILE_SHARE_MODEin

ファイルまたはデバイスへの要求する共有モードで、読み取り、書き込み、その両方、削除、これらすべて、またはなしのいずれかです(以下の表を参照)。属性または拡張属性へのアクセス要求は、このフラグの影響を受けません。

このパラメーターがゼロで CreateFile2 が成功した場合、ファイルまたはデバイスは共有できず、そのファイルまたはデバイスへのハンドルが閉じられるまで再度開くことができません。詳細については、「解説」セクションを参照してください。

既にハンドルが開かれている要求で指定されているアクセスモードと競合する共有モードを要求することはできません。その場合、CreateFile2 は失敗し、 GetLastError 関数は ERROR_SHARING_VIOLATION を返します。

あるプロセスがファイルまたはデバイスを開いている間に別のプロセスがそれを共有できるようにするには、以下の値の 1 つ以上を互換性のある組み合わせで使用します。このパラメーターと dwDesiredAccess パラメーターの有効な組み合わせについて詳しくは、 Creating and Opening Files を参照してください。

Note 開いている各ハンドルの共有オプションは、プロセスのコンテキストに関係なく、そのハンドルが閉じられるまで有効です。
意味
0
0x00000000
他のプロセスが削除、読み取り、または書き込みアクセスを要求した場合に、そのファイルまたはデバイスを開くことを禁止します。ファイルまたはディレクトリへの排他アクセスは、アプリケーションがそのファイルに書き込みアクセス権を持っている場合にのみ許可されます。
FILE_SHARE_DELETE
0x00000004
ファイルまたはデバイスに対する後続のオープン操作が削除アクセスを要求できるようにします。

それ以外の場合、他のプロセスは削除アクセスを要求してもファイルまたはデバイスを開くことができません。

このフラグが指定されておらず、かつファイルまたはデバイスが削除アクセス用に既に開かれている場合、関数は失敗します。

Note 削除アクセスは、削除操作と名前変更操作の両方を許可します。
FILE_SHARE_READ
0x00000001
ファイルまたはデバイスに対する後続のオープン操作が読み取りアクセスを要求できるようにします。

それ以外の場合、他のプロセスは読み取りアクセスを要求してもファイルまたはデバイスを開くことができません。

このフラグが指定されておらず、かつファイルまたはデバイスが読み取りアクセス用に既に開かれている場合、関数は失敗します。

ファイルまたはディレクトリを開こうとしていてこのフラグが指定されておらず、かつ呼び出し元がそのファイルまたはディレクトリへの書き込みアクセス権を持っていない場合、関数は失敗します。

FILE_SHARE_WRITE
0x00000002
ファイルまたはデバイスに対する後続のオープン操作が書き込みアクセスを要求できるようにします。

それ以外の場合、他のプロセスは書き込みアクセスを要求してもファイルまたはデバイスを開くことができません。

このフラグが指定されておらず、かつファイルまたはデバイスが書き込みアクセス用に既に開かれているか、書き込みアクセス権を持つファイルマッピングが存在する場合、関数は失敗します。

dwCreationDispositionFILE_CREATION_DISPOSITIONin

存在する、または存在しないファイルまたはデバイスに対して実行するアクション。

ファイル以外のデバイスの場合、このパラメーターには通常 OPEN_EXISTING を設定します。

詳細については、「解説」セクションを参照してください。

このパラメーターには、以下の値のいずれかを指定する必要があり、これらを組み合わせることはできません。

意味
CREATE_ALWAYS
2
常に新しいファイルを作成します。

指定したファイルが存在し書き込み可能な場合、関数はファイルを切り詰め、成功し、最終エラーコードは ERROR_ALREADY_EXISTS(183)に設定されます。

指定したファイルが存在せず、有効なパスである場合、新しいファイルが作成され、関数は成功し、最終エラーコードはゼロに設定されます。

詳細については、本トピックの「解説」セクションを参照してください。

CREATE_NEW
1
ファイルがまだ存在しない場合にのみ、新しいファイルを作成します。

指定したファイルが存在する場合、関数は失敗し、最終エラーコードは ERROR_FILE_EXISTS(80)に設定されます。

指定したファイルが存在せず、書き込み可能な場所への有効なパスである場合、新しいファイルが作成されます。

OPEN_ALWAYS
4
常にファイルを開きます。

指定したファイルが存在する場合、関数は成功し、最終エラーコードは ERROR_ALREADY_EXISTS(183)に設定されます。

指定したファイルが存在せず、書き込み可能な場所への有効なパスである場合、関数はファイルを作成し、最終エラーコードはゼロに設定されます。

OPEN_EXISTING
3
ファイルまたはデバイスが存在する場合にのみ、それを開きます。

指定したファイルまたはデバイスが存在しない場合、関数は失敗し、最終エラーコードは ERROR_FILE_NOT_FOUND(2)に設定されます。

デバイスに関する詳細は、「解説」セクションを参照してください。

TRUNCATE_EXISTING
5
ファイルが存在する場合にのみ、それを開き、サイズがゼロバイトになるように切り詰めます。

指定したファイルが存在しない場合、関数は失敗し、最終エラーコードは ERROR_FILE_NOT_FOUND(2)に設定されます。

呼び出し元のプロセスは、dwDesiredAccess パラメーターの一部として GENERIC_WRITE ビットを設定してファイルを開く必要があります。

pCreateExParamsCREATEFILE2_EXTENDED_PARAMETERS*inoptionalオプションの CREATEFILE2_EXTENDED_PARAMETERS 構造体へのポインター。

戻り値の型: HANDLE

公式ドキュメント

ファイルまたは I/O デバイスを作成または開きます。

戻り値

関数が成功した場合、戻り値は指定されたファイル、デバイス、名前付きパイプ、またはメールスロットへの開いたハンドルです。

関数が失敗した場合、戻り値は INVALID_HANDLE_VALUE です。拡張エラー情報を取得するには、GetLastError を呼び出します。

解説(Remarks)

CreateFile2 関数を使用するアプリケーションをコンパイルするには、_WIN32_WINNT マクロを 0x0602 以降として定義します。詳細については、 Using the Windows Headers を参照してください。

CreateFile2 は、ファイル操作のほか、Windows 開発者が利用できるほとんどの種類の I/O デバイスおよびメカニズムをサポートします。このセクションでは、さまざまなコンテキストやさまざまな I/O タイプで CreateFile2 を使用する際に開発者が経験しうる多様な問題を取り上げます。本文では、file という語を、ファイルシステム上の実際のファイルに格納されたデータを具体的に指す場合にのみ使用するよう努めています。ただし、file の一部の用法は、ファイルのようなメカニズムをサポートする I/O オブジェクトをより一般的に指している場合があります。前述の歴史的な理由により、定数名やパラメーター名では特に file という語のこうした緩やかな用法が多く見られます。

アプリケーションが CreateFile2 によって返されたオブジェクトハンドルの使用を終えたら、CloseHandle 関数を使用してハンドルを閉じます。これにより、システムリソースが解放されるだけでなく、ファイルやデバイスの共有、データのディスクへのコミットなどにも広く影響を及ぼします。具体的な内容は、本トピック内で適宜記載されています。

NTFS ファイルシステムなどの一部のファイルシステムは、個々のファイルおよびディレクトリの圧縮または暗号化をサポートしています。この機能をサポートするファイルシステムがマウントされているボリューム上では、新しいファイルは、そのディレクトリの圧縮属性および暗号化属性を継承します。

CreateFile2 を使用して、ファイルまたはディレクトリの圧縮、展開、または復号を制御することはできません。詳細については、 Creating and Opening FilesFile Compression and Decompression、および File Encryption を参照してください。

pCreateExParams パラメーターで渡される CREATEFILE2_EXTENDED_PARAMETERS 構造体の lpSecurityAttributes メンバーが NULL の場合、CreateFile2 によって返されるハンドルは、アプリケーションが作成しうる子プロセスに継承されません。このメンバーに関する以下の情報も適用されます。

Windows 8 および Windows Server 2012 では、この関数は以下のテクノロジによってサポートされます。
テクノロジ サポート
Server Message Block (SMB) 3.0 プロトコル はい
SMB 3.0 トランスペアレントフェールオーバー (TFO) いいえ
SMB 3.0 スケールアウトファイル共有 (SO) いいえ
クラスター共有ボリュームファイルシステム (CsvFS) はい
回復性ファイルシステム (ReFS) はい

シンボリックリンクの動作

この関数の呼び出しがファイルを作成する場合、動作に変更はありません。また、pCreateExParams パラメーターで渡される CREATEFILE2_EXTENDED_PARAMETERS 構造体の dwFileFlags メンバーに対する FILE_FLAG_OPEN_REPARSE_POINT フラグについて、以下の情報を考慮してください。

ファイル

ファイルの名前変更または削除を行い、その後すぐに復元すると、システムはキャッシュ内で復元するファイル情報を検索します。キャッシュされる情報には、短い名前と長い名前のペア、および作成時刻が含まれます。

以前の DeleteFile の呼び出しの結果として削除保留中のファイルに対して CreateFile2 を呼び出すと、関数は失敗します。オペレーティングシステムは、そのファイルへのすべてのハンドルが閉じられるまでファイルの削除を遅延させます。GetLastErrorERROR_ACCESS_DENIED を返します。

dwDesiredAccess パラメーターはゼロにすることができ、アプリケーションが適切なセキュリティ設定で実行されている場合は、ファイルにアクセスすることなくファイル属性を照会できます。これは、読み取りや書き込みアクセス用にファイルを開かずにファイルの存在をテストしたり、ファイルやディレクトリに関するその他の統計情報を取得したりするのに役立ちます。Obtaining and Setting File Information および GetFileInformationByHandle を参照してください。

アプリケーションがネットワーク経由でファイルを作成する場合、dwDesiredAccessGENERIC_WRITE 単独を使用するよりも、GENERIC_READ | GENERIC_WRITE を使用する方が優れています。リダイレクターがキャッシュマネージャーを使用でき、より多くのデータをより少ない SMB で送信できるため、結果として得られるコードは高速になります。この組み合わせは、ネットワーク経由でファイルに書き込む際に、まれに ERROR_ACCESS_DENIED が返される問題も回避します。

詳細については、Creating and Opening Files を参照してください。

ファイルストリーム

NTFS ファイルシステムでは、CreateFile2 を使用してファイル内に別々のストリームを作成できます。詳細については、File Streams を参照してください。

ディレクトリ

アプリケーションは CreateFile2 を使用してディレクトリを作成することはできません。したがって、このユースケースでは dwCreationDisposition に対して OPEN_EXISTING 値のみが有効です。ディレクトリを作成するには、アプリケーションは CreateDirectory または CreateDirectoryEx を呼び出す必要があります。

CreateFile2 を使用してディレクトリを開くには、pCreateExParams パラメーターで渡される CREATEFILE2_EXTENDED_PARAMETERS 構造体の dwFileFlags メンバーの一部として FILE_FLAG_BACKUP_SEMANTICS フラグを指定します。このフラグを SE_BACKUP_NAME および SE_RESTORE_NAME 特権なしで使用した場合でも、適切なセキュリティチェックは引き続き適用されます。

CreateFile2 を使用して FAT または FAT32 ファイルシステムボリュームのデフラグ中にディレクトリを開く場合は、MAXIMUM_ALLOWED アクセス権を指定しないでください。これを行うと、ディレクトリへのアクセスが拒否されます。代わりに GENERIC_READ アクセス権を指定してください。

詳細については、About Directory Management を参照してください。

物理ディスクとボリューム

ディスクまたはボリュームへの直接アクセスは制限されています。

CreateFile2 関数を使用して物理ディスクドライブまたはボリュームを開くことができ、これにより DeviceIoControl 関数で使用できる直接アクセスストレージデバイス (DASD) ハンドルが返されます。これにより、たとえばパーティションテーブルなどのディスクメタデータへのアクセスのように、ディスクまたはボリュームに直接アクセスできるようになります。ただし、この種のアクセスは、このメカニズムを使用したディスクへの不正な書き込みによってその内容がオペレーティングシステムからアクセスできなくなる可能性があるため、ディスクドライブまたはボリュームを潜在的なデータ損失にさらします。データの整合性を確保するため、DeviceIoControl と、直接アクセスハンドルがファイルシステムハンドルとは異なる動作を他の API がどのように示すかについて、よく理解しておいてください。

このような呼び出しが成功するには、以下の要件を満たす必要があります。

Note dwDesiredAccess パラメーターはゼロにすることができ、アプリケーションがデバイスにアクセスすることなくデバイス属性を照会できるようになります。これは、たとえばドライブにフロッピーディスクを必要とせずにフロッピーディスクドライブのサイズとサポートするフォーマットを判別する場合などに役立ちます。また、上位レベルのデータ読み取り/書き込み権限を必要とせずに統計情報を読み取るためにも使用できます。
物理ドライブ x: を開く場合、lpFileName 文字列は次の形式にする必要があります。 "\\.\PhysicalDriveX"。ハードディスク番号はゼロから始まります。次の表に物理ドライブ文字列の例をいくつか示します。
文字列 意味
"\\.\PhysicalDrive0" 最初の物理ドライブを開きます。
"\\.\PhysicalDrive2" 3 番目の物理ドライブを開きます。

ボリュームの物理ドライブ識別子を取得するには、ボリュームへのハンドルを開き、IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS を指定して DeviceIoControl 関数を呼び出します。この制御コードは、ボリュームの 1 つ以上の各エクステントのディスク番号とオフセットを返します。ボリュームは複数の物理ディスクにまたがることがあります。

物理ドライブを開く例については、Calling DeviceIoControl を参照してください。

ボリュームまたはリムーバブルメディアドライブ(たとえばフロッピーディスクドライブやフラッシュメモリのサムドライブ)を開く場合、lpFileName 文字列は次の形式にする必要があります。 "\\.\X:"。末尾にバックスラッシュ (\) を付けないでください。これはドライブのルートディレクトリを示します。次の表にドライブ文字列の例をいくつか示します。

文字列 意味
"\\.\A:" フロッピーディスクドライブ A を開きます。
"\\.\C:" C: ボリュームを開きます。
"\\.\C:\" C: ボリュームのファイルシステムを開きます。

ボリューム名を参照してボリュームを開くこともできます。詳細については、Naming a Volume を参照してください。

ボリュームには 1 つ以上のマウントされたファイルシステムが含まれます。ボリュームハンドルは、CreateFile2 でノンキャッシュオプションが指定されていない場合でも、特定のファイルシステムの裁量によりノンキャッシュとして開かれることがあります。すべての Microsoft ファイルシステムがボリュームハンドルをノンキャッシュとして開くものと想定してください。ファイルに対するノンキャッシュ I/O の制限は、ボリュームにも適用されます。

データがノンキャッシュであっても、ファイルシステムはバッファーのアライメントを必要とする場合とそうでない場合があります。ただし、ボリュームを開く際にノンキャッシュオプションが指定されている場合、ボリューム上のファイルシステムに関係なくバッファーのアライメントが強制されます。すべてのファイルシステムで、ボリュームハンドルをノンキャッシュとして開き、ノンキャッシュ I/O の制限に従うことをお勧めします。

Note ボリュームの最後の数セクターを読み書きするには、DeviceIoControl を呼び出し、FSCTL_ALLOW_EXTENDED_DASD_IO を指定する必要があります。これは、パーティションの読み取りまたは書き込み呼び出しに対して I/O 境界チェックを実行しないようファイルシステムドライバーに指示します。代わりに、境界チェックはデバイスドライバーによって実行されます。

チェンジャーデバイス

DeviceIoControl 用の IOCTL_CHANGER_* 制御コードは、チェンジャーデバイスへのハンドルを受け付けます。チェンジャーデバイスを開くには、次の形式のファイル名を使用します。 "\\.\Changerx"。ここで x は、開くデバイスを示す番号で、ゼロから始まります。C または C++ で記述されたアプリケーションでチェンジャーデバイス 0 を開くには、次のファイル名を使用します。 "\\\\.\\Changer0"。

テープドライブ

次の形式のファイル名を使用してテープドライブを開くことができます。 "\\.\TAPEx"。ここで x は、開くドライブを示す番号で、テープドライブ 0 から始まります。C または C++ で記述されたアプリケーションでテープドライブ 0 を開くには、次のファイル名を使用します。 "\\\\.\\TAPE0"。

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

通信リソース

CreateFile2 関数は、シリアルポート COM1 などの通信リソースへのハンドルを作成できます。通信リソースの場合、dwCreationDisposition パラメーターは OPEN_EXISTING でなければならず、dwShareMode パラメーターはゼロ(排他アクセス)でなければならず、hTemplateFile パラメーターは NULL でなければなりません。読み取り、書き込み、または読み取り/書き込みアクセスを指定でき、ハンドルはオーバーラップ I/O 用に開くことができます。

9 より大きい COM ポート番号を指定するには、次の構文を使用します。 "\.\COM10"。この構文は、すべてのポート番号、および COM ポート番号の指定を許可するハードウェアで機能します。

通信に関する詳細は、Communications を参照してください。

コンソール

CreateFile2 関数は、コンソール入力 (CONIN$) へのハンドルを作成できます。プロセスが継承または複製の結果としてそれへの開いたハンドルを持っている場合、アクティブなスクリーンバッファー (CONOUT$) へのハンドルも作成できます。呼び出し元のプロセスは、継承されたコンソール、または AllocConsole 関数によって割り当てられたコンソールにアタッチされている必要があります。コンソールハンドルの場合、CreateFile2 のパラメーターを次のように設定します。
パラメーター
lpFileName コンソール入力を指定するには CONIN$ 値を使用します。

コンソール出力を指定するには CONOUT$ 値を使用します。

CONIN$ は、SetStdHandle 関数が標準入力ハンドルをリダイレクトする場合でも、コンソール入力バッファーへのハンドルを取得します。標準入力ハンドルを取得するには、GetStdHandle 関数を使用します。

CONOUT$ は、SetStdHandle が標準出力ハンドルをリダイレクトする場合でも、アクティブなスクリーンバッファーへのハンドルを取得します。標準出力ハンドルを取得するには、GetStdHandle を使用します。

dwDesiredAccess GENERIC_READ | GENERIC_WRITE が推奨されますが、いずれか一方でアクセスを制限することもできます。
dwShareMode CONIN$ を開く場合は FILE_SHARE_READ を指定します。CONOUT$ を開く場合は FILE_SHARE_WRITE を指定します。

呼び出し元のプロセスがコンソールを継承する場合、または子プロセスがコンソールにアクセスできるようにする場合、このパラメーターは FILE_SHARE_READ | FILE_SHARE_WRITE でなければなりません。

dwCreationDisposition CreateFile2 を使用してコンソールを開く場合は、OPEN_EXISTING を指定する必要があります。

pCreateExParams パラメーターで渡される CREATEFILE2_EXTENDED_PARAMETERS 構造体のメンバーを次のように設定します。

メンバー
lpSecurityAttributes コンソールを継承させたい場合、SECURITY_ATTRIBUTES 構造体の bInheritHandle メンバーは TRUE でなければなりません。
dwFileAttributes

dwFileFlags

dwSecurityQosFlags

hTemplateFile

無視されます。

次の表に、dwDesiredAccesslpFileName のさまざまな設定を示します。

lpFileName dwDesiredAccess 結果
"CON" GENERIC_READ コンソールを入力用に開きます。
"CON" GENERIC_WRITE コンソールを出力用に開きます。
"CON" GENERIC_READ | GENERIC_WRITE CreateFile2 を失敗させます。GetLastErrorERROR_FILE_NOT_FOUND を返します。

メールスロット

CreateFile2 がメールスロットのクライアント側を開く場合、メールスロットクライアントが、メールスロットサーバーが CreateMailSlot 関数でローカルメールスロットを作成する前にそれを開こうとすると、関数は INVALID_HANDLE_VALUE を返します。

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

パイプ

CreateFile2 が名前付きパイプのクライアント側を開く場合、関数はリッスン状態にある名前付きパイプの任意のインスタンスを使用します。開いているプロセスは必要なだけハンドルを複製できますが、開かれた後は、その名前付きパイプインスタンスを別のクライアントが開くことはできません。パイプを開く際に指定されるアクセスは、CreateNamedPipe 関数の dwOpenMode パラメーターで指定されるアクセスと互換性がある必要があります。

この操作の前にサーバーで CreateNamedPipe 関数が正常に呼び出されていない場合、パイプは存在せず、CreateFile2ERROR_FILE_NOT_FOUND で失敗します。

アクティブなパイプインスタンスが少なくとも 1 つあるものの、サーバー上に利用可能なリスナーパイプがない場合(つまり、すべてのパイプインスタンスが現在接続されている場合)、CreateFile2ERROR_PIPE_BUSY で失敗します。

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

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// KERNEL32.dll
#include <windows.h>

HANDLE CreateFile2(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    FILE_SHARE_MODE dwShareMode,
    FILE_CREATION_DISPOSITION dwCreationDisposition,
    CREATEFILE2_EXTENDED_PARAMETERS* pCreateExParams   // optional
);
[DllImport("KERNEL32.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr CreateFile2(
    [MarshalAs(UnmanagedType.LPWStr)] string lpFileName,   // LPCWSTR
    uint dwDesiredAccess,   // DWORD
    uint dwShareMode,   // FILE_SHARE_MODE
    uint dwCreationDisposition,   // FILE_CREATION_DISPOSITION
    IntPtr pCreateExParams   // CREATEFILE2_EXTENDED_PARAMETERS* optional
);
<DllImport("KERNEL32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function CreateFile2(
    <MarshalAs(UnmanagedType.LPWStr)> lpFileName As String,   ' LPCWSTR
    dwDesiredAccess As UInteger,   ' DWORD
    dwShareMode As UInteger,   ' FILE_SHARE_MODE
    dwCreationDisposition As UInteger,   ' FILE_CREATION_DISPOSITION
    pCreateExParams As IntPtr   ' CREATEFILE2_EXTENDED_PARAMETERS* optional
) As IntPtr
End Function
' lpFileName : LPCWSTR
' dwDesiredAccess : DWORD
' dwShareMode : FILE_SHARE_MODE
' dwCreationDisposition : FILE_CREATION_DISPOSITION
' pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional
Declare PtrSafe Function CreateFile2 Lib "kernel32" ( _
    ByVal lpFileName As LongPtr, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, _
    ByVal dwCreationDisposition As Long, _
    ByVal pCreateExParams As LongPtr) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CreateFile2 = ctypes.windll.kernel32.CreateFile2
CreateFile2.restype = ctypes.c_void_p
CreateFile2.argtypes = [
    wintypes.LPCWSTR,  # lpFileName : LPCWSTR
    wintypes.DWORD,  # dwDesiredAccess : DWORD
    wintypes.DWORD,  # dwShareMode : FILE_SHARE_MODE
    wintypes.DWORD,  # dwCreationDisposition : FILE_CREATION_DISPOSITION
    ctypes.c_void_p,  # pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
CreateFile2 = Fiddle::Function.new(
  lib['CreateFile2'],
  [
    Fiddle::TYPE_VOIDP,  # lpFileName : LPCWSTR
    -Fiddle::TYPE_INT,  # dwDesiredAccess : DWORD
    -Fiddle::TYPE_INT,  # dwShareMode : FILE_SHARE_MODE
    -Fiddle::TYPE_INT,  # dwCreationDisposition : FILE_CREATION_DISPOSITION
    Fiddle::TYPE_VOIDP,  # pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional
  ],
  Fiddle::TYPE_VOIDP)
#[link(name = "kernel32")]
extern "system" {
    fn CreateFile2(
        lpFileName: *const u16,  // LPCWSTR
        dwDesiredAccess: u32,  // DWORD
        dwShareMode: u32,  // FILE_SHARE_MODE
        dwCreationDisposition: u32,  // FILE_CREATION_DISPOSITION
        pCreateExParams: *mut CREATEFILE2_EXTENDED_PARAMETERS  // CREATEFILE2_EXTENDED_PARAMETERS* optional
    ) -> *mut core::ffi::c_void;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("KERNEL32.dll", SetLastError = true)]
public static extern IntPtr CreateFile2([MarshalAs(UnmanagedType.LPWStr)] string lpFileName, uint dwDesiredAccess, uint dwShareMode, uint dwCreationDisposition, IntPtr pCreateExParams);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_CreateFile2' -Namespace Win32 -PassThru
# $api::CreateFile2(lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, pCreateExParams)
#uselib "KERNEL32.dll"
#func global CreateFile2 "CreateFile2" sptr, sptr, sptr, sptr, sptr
; CreateFile2 lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, varptr(pCreateExParams)   ; 戻り値は stat
; lpFileName : LPCWSTR -> "sptr"
; dwDesiredAccess : DWORD -> "sptr"
; dwShareMode : FILE_SHARE_MODE -> "sptr"
; dwCreationDisposition : FILE_CREATION_DISPOSITION -> "sptr"
; pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "KERNEL32.dll"
#cfunc global CreateFile2 "CreateFile2" wstr, int, int, int, var
; res = CreateFile2(lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, pCreateExParams)
; lpFileName : LPCWSTR -> "wstr"
; dwDesiredAccess : DWORD -> "int"
; dwShareMode : FILE_SHARE_MODE -> "int"
; dwCreationDisposition : FILE_CREATION_DISPOSITION -> "int"
; pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HANDLE CreateFile2(LPCWSTR lpFileName, DWORD dwDesiredAccess, FILE_SHARE_MODE dwShareMode, FILE_CREATION_DISPOSITION dwCreationDisposition, CREATEFILE2_EXTENDED_PARAMETERS* pCreateExParams)
#uselib "KERNEL32.dll"
#cfunc global CreateFile2 "CreateFile2" wstr, int, int, int, var
; res = CreateFile2(lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, pCreateExParams)
; lpFileName : LPCWSTR -> "wstr"
; dwDesiredAccess : DWORD -> "int"
; dwShareMode : FILE_SHARE_MODE -> "int"
; dwCreationDisposition : FILE_CREATION_DISPOSITION -> "int"
; pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procCreateFile2 = kernel32.NewProc("CreateFile2")
)

// lpFileName (LPCWSTR), dwDesiredAccess (DWORD), dwShareMode (FILE_SHARE_MODE), dwCreationDisposition (FILE_CREATION_DISPOSITION), pCreateExParams (CREATEFILE2_EXTENDED_PARAMETERS* optional)
r1, _, err := procCreateFile2.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpFileName))),
	uintptr(dwDesiredAccess),
	uintptr(dwShareMode),
	uintptr(dwCreationDisposition),
	uintptr(pCreateExParams),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HANDLE
function CreateFile2(
  lpFileName: PWideChar;   // LPCWSTR
  dwDesiredAccess: DWORD;   // DWORD
  dwShareMode: DWORD;   // FILE_SHARE_MODE
  dwCreationDisposition: DWORD;   // FILE_CREATION_DISPOSITION
  pCreateExParams: Pointer   // CREATEFILE2_EXTENDED_PARAMETERS* optional
): THandle; stdcall;
  external 'KERNEL32.dll' name 'CreateFile2';
result := DllCall("KERNEL32\CreateFile2"
    , "WStr", lpFileName   ; LPCWSTR
    , "UInt", dwDesiredAccess   ; DWORD
    , "UInt", dwShareMode   ; FILE_SHARE_MODE
    , "UInt", dwCreationDisposition   ; FILE_CREATION_DISPOSITION
    , "Ptr", pCreateExParams   ; CREATEFILE2_EXTENDED_PARAMETERS* optional
    , "Ptr")   ; return: HANDLE
●CreateFile2(lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, pCreateExParams) = DLL("KERNEL32.dll", "void* CreateFile2(char*, dword, dword, dword, void*)")
# 呼び出し: CreateFile2(lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, pCreateExParams)
# lpFileName : LPCWSTR -> "char*"
# dwDesiredAccess : DWORD -> "dword"
# dwShareMode : FILE_SHARE_MODE -> "dword"
# dwCreationDisposition : FILE_CREATION_DISPOSITION -> "dword"
# pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "kernel32" fn CreateFile2(
    lpFileName: [*c]const u16, // LPCWSTR
    dwDesiredAccess: u32, // DWORD
    dwShareMode: u32, // FILE_SHARE_MODE
    dwCreationDisposition: u32, // FILE_CREATION_DISPOSITION
    pCreateExParams: [*c]CREATEFILE2_EXTENDED_PARAMETERS // CREATEFILE2_EXTENDED_PARAMETERS* optional
) callconv(std.os.windows.WINAPI) ?*anyopaque;
proc CreateFile2(
    lpFileName: WideCString,  # LPCWSTR
    dwDesiredAccess: uint32,  # DWORD
    dwShareMode: uint32,  # FILE_SHARE_MODE
    dwCreationDisposition: uint32,  # FILE_CREATION_DISPOSITION
    pCreateExParams: ptr CREATEFILE2_EXTENDED_PARAMETERS  # CREATEFILE2_EXTENDED_PARAMETERS* optional
): pointer {.importc: "CreateFile2", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
void* CreateFile2(
    const(wchar)* lpFileName,   // LPCWSTR
    uint dwDesiredAccess,   // DWORD
    uint dwShareMode,   // FILE_SHARE_MODE
    uint dwCreationDisposition,   // FILE_CREATION_DISPOSITION
    CREATEFILE2_EXTENDED_PARAMETERS* pCreateExParams   // CREATEFILE2_EXTENDED_PARAMETERS* optional
);
ccall((:CreateFile2, "KERNEL32.dll"), stdcall, Ptr{Cvoid},
      (Cwstring, UInt32, UInt32, UInt32, Ptr{CREATEFILE2_EXTENDED_PARAMETERS}),
      lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, pCreateExParams)
# lpFileName : LPCWSTR -> Cwstring
# dwDesiredAccess : DWORD -> UInt32
# dwShareMode : FILE_SHARE_MODE -> UInt32
# dwCreationDisposition : FILE_CREATION_DISPOSITION -> UInt32
# pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional -> Ptr{CREATEFILE2_EXTENDED_PARAMETERS}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void* CreateFile2(
    const uint16_t* lpFileName,
    uint32_t dwDesiredAccess,
    uint32_t dwShareMode,
    uint32_t dwCreationDisposition,
    void* pCreateExParams);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.CreateFile2(lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, pCreateExParams)
-- lpFileName : LPCWSTR
-- dwDesiredAccess : DWORD
-- dwShareMode : FILE_SHARE_MODE
-- dwCreationDisposition : FILE_CREATION_DISPOSITION
-- pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const CreateFile2 = lib.func('__stdcall', 'CreateFile2', 'void *', ['str16', 'uint32_t', 'uint32_t', 'uint32_t', 'void *']);
// CreateFile2(lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, pCreateExParams)
// lpFileName : LPCWSTR -> 'str16'
// dwDesiredAccess : DWORD -> 'uint32_t'
// dwShareMode : FILE_SHARE_MODE -> 'uint32_t'
// dwCreationDisposition : FILE_CREATION_DISPOSITION -> 'uint32_t'
// pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  CreateFile2: { parameters: ["buffer", "u32", "u32", "u32", "pointer"], result: "pointer" },
});
// lib.symbols.CreateFile2(lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, pCreateExParams)
// lpFileName : LPCWSTR -> "buffer"
// dwDesiredAccess : DWORD -> "u32"
// dwShareMode : FILE_SHARE_MODE -> "u32"
// dwCreationDisposition : FILE_CREATION_DISPOSITION -> "u32"
// pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* CreateFile2(
    const uint16_t* lpFileName,
    uint32_t dwDesiredAccess,
    uint32_t dwShareMode,
    uint32_t dwCreationDisposition,
    void* pCreateExParams);
C, "KERNEL32.dll");
// $ffi->CreateFile2(lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, pCreateExParams);
// lpFileName : LPCWSTR
// dwDesiredAccess : DWORD
// dwShareMode : FILE_SHARE_MODE
// dwCreationDisposition : FILE_CREATION_DISPOSITION
// pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Kernel32 extends StdCallLibrary {
    Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
    Pointer CreateFile2(
        WString lpFileName,   // LPCWSTR
        int dwDesiredAccess,   // DWORD
        int dwShareMode,   // FILE_SHARE_MODE
        int dwCreationDisposition,   // FILE_CREATION_DISPOSITION
        Pointer pCreateExParams   // CREATEFILE2_EXTENDED_PARAMETERS* optional
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun CreateFile2 = CreateFile2(
    lpFileName : UInt16*,   # LPCWSTR
    dwDesiredAccess : UInt32,   # DWORD
    dwShareMode : UInt32,   # FILE_SHARE_MODE
    dwCreationDisposition : UInt32,   # FILE_CREATION_DISPOSITION
    pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS*   # CREATEFILE2_EXTENDED_PARAMETERS* optional
  ) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef CreateFile2Native = Pointer<Void> Function(Pointer<Utf16>, Uint32, Uint32, Uint32, Pointer<Void>);
typedef CreateFile2Dart = Pointer<Void> Function(Pointer<Utf16>, int, int, int, Pointer<Void>);
final CreateFile2 = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<CreateFile2Native, CreateFile2Dart>('CreateFile2');
// lpFileName : LPCWSTR -> Pointer<Utf16>
// dwDesiredAccess : DWORD -> Uint32
// dwShareMode : FILE_SHARE_MODE -> Uint32
// dwCreationDisposition : FILE_CREATION_DISPOSITION -> Uint32
// pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CreateFile2(
  lpFileName: PWideChar;   // LPCWSTR
  dwDesiredAccess: DWORD;   // DWORD
  dwShareMode: DWORD;   // FILE_SHARE_MODE
  dwCreationDisposition: DWORD;   // FILE_CREATION_DISPOSITION
  pCreateExParams: Pointer   // CREATEFILE2_EXTENDED_PARAMETERS* optional
): THandle; stdcall;
  external 'KERNEL32.dll' name 'CreateFile2';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "CreateFile2"
  c_CreateFile2 :: CWString -> Word32 -> Word32 -> Word32 -> Ptr () -> IO (Ptr ())
-- lpFileName : LPCWSTR -> CWString
-- dwDesiredAccess : DWORD -> Word32
-- dwShareMode : FILE_SHARE_MODE -> Word32
-- dwCreationDisposition : FILE_CREATION_DISPOSITION -> Word32
-- pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let createfile2 =
  foreign "CreateFile2"
    ((ptr uint16_t) @-> uint32_t @-> uint32_t @-> uint32_t @-> (ptr void) @-> returning (ptr void))
(* lpFileName : LPCWSTR -> (ptr uint16_t) *)
(* dwDesiredAccess : DWORD -> uint32_t *)
(* dwShareMode : FILE_SHARE_MODE -> uint32_t *)
(* dwCreationDisposition : FILE_CREATION_DISPOSITION -> uint32_t *)
(* pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("CreateFile2" create-file2 :convention :stdcall) :pointer
  (lp-file-name (:string :encoding :utf-16le))   ; LPCWSTR
  (dw-desired-access :uint32)   ; DWORD
  (dw-share-mode :uint32)   ; FILE_SHARE_MODE
  (dw-creation-disposition :uint32)   ; FILE_CREATION_DISPOSITION
  (p-create-ex-params :pointer))   ; CREATEFILE2_EXTENDED_PARAMETERS* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CreateFile2 = Win32::API::More->new('KERNEL32',
    'HANDLE CreateFile2(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition, LPVOID pCreateExParams)');
# my $ret = $CreateFile2->Call($lpFileName, $dwDesiredAccess, $dwShareMode, $dwCreationDisposition, $pCreateExParams);
# lpFileName : LPCWSTR -> LPCWSTR
# dwDesiredAccess : DWORD -> DWORD
# dwShareMode : FILE_SHARE_MODE -> DWORD
# dwCreationDisposition : FILE_CREATION_DISPOSITION -> DWORD
# pCreateExParams : CREATEFILE2_EXTENDED_PARAMETERS* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

類似 API
公式の関連項目
使用する型