Win32 API 日本語リファレンス
ホームSecurity.Cryptography › CertOpenStore

CertOpenStore

関数
指定したプロバイダーで証明書ストアを開く。
DLLCRYPT32.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

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

HCERTSTORE CertOpenStore(
    LPCSTR lpszStoreProvider,
    CERT_QUERY_ENCODING_TYPE dwEncodingType,
    HCRYPTPROV_LEGACY hCryptProv,   // optional
    CERT_OPEN_STORE_FLAGS dwFlags,
    const void* pvPara   // optional
);

パラメーター

名前方向説明
lpszStoreProviderLPCSTRin

ストアプロバイダーの種類を格納する、null 終端の ANSI 文字列へのポインターです。

以下の値は、定義済みのストアの種類を表します。ストアプロバイダーの種類によって、pvPara パラメーターの内容、および dwFlags パラメーターの上位ワードの用途と意味が決まります。追加のストアプロバイダーは、 CryptInstallOIDFunctionAddress 関数または CryptRegisterOIDFunction 関数を使用してインストールまたは登録できます。ストアプロバイダーの追加について詳しくは、 Extending CertOpenStore Functionality を参照してください。

意味
CERT_STORE_PROV_COLLECTION
sz_CERT_STORE_PROV_COLLECTION
他のストアの集合となるストアを開きます。ストアは CertAddStoreToCollection および CertRemoveStoreFromCollection を使用して、コレクションへの追加またはコレクションからの削除が行われます。ストアがコレクションに追加されると、そのストア内のすべての証明書、CRL、CTL が、コレクションストアの検索や列挙の対象になります。

dwFlags の上位ワードはゼロに設定します。

pvPara の値: pvPara パラメーターは NULL でなければなりません。

CERT_STORE_PROV_FILE
指定された開いているファイルから読み取った証明書、CRL、CTL を使用してストアを初期化します。このプロバイダーは、ファイルにシリアル化されたストアのみが含まれ、PKCS #7 署名付きメッセージや単一のエンコード済み証明書は含まれないものとして扱います。

ファイルポインターは、シリアル化されたストア情報の先頭に位置している必要があります。シリアル化されたストア内のデータが証明書ストアに読み込まれた後、ファイルポインターは、ファイル内でシリアル化されたストアデータに続くデータ(存在する場合)の先頭に位置します。dwFlags に CERT_FILE_STORE_COMMIT_ENABLE が設定されている場合、ファイルハンドルは複製され、ストアは常にシリアル化されたストアとしてコミットされます。ストアを閉じてもファイルは閉じられません。

pvPara の値: pvPara パラメーターには、CreateFile を使用して開いたファイルのハンドルへのポインターを格納する必要があります。

CERT_STORE_PROV_FILENAME_A
ファイルから取得した証明書、CRL、CTL を使用してストアを初期化します。プロバイダーはファイルを開き、まずシリアル化されたストアとして、次に PKCS #7 署名付きメッセージとして、最後に単一のエンコード済み証明書として読み取りを試みます。

dwEncodingType パラメーターには、メッセージと証明書の両方に使用するエンコードの種類を格納する必要があります。ファイルに X.509 エンコード済み証明書が含まれている場合、開く操作は失敗し、GetLastError 関数の呼び出しは ERROR_ACCESS_DENIED を返します。 dwFlagsCERT_FILE_STORE_COMMIT_ENABLE フラグが設定されている場合、CreateFile に渡される dwCreationDisposition の値は次のようになります。

dwFlagsCERT_FILE_STORE_COMMIT_ENABLE が含まれている場合、開いたファイルの種類に応じて、ファイルは PKCS #7 またはシリアル化されたストアのいずれかとしてコミットされます。ファイルが空であった場合、またはファイル名の拡張子が .p7c もしくは .spc である場合、ファイルは PKCS #7 としてコミットされます。それ以外の場合、ファイルはシリアル化されたストアとしてコミットされます。

pvPara の値: pvPara パラメーターには、既存の未オープンのファイルの名前を格納する、null 終端の ANSI 文字列へのポインターを格納する必要があります。

CERT_STORE_PROV_FILENAME(_W)
sz_CERT_STORE_PROV_FILENAME(_W)
CERT_STORE_PROV_FILENAME_A と同じです。

pvPara の値: pvPara パラメーターには、既存の未オープンのファイルの名前を格納する、null 終端の Unicode 文字列へのポインターを格納する必要があります。

CERT_STORE_PROV_LDAP(_W)
sz_CERT_STORE_PROV_LDAP(_W)
LDAP クエリの結果から取得した証明書、CRL、CTL を使用してストアを初期化します。

ストアに対して書き込み操作を行うには、クエリ文字列でフィルターなしの BASE クエリと単一の属性を指定する必要があります。

pvPara の値: dwFlags パラメーターに CERT_LDAP_STORE_OPENED_FLAG が含まれている場合は、使用する確立済みの LDAP セッションを指定する CERT_LDAP_STORE_OPENED_PARA 構造体のアドレスを pvPara に設定します。

それ以外の場合は、LDAP クエリ文字列を格納する null 終端の Unicode 文字列を指すように pvPara を設定します。LDAP クエリ文字列について詳しくは、LDAP Dialect を参照してください。

CERT_STORE_PROV_MEMORY
sz_CERT_STORE_PROV_MEMORY
キャッシュされたメモリ内に証明書ストアを作成します。証明書、証明書失効リスト(CRL)、証明書信頼リスト(CTL)は、ストアに最初は読み込まれません。通常、一時的なストアの作成に使用されます。

メモリストア内の証明書、CRL、CTL の追加、あるいはこれらのプロパティの変更は、自動的には保存されません。これらは CertSaveStore を使用して、ファイルまたはメモリ BLOB に保存できます。

pvPara の値: pvPara パラメーターは使用されません。

CERT_STORE_PROV_MSG
指定された暗号化メッセージから取得した証明書、CRL、CTL を使用してストアを初期化します。dwEncodingType パラメーターには、メッセージと証明書の両方に使用するエンコードの種類を格納する必要があります。

pvPara の値: pvPara パラメーターには、CryptMsgOpenToDecode の呼び出しによって返された、エンコード済みメッセージの HCRYPTMSG ハンドルを格納します。

CERT_STORE_PROV_PHYSICAL(_W)
sz_CERT_STORE_PROV_PHYSICAL(_W)
論理システムストアのメンバーである指定された物理ストアから取得した証明書、CRL、CTL を使用してストアを初期化します。

2 つの名前は、間に置かれたバックスラッシュ(\)で区切ります。たとえば "Root.Default" のようになります。ここで "Root" はシステムストアの名前で、".Default" は物理ストアの名前です。システムストア名と物理ストア名にバックスラッシュを含めることはできません。dwFlags の上位ワードはシステムストアの場所を示し、通常は CERT_SYSTEM_STORE_CURRENT_USER です。詳しくは、本トピック後半の dwFlags および System Store Locations を参照してください。一部の物理ストアの場所はリモートで開くことができます。

pvPara の値: pvPara パラメーターは、システムストア名と物理ストア名の両方を格納する null 終端の Unicode 文字列を指します。

CERT_STORE_PROV_PKCS7
sz_CERT_STORE_PROV_PKCS7
エンコード済みの PKCS #7 署名付きメッセージから取得した証明書、CRL、CTL を使用してストアを初期化します。dwEncodingType パラメーターには、メッセージと証明書の両方に使用するエンコードの種類を指定する必要があります。

pvPara の値: pvPara パラメーターは、エンコード済みメッセージを表す CRYPT_DATA_BLOB 構造体を指します。

CERT_STORE_PROV_PKCS12
sz_CERT_STORE_PROV_PKCS12
PKCS #12 パケットの内容を使用してストアを初期化します。

PKCS #12 パケットが NULL または空のパスワードで保護されている場合、この関数はストアを正常に開きます。

Windows 8 および Windows Server 2012 以降では、PFX パケットに埋め込まれたパスワードが Active Directory(AD)プリンシパルに対して保護されており、そのプリンシパルのメンバーである現在のユーザーがパスワードを復号化する権限を持っている場合、この関数はストアを正常に開きます。詳しくは、pvPara パラメーター、および PFXExportCertStoreEx 関数の PKCS12_PROTECT_TO_DOMAIN_SIDS フラグを参照してください。

Windows 8 および Windows Server 2012 以降では、PFX パスワードを AD プリンシパルに対して保護できます。

pvPara の値: pvPara パラメーターは、PKCS #12 パケットを表す CRYPT_DATA_BLOB 構造体を指します。

CERT_STORE_PROV_REG
レジストリのサブキーから取得した証明書、CRL、CTL を使用してストアを初期化します。

このプロバイダーは、pvPara に渡されたキーの下にあるレジストリサブキー CertificatesCRLsCTLs を開くか作成します。入力されたキーはプロバイダーによって閉じられません。プロバイダーは、戻る前に、pvPara に渡されたキーの独自のコピーを開きます。dwFlags の下位ワードに CERT_STORE_READONLY_FLAG が設定されている場合、レジストリサブキーは RegOpenKey を KEY_READ_ACCESS で使用して開かれます。それ以外の場合、レジストリサブキーは RegCreateKeyKEY_ALL_ACCESS で使用して作成されます。開いているストアの内容に対する変更は、ただちにレジストリに永続化されます。ただし、dwFlags の下位ワードに CERT_STORE_READONLY_FLAG が設定されている場合、ストアの内容を追加しようとしたり、コンテキストのプロパティを変更しようとすると、エラーになり、GetLastErrorE_ACCESSDENIED コードを返します。

pvPara の値: pvPara パラメーターには、開いているレジストリキーのハンドルを格納します。

CERT_STORE_PROV_SERIALIZED
sz_CERT_STORE_PROV_SERIALIZED
シリアル化されたストアを格納するメモリ位置から取得した証明書、CRL、CTL を使用してストアを初期化します。

pvPara の値: pvPara パラメーターは、シリアル化されたメモリ BLOB を格納する CRYPT_DATA_BLOB 構造体を指します。

CERT_STORE_PROV_SMART_CARD(_W)
sz_CERT_STORE_PROV_SMART_CARD(_W)
現在は使用されていません。
CERT_STORE_PROV_SYSTEM_A
指定されたシステムストアから取得した証明書、CRL、CTL を使用してストアを初期化します。

システムストアは、1 つ以上の物理ストアで構成される論理的なコレクションストアです。システムストアに関連付けられた物理ストアは、CertRegisterPhysicalStore 関数で登録されます。システムストアが開かれると、それに関連付けられたすべての物理ストアも CertOpenStore の呼び出しによって開かれ、CertAddStoreToCollection 関数を使用してシステムストアのコレクションに追加されます。dwFlags の上位ワードはシステムストアの場所を示し、通常は CERT_SYSTEM_STORE_CURRENT_USER に設定されます。レジストリの場所について詳しくは、本トピック後半の dwFlags および System Store Locations を参照してください。一部のシステムストアの場所はリモートで開くことができます。詳しくは System Store Locations を参照してください。

pvPara の値: pvPara パラメーターは、"My" や "Root" などのシステムストア名を格納する null 終端の ANSI 文字列を指します。

CERT_STORE_PROV_SYSTEM(_W)
sz_CERT_STORE_PROV_SYSTEM(_W)
CERT_STORE_PROV_SYSTEM_A と同じです。

pvPara の値: pvPara パラメーターは、"My" や "Root" などのシステムストア名を格納する null 終端の Unicode 文字列を指します。

CERT_STORE_PROV_SYSTEM_REGISTRY_A
物理レジストリストアから取得した証明書、CRL、CTL を使用してストアを初期化します。物理ストアはコレクションストアとしては開かれません。列挙と検索は、その 1 つの物理ストア内の証明書、CRL、CTL のみを対象とします。

dwFlags の上位ワードはシステムストアの場所を示し、通常は CERT_SYSTEM_STORE_CURRENT_USER に設定されます。詳しくは、本トピック後半の dwFlags を参照してください。一部のシステムストアの場所はリモートで開くことができます。詳しくは System Store Locations を参照してください。

pvPara の値: pvPara パラメーターは、"My" や "Root" などのシステムストア名を格納する null 終端の ANSI 文字列を指します。

CERT_STORE_PROV_SYSTEM_REGISTRY(_W)
sz_CERT_STORE_PROV_SYSTEM_REGISTRY(_W)
CERT_STORE_PROV_SYSTEM_REGISTRY_A と同じです。

pvPara の値: pvPara パラメーターは、"My" や "Root" などのシステムストア名を格納する null 終端の Unicode 文字列を指します。

dwEncodingTypeCERT_QUERY_ENCODING_TYPEin

証明書エンコードの種類メッセージエンコードの種類を指定します。エンコードは、CertSaveStore 関数の dwSaveAs パラメーターに CERT_STORE_SAVE_AS_PKCS7 が含まれている場合にのみ使用されます。それ以外の場合、dwMsgAndCertEncodingType パラメーターは使用されません。

このパラメーターは、lpszStoreProvider パラメーターに CERT_STORE_PROV_MSGCERT_STORE_PROV_PKCS7、または CERT_STORE_PROV_FILENAME プロバイダーの種類が指定されている場合にのみ適用されます。その他のすべてのプロバイダーの種類では、このパラメーターは使用されず、ゼロに設定する必要があります。

このパラメーターには、次の値を 1 つ以上組み合わせて指定できます。

意味
PKCS_7_ASN_ENCODING
65536 (0x10000)
PKCS #7 メッセージエンコードを指定します。
X509_ASN_ENCODING
1 (0x1)
X.509 証明書エンコードを指定します。
hCryptProvHCRYPTPROV_LEGACYinoptional

このパラメーターは使用されず、NULL に設定する必要があります。

Windows Server 2003 および Windows XP: 暗号化プロバイダーへのハンドルです。このパラメーターに NULL を渡すと、適切な既定のプロバイダーが使用されます。既定のプロバイダーを使用することをお勧めします。既定または指定された暗号化プロバイダーは、サブジェクト証明書または CRL の署名を検証するすべてのストア関数で使用されます。このパラメーターのデータ型は HCRYPTPROV です。

dwFlagsCERT_OPEN_STORE_FLAGSin

これらの値は、ビットごとの OR 演算によって組み合わされた上位ワードの値と下位ワードの値で構成されます。

dwFlags の下位ワード部分は、開かれる証明書ストアのさまざまな一般的特性を制御します。この部分は、すべてのストアプロバイダーの種類で使用できます。dwFlags の下位ワード部分には、次のいずれかの値を指定できます。

意味
CERT_STORE_BACKUP_RESTORE_FLAG
スレッドの SE_BACKUP_NAME および SE_RESTORE_NAME特権を使用して、レジストリベースまたはファイルベースのシステムストアを開きます。スレッドにこれらの特権がない場合、この関数はアクセス拒否エラーで失敗する必要があります。
CERT_STORE_CREATE_NEW_FLAG
ストアが存在しなかった場合に、新しいストアが作成されます。ストアが既に存在する場合、この関数は失敗します。

CERT_STORE_OPEN_EXISTING_FLAGCERT_STORE_CREATE_NEW_FLAG のいずれも設定されていない場合、ストアが存在すればそれが開かれ、存在しなければ作成されて開かれます。

CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG
ストアから取得したすべての証明書、CRL、CTL が使用されなくなるまで、ストアのプロバイダーを閉じるのを延期します。ストアは、そのストアから取得した最後の証明書、CRL、CTL が解放された時点で実際に閉じられます。これらの証明書、CRL、CTL のプロパティに加えられた変更は、CertCloseStore の呼び出し後であっても永続化されます。

このフラグが設定されておらず、ストアから取得した証明書、CRL、CTL がまだ使用されている場合、それらの証明書、CRL、CTL のプロパティに対する変更は永続化されません。

この関数が CERT_CLOSE_STORE_FORCE_FLAG とともに呼び出された場合、CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG は無視されます。

このフラグが設定され、かつ NULL 以外の hCryptProv パラメーターの値が渡された場合、そのプロバイダーはこの関数の呼び出し後も引き続き使用されます。

CERT_STORE_DELETE_FLAG
ストアは開かれるのではなく削除されます。この関数は、削除の成功・失敗のいずれの場合も NULL を返します。削除の成否を判定するには、 GetLastError を呼び出します。ストアが削除された場合はゼロを、削除されなかった場合はゼロ以外の値を返します。
CERT_STORE_ENUM_ARCHIVED_FLAG
通常、ストア内のすべての証明書の列挙では、CERT_ARCHIVED_PROP_ID プロパティが設定された証明書は無視されます。このフラグが設定されている場合、ストア内の証明書の列挙には、CERT_ARCHIVED_PROP_ID プロパティを持つものを含め、ストア内のすべての証明書が含まれます。
CERT_STORE_MAXIMUM_ALLOWED_FLAG
許可される最大限の権限のセットでストアを開きます。このフラグが指定されている場合、レジストリストアはまず書き込みアクセスで開かれ、それが失敗した場合は読み取り専用アクセスで再度開かれます。
CERT_STORE_NO_CRYPT_RELEASE_FLAG
このフラグは、hCryptProv パラメーターが NULL の場合は使用されません。このフラグは、NULL 以外の CSP ハンドルが hCryptProv パラメーターとして渡された場合にのみ有効です。このフラグを設定すると、証明書ストアが閉じられたときに、既定以外の CSP が自動的に解放されるのを防ぎます。
CERT_STORE_OPEN_EXISTING_FLAG
既存のストアのみを開きます。ストアが存在しない場合、この関数は失敗します。
CERT_STORE_READONLY_FLAG
ストアを読み取り専用モードで開きます。ストアの内容を変更しようとすると、エラーになります。このフラグが設定され、レジストリベースのストアプロバイダーが使用されている場合、レジストリサブキーは RegOpenKeyKEY_READ_ACCESS で使用して開かれます。それ以外の場合、レジストリサブキーは RegCreateKeyKEY_ALL_ACCESS で使用して作成されます。
CERT_STORE_SET_LOCALIZED_NAME_FLAG
このフラグがサポートされている場合、プロバイダーはストアの CERT_STORE_LOCALIZED_NAME_PROP_ID プロパティを設定します。ローカライズされた名前は、dwPropIDCERT_STORE_LOCALIZED_NAME_PROP_ID に設定して CertGetStoreProperty 関数を呼び出すことで取得できます。このフラグは、CERT_STORE_PROV_FILENAMECERT_STORE_PROV_SYSTEMCERT_STORE_PROV_SYSTEM_REGISTRYCERT_STORE_PROV_PHYSICAL_W の各種類のプロバイダーでサポートされます。
CERT_STORE_SHARE_CONTEXT_FLAG
ストアを複数回開く場合、このフラグを設定すると、開かれたストアの各インスタンス間で証明書、CRL、CTL のコンテキストのエンコード部分のメモリを再利用することで、効率的なメモリ使用を実現できます。
CERT_STORE_UPDATE_KEYID_FLAG
キー識別子のリストは CurrentUser と LocalMachine の中に存在します。これらのキー識別子は、証明書のプロパティとよく似たプロパティを持ちます。CERT_STORE_UPDATE_KEYID_FLAG が設定されている場合、ストアの場所にある CERT_KEY_PROV_INFO_PROP_ID プロパティを持つすべてのキー識別子について、そのプロパティは、キー識別子のプロパティ CERT_KEY_PROV_INFO_PROP_ID、またはそのキー識別子に関連する証明書の CERT_KEY_IDENTIFIER_PROP_ID から自動的に更新されます。

CERT_STORE_PROV_SYSTEMCERT_STORE_PROV_SYSTEM_REGISTRYCERT_STORE_PROV_PHYSICAL の各プロバイダーの種類では、システムストアのレジストリの場所を指定するために、dwFlags の次の上位ワードを使用します。

CERT_SYSTEM_STORE_CURRENT_SERVICE

CERT_SYSTEM_STORE_CURRENT_USER

CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY

CERT_SYSTEM_STORE_LOCAL_MACHINE

CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE

CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY

CERT_SYSTEM_STORE_SERVICES

CERT_SYSTEM_STORE_USERS

既定では、システムストアの場所は、HKEY_CURRENT_USERHKEY_LOCAL_MACHINE、または HKEY_USERS の定義済みレジストリキーを基準として開かれます。詳しくは、 System Store Locations を参照してください。

次の上位ワードフラグは、この既定の動作を上書きします。

意味
CERT_SYSTEM_STORE_RELOCATE_FLAG
設定されている場合、pvPara には文字列ではなく CERT_SYSTEM_STORE_RELOCATE_PARA 構造体へのポインターを格納する必要があります。この構造体は、ストアの名前とレジストリ内のその場所の両方を示します。
CERT_SYSTEM_STORE_UNPROTECTED_FLAG
既定では、CurrentUser の "Root" ストアが開かれると、保護されたルートのリストに含まれない SystemRegistry のルートは、この関数が戻る前にキャッシュから削除されます。このフラグが設定されている場合、この既定の動作が上書きされ、SystemRegistry 内のすべてのルートが返され、保護されたルートのリストのチェックは行われません。

CERT_STORE_PROV_REGISTRY プロバイダーは、次の上位ワードフラグを使用します。

意味
CERT_REGISTRY_STORE_REMOTE_FLAG
pvPara には、リモートコンピューター上のレジストリキーへのハンドルが格納されます。リモートコンピューター上のレジストリキーにアクセスするには、アクセスを許可するように、リモートコンピューターのセキュリティ権限を設定する必要があります。詳しくは、「解説」を参照してください。
CERT_REGISTRY_STORE_SERIALIZED_FLAG
CERT_STORE_PROV_REG プロバイダーは、既定の保存操作を行う代わりに、証明書、CRL、CTL を単一のシリアル化されたストアのサブキーに保存します。既定では、各証明書、CRL、CTL は、適切なサブキーの下に個別のレジストリサブキーとして保存されます。

このフラグは主に、CurrentUserGroupPolicy ストアや LocalMachineGroupPolicy ストアなど、グループポリシーテンプレート(GPT)からダウンロードされたストアに使用されます。

CERT_REGISTRY_STORE_SERIALIZED_FLAG が設定されている場合、ストアへの追加、削除、プロパティ変更は、 CertCloseStore が呼び出されるか、 CertControlStoreCERT_STORE_CTRL_COMMIT とともに呼び出されるまで永続化されません。

CERT_STORE_PROV_FILE および CERT_STORE_PROV_FILENAME プロバイダーの種類は、次の上位ワードフラグを使用します。

意味
CERT_FILE_STORE_COMMIT_ENABLE
このフラグを設定すると、ストアへの追加、またはストア内のコンテキストのプロパティに加えられた変更が、 CertCloseStore が呼び出されたとき、または CertControlStoreCERT_STORE_CONTROL_COMMIT とともに呼び出されたときに、ファイルストアにコミットされます。

dwFlagsCERT_FILE_STORE_COMMIT_ENABLECERT_STORE_READONLY_FLAG の両方が設定されている場合、CertOpenStoreE_INVALIDARG で失敗します。

CERT_STORE_PROV_LDAP プロバイダーの種類は、次の上位ワードフラグを使用します。

意味
CERT_LDAP_STORE_AREC_EXCLUSIVE_FLAG
pvPara パラメーターで指定された URL に対して、A レコードのみの DNS ルックアップを実行します。これにより、URL のホスト名を解決する際に誤った DNS クエリが生成されるのを防ぎます。pvPara パラメーターにドメイン名ではなくホスト名を渡す場合は、このフラグを使用してください。
CERT_LDAP_STORE_OPENED_FLAG
既存の LDAP セッションを使用するには、このフラグを使用します。このフラグが指定されている場合、pvPara パラメーターは、使用する LDAP セッションに関する情報を格納する CERT_LDAP_STORE_OPENED_PARA 構造体のアドレスです。
CERT_LDAP_STORE_SIGN_FLAG
一部のアプリケーションで必要とされる整合性を提供するため、Kerberos 認証プロトコルを使用して、LDAP サーバーとの間で送受信されるすべての LDAP トラフィックにデジタル署名します。
CERT_LDAP_STORE_UNBIND_FLAG
このフラグを CERT_LDAP_STORE_OPENED_FLAG フラグとともに使用すると、ストアが閉じられたときに LDAP セッションのバインドが解除されます。ストアが閉じられると、システムは ldap_unbind 関数を使用して LDAP セッションのバインドを解除します。
pvParavoid*inoptionalこの関数に対する追加情報を格納できる 32 ビットの値です。このパラメーターの内容は、lpszStoreProvider パラメーターおよびその他のパラメーターの値によって異なります。

戻り値の型: HCERTSTORE

公式ドキュメント

指定したストアプロバイダーの種類を使用して、証明書ストアを開きます。

戻り値

関数が成功すると、証明書ストアへのハンドルを返します。ストアの使用が終わったら、CertCloseStore 関数を呼び出してハンドルを解放してください。

関数が失敗すると、NULL を返します。拡張エラー情報を取得するには、 GetLastError を呼び出します。

注意 CreateFileReadFile、またはレジストリのエラーが伝播され、それらのエラーコードが返されることがあります。CertOpenStore には独自のエラーコードが 1 つあります。ERROR_FILE_NOT_FOUND コードです。これは、関数が lpszStoreProvider パラメーターで指定されたプロバイダーを見つけられなかったことを示します。

解説(Remarks)

システムストアは、1 つ以上の物理的な兄弟ストアで構成されるコレクションです。各システムストアには、定義済みの物理的な兄弟ストアがあります。CERT_SYSTEM_STORE_CURRENT_USER にある "My" などのシステムストアを開いた後、CertOpenStore が呼び出され、システムストアのコレクション内のすべての物理ストアが開かれます。これらの各物理ストアは、 CertAddStoreToCollection 関数を使用してシステムストアのコレクションに追加されます。それらの物理ストア内のすべての証明書、CRL、CTL は、論理システムストアのコレクションを通じて利用できます。

注意 証明書コンテキストの順序は、ストア内で保持されない場合があります。 特定の証明書にアクセスするには、ストア内の証明書を反復処理する必要があります。

次のシステムストアの場所はリモートで開くことができます。

システムストアの場所をリモートで開くには、pvPara に渡す文字列内のストア名の前に、コンピューター名を付加します。リモートシステムストア名の例を次に示します。

システムストアについて詳しくは、 System Store Locations を参照してください。

自動的に移行されるストアについて詳しくは、Certificate Store Migration を参照してください。

次の例は、種類の異なる複数の証明書ストアを開く方法を示します。この例では、Creating a DACL トピックで定義されている CreateMyDACL 関数を使用して、開いたファイルが適切な DACL で作成されるようにします。他の種類のストアプロバイダーを開く例については、 Example C Code for Opening Certificate Stores を参照してください。

//-------------------------------------------------------------------
// Open a system store, in this case, the My store.

HCERTSTORE hSysStore = NULL;
if(hSysStore = CertOpenStore(
   CERT_STORE_PROV_SYSTEM,          // The store provider type
   0,                               // The encoding type is
                                    // not needed
   NULL,                            // Use the default HCRYPTPROV
   CERT_SYSTEM_STORE_CURRENT_USER,  // Set the store location in a
                                    // registry location
   L"MY"                            // The store name as a Unicode 
                                    // string
   ))
{
    printf("The system store was created successfully.\n");
}
else
{
    printf("An error occurred during creation "
        "of the system store!\n");
    exit(1);
}

// Other common system stores include "Root", "Trust", and "Ca".


//-------------------------------------------------------------------
// Open a memory store. 

HCERTSTORE hMemStore = NULL;
if(hMemStore = CertOpenStore(
   CERT_STORE_PROV_MEMORY,   // The memory provider type
   0,                        // The encoding type is not needed
   NULL,                     // Use the default HCRYPTPROV
   0,                        // Accept the default dwFlags
   NULL                      // pvPara is not used
   ))
{
    printf("The memory store was created successfully.\n");
}
else
{
    printf("An error occurred during creation "
        "of the memory store!\n");
    exit(1);
}

//-------------------------------------------------------------------
// Open a read-only store from disk.

HANDLE       hFile = NULL;
HCERTSTORE   hFileStore = NULL;
LPCSTR       pszFileName = "TestStor2.sto";
SECURITY_ATTRIBUTES  sa;        // For DACL

// Create a DACL to use when opening the file.
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;  

// Call function to set the DACL. The DACL is set in the 
// SECURITY_ATTRIBUTES lpSecurityDescriptor member.
if (!CreateMyDACL(&sa))
{
     // Error encountered; generate message and exit.
     printf("Failed CreateMyDACL.\n");
        exit(1);
}

// Obtain the file handle of an existing file.
if (hFile = CreateFile(
     pszFileName,                  // The file name
     GENERIC_READ|GENERIC_WRITE,   // Access mode: Read from and
                                   // write to this file
     0,                            // Share mode
     &sa,                          // Uses the DACL created 
                                   // previously 
     OPEN_ALWAYS,                  // How to create
     FILE_ATTRIBUTE_NORMAL,        // File attributes
     NULL))                        // Template
{
    printf("The file was opened successfully.\n");
}
else
{
    printf("An error occurred during opening of the file!\n");
    exit(1);
}

//-------------------------------------------------------------------
//  This file can contain data before the store itself.
//  At this point, read and use data in the open file that precedes
//  the serialized certificate store data. 
//  To open the certificate store, the file pointer must
//  be placed at the beginning of the certificate store data.

//-------------------------------------------------------------------
//  Open the store.

if(hFileStore = CertOpenStore(
    CERT_STORE_PROV_FILE,     // Load certificates from a file
    0,                        // Encoding type not used
    NULL,                     // Use the default HCRYPTPROV
    CERT_STORE_READONLY_FLAG, // Read-only store
    hFile                     // The handle for the open file 
                              // that is the source of the 
                              // certificates
    ))
{
    printf("The file store was created successfully.\n");
}
else
{
    printf("An error occurred during creation of the file store!\n");
    exit(1);
}

//-------------------------------------------------------------------
// After processing, close the certificate stores and the file.

if(CertCloseStore(
        hSysStore, 
        CERT_CLOSE_STORE_CHECK_FLAG))
{
    printf("The system store was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the "
        "system store.\n");
}

if(CertCloseStore(
        hMemStore, 
        CERT_CLOSE_STORE_CHECK_FLAG))
{
    printf("The memory store was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the "
        "memory store.\n");
}

if(CertCloseStore(
        hFileStore, 
        CERT_CLOSE_STORE_CHECK_FLAG))
{
    printf("The file store was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the file store.\n");
}

if(CloseHandle(hFile))
{
    printf("The file was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the file.\n");
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

HCERTSTORE CertOpenStore(
    LPCSTR lpszStoreProvider,
    CERT_QUERY_ENCODING_TYPE dwEncodingType,
    HCRYPTPROV_LEGACY hCryptProv,   // optional
    CERT_OPEN_STORE_FLAGS dwFlags,
    const void* pvPara   // optional
);
[DllImport("CRYPT32.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr CertOpenStore(
    [MarshalAs(UnmanagedType.LPStr)] string lpszStoreProvider,   // LPCSTR
    uint dwEncodingType,   // CERT_QUERY_ENCODING_TYPE
    UIntPtr hCryptProv,   // HCRYPTPROV_LEGACY optional
    uint dwFlags,   // CERT_OPEN_STORE_FLAGS
    IntPtr pvPara   // void* optional
);
<DllImport("CRYPT32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function CertOpenStore(
    <MarshalAs(UnmanagedType.LPStr)> lpszStoreProvider As String,   ' LPCSTR
    dwEncodingType As UInteger,   ' CERT_QUERY_ENCODING_TYPE
    hCryptProv As UIntPtr,   ' HCRYPTPROV_LEGACY optional
    dwFlags As UInteger,   ' CERT_OPEN_STORE_FLAGS
    pvPara As IntPtr   ' void* optional
) As IntPtr
End Function
' lpszStoreProvider : LPCSTR
' dwEncodingType : CERT_QUERY_ENCODING_TYPE
' hCryptProv : HCRYPTPROV_LEGACY optional
' dwFlags : CERT_OPEN_STORE_FLAGS
' pvPara : void* optional
Declare PtrSafe Function CertOpenStore Lib "crypt32" ( _
    ByVal lpszStoreProvider As String, _
    ByVal dwEncodingType As Long, _
    ByVal hCryptProv As LongPtr, _
    ByVal dwFlags As Long, _
    ByVal pvPara As LongPtr) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CertOpenStore = ctypes.windll.crypt32.CertOpenStore
CertOpenStore.restype = ctypes.c_void_p
CertOpenStore.argtypes = [
    wintypes.LPCSTR,  # lpszStoreProvider : LPCSTR
    wintypes.DWORD,  # dwEncodingType : CERT_QUERY_ENCODING_TYPE
    ctypes.c_size_t,  # hCryptProv : HCRYPTPROV_LEGACY optional
    wintypes.DWORD,  # dwFlags : CERT_OPEN_STORE_FLAGS
    ctypes.POINTER(None),  # pvPara : void* optional
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('CRYPT32.dll')
CertOpenStore = Fiddle::Function.new(
  lib['CertOpenStore'],
  [
    Fiddle::TYPE_VOIDP,  # lpszStoreProvider : LPCSTR
    -Fiddle::TYPE_INT,  # dwEncodingType : CERT_QUERY_ENCODING_TYPE
    Fiddle::TYPE_UINTPTR_T,  # hCryptProv : HCRYPTPROV_LEGACY optional
    -Fiddle::TYPE_INT,  # dwFlags : CERT_OPEN_STORE_FLAGS
    Fiddle::TYPE_VOIDP,  # pvPara : void* optional
  ],
  Fiddle::TYPE_VOIDP)
#[link(name = "crypt32")]
extern "system" {
    fn CertOpenStore(
        lpszStoreProvider: *const u8,  // LPCSTR
        dwEncodingType: u32,  // CERT_QUERY_ENCODING_TYPE
        hCryptProv: usize,  // HCRYPTPROV_LEGACY optional
        dwFlags: u32,  // CERT_OPEN_STORE_FLAGS
        pvPara: *const ()  // void* optional
    ) -> *mut core::ffi::c_void;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("CRYPT32.dll", SetLastError = true)]
public static extern IntPtr CertOpenStore([MarshalAs(UnmanagedType.LPStr)] string lpszStoreProvider, uint dwEncodingType, UIntPtr hCryptProv, uint dwFlags, IntPtr pvPara);
"@
$api = Add-Type -MemberDefinition $sig -Name 'CRYPT32_CertOpenStore' -Namespace Win32 -PassThru
# $api::CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara)
#uselib "CRYPT32.dll"
#func global CertOpenStore "CertOpenStore" sptr, sptr, sptr, sptr, sptr
; CertOpenStore lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara   ; 戻り値は stat
; lpszStoreProvider : LPCSTR -> "sptr"
; dwEncodingType : CERT_QUERY_ENCODING_TYPE -> "sptr"
; hCryptProv : HCRYPTPROV_LEGACY optional -> "sptr"
; dwFlags : CERT_OPEN_STORE_FLAGS -> "sptr"
; pvPara : void* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "CRYPT32.dll"
#cfunc global CertOpenStore "CertOpenStore" str, int, sptr, int, sptr
; res = CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara)
; lpszStoreProvider : LPCSTR -> "str"
; dwEncodingType : CERT_QUERY_ENCODING_TYPE -> "int"
; hCryptProv : HCRYPTPROV_LEGACY optional -> "sptr"
; dwFlags : CERT_OPEN_STORE_FLAGS -> "int"
; pvPara : void* optional -> "sptr"
; HCERTSTORE CertOpenStore(LPCSTR lpszStoreProvider, CERT_QUERY_ENCODING_TYPE dwEncodingType, HCRYPTPROV_LEGACY hCryptProv, CERT_OPEN_STORE_FLAGS dwFlags, void* pvPara)
#uselib "CRYPT32.dll"
#cfunc global CertOpenStore "CertOpenStore" str, int, intptr, int, intptr
; res = CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara)
; lpszStoreProvider : LPCSTR -> "str"
; dwEncodingType : CERT_QUERY_ENCODING_TYPE -> "int"
; hCryptProv : HCRYPTPROV_LEGACY optional -> "intptr"
; dwFlags : CERT_OPEN_STORE_FLAGS -> "int"
; pvPara : void* optional -> "intptr"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	crypt32 = windows.NewLazySystemDLL("CRYPT32.dll")
	procCertOpenStore = crypt32.NewProc("CertOpenStore")
)

// lpszStoreProvider (LPCSTR), dwEncodingType (CERT_QUERY_ENCODING_TYPE), hCryptProv (HCRYPTPROV_LEGACY optional), dwFlags (CERT_OPEN_STORE_FLAGS), pvPara (void* optional)
r1, _, err := procCertOpenStore.Call(
	uintptr(unsafe.Pointer(windows.BytePtrFromString(lpszStoreProvider))),
	uintptr(dwEncodingType),
	uintptr(hCryptProv),
	uintptr(dwFlags),
	uintptr(pvPara),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HCERTSTORE
function CertOpenStore(
  lpszStoreProvider: PAnsiChar;   // LPCSTR
  dwEncodingType: DWORD;   // CERT_QUERY_ENCODING_TYPE
  hCryptProv: NativeUInt;   // HCRYPTPROV_LEGACY optional
  dwFlags: DWORD;   // CERT_OPEN_STORE_FLAGS
  pvPara: Pointer   // void* optional
): THandle; stdcall;
  external 'CRYPT32.dll' name 'CertOpenStore';
result := DllCall("CRYPT32\CertOpenStore"
    , "AStr", lpszStoreProvider   ; LPCSTR
    , "UInt", dwEncodingType   ; CERT_QUERY_ENCODING_TYPE
    , "UPtr", hCryptProv   ; HCRYPTPROV_LEGACY optional
    , "UInt", dwFlags   ; CERT_OPEN_STORE_FLAGS
    , "Ptr", pvPara   ; void* optional
    , "Ptr")   ; return: HCERTSTORE
●CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara) = DLL("CRYPT32.dll", "void* CertOpenStore(char*, dword, int, dword, void*)")
# 呼び出し: CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara)
# lpszStoreProvider : LPCSTR -> "char*"
# dwEncodingType : CERT_QUERY_ENCODING_TYPE -> "dword"
# hCryptProv : HCRYPTPROV_LEGACY optional -> "int"
# dwFlags : CERT_OPEN_STORE_FLAGS -> "dword"
# pvPara : void* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "crypt32" fn CertOpenStore(
    lpszStoreProvider: [*c]const u8, // LPCSTR
    dwEncodingType: u32, // CERT_QUERY_ENCODING_TYPE
    hCryptProv: usize, // HCRYPTPROV_LEGACY optional
    dwFlags: u32, // CERT_OPEN_STORE_FLAGS
    pvPara: ?*anyopaque // void* optional
) callconv(std.os.windows.WINAPI) ?*anyopaque;
proc CertOpenStore(
    lpszStoreProvider: cstring,  # LPCSTR
    dwEncodingType: uint32,  # CERT_QUERY_ENCODING_TYPE
    hCryptProv: uint,  # HCRYPTPROV_LEGACY optional
    dwFlags: uint32,  # CERT_OPEN_STORE_FLAGS
    pvPara: pointer  # void* optional
): pointer {.importc: "CertOpenStore", stdcall, dynlib: "CRYPT32.dll".}
pragma(lib, "crypt32");
extern(Windows)
void* CertOpenStore(
    const(char)* lpszStoreProvider,   // LPCSTR
    uint dwEncodingType,   // CERT_QUERY_ENCODING_TYPE
    size_t hCryptProv,   // HCRYPTPROV_LEGACY optional
    uint dwFlags,   // CERT_OPEN_STORE_FLAGS
    void* pvPara   // void* optional
);
ccall((:CertOpenStore, "CRYPT32.dll"), stdcall, Ptr{Cvoid},
      (Cstring, UInt32, Csize_t, UInt32, Ptr{Cvoid}),
      lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara)
# lpszStoreProvider : LPCSTR -> Cstring
# dwEncodingType : CERT_QUERY_ENCODING_TYPE -> UInt32
# hCryptProv : HCRYPTPROV_LEGACY optional -> Csize_t
# dwFlags : CERT_OPEN_STORE_FLAGS -> UInt32
# pvPara : void* optional -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void* CertOpenStore(
    const char* lpszStoreProvider,
    uint32_t dwEncodingType,
    uintptr_t hCryptProv,
    uint32_t dwFlags,
    void* pvPara);
]]
local crypt32 = ffi.load("crypt32")
-- crypt32.CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara)
-- lpszStoreProvider : LPCSTR
-- dwEncodingType : CERT_QUERY_ENCODING_TYPE
-- hCryptProv : HCRYPTPROV_LEGACY optional
-- dwFlags : CERT_OPEN_STORE_FLAGS
-- pvPara : void* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('CRYPT32.dll');
const CertOpenStore = lib.func('__stdcall', 'CertOpenStore', 'void *', ['str', 'uint32_t', 'uintptr_t', 'uint32_t', 'void *']);
// CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara)
// lpszStoreProvider : LPCSTR -> 'str'
// dwEncodingType : CERT_QUERY_ENCODING_TYPE -> 'uint32_t'
// hCryptProv : HCRYPTPROV_LEGACY optional -> 'uintptr_t'
// dwFlags : CERT_OPEN_STORE_FLAGS -> 'uint32_t'
// pvPara : void* optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("CRYPT32.dll", {
  CertOpenStore: { parameters: ["buffer", "u32", "usize", "u32", "pointer"], result: "pointer" },
});
// lib.symbols.CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara)
// lpszStoreProvider : LPCSTR -> "buffer"
// dwEncodingType : CERT_QUERY_ENCODING_TYPE -> "u32"
// hCryptProv : HCRYPTPROV_LEGACY optional -> "usize"
// dwFlags : CERT_OPEN_STORE_FLAGS -> "u32"
// pvPara : void* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* CertOpenStore(
    const char* lpszStoreProvider,
    uint32_t dwEncodingType,
    size_t hCryptProv,
    uint32_t dwFlags,
    void* pvPara);
C, "CRYPT32.dll");
// $ffi->CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara);
// lpszStoreProvider : LPCSTR
// dwEncodingType : CERT_QUERY_ENCODING_TYPE
// hCryptProv : HCRYPTPROV_LEGACY optional
// dwFlags : CERT_OPEN_STORE_FLAGS
// pvPara : void* 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 Crypt32 extends StdCallLibrary {
    Crypt32 INSTANCE = Native.load("crypt32", Crypt32.class);
    Pointer CertOpenStore(
        String lpszStoreProvider,   // LPCSTR
        int dwEncodingType,   // CERT_QUERY_ENCODING_TYPE
        long hCryptProv,   // HCRYPTPROV_LEGACY optional
        int dwFlags,   // CERT_OPEN_STORE_FLAGS
        Pointer pvPara   // void* optional
    );
}
@[Link("crypt32")]
lib LibCRYPT32
  fun CertOpenStore = CertOpenStore(
    lpszStoreProvider : UInt8*,   # LPCSTR
    dwEncodingType : UInt32,   # CERT_QUERY_ENCODING_TYPE
    hCryptProv : LibC::SizeT,   # HCRYPTPROV_LEGACY optional
    dwFlags : UInt32,   # CERT_OPEN_STORE_FLAGS
    pvPara : Void*   # void* optional
  ) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef CertOpenStoreNative = Pointer<Void> Function(Pointer<Utf8>, Uint32, UintPtr, Uint32, Pointer<Void>);
typedef CertOpenStoreDart = Pointer<Void> Function(Pointer<Utf8>, int, int, int, Pointer<Void>);
final CertOpenStore = DynamicLibrary.open('CRYPT32.dll')
    .lookupFunction<CertOpenStoreNative, CertOpenStoreDart>('CertOpenStore');
// lpszStoreProvider : LPCSTR -> Pointer<Utf8>
// dwEncodingType : CERT_QUERY_ENCODING_TYPE -> Uint32
// hCryptProv : HCRYPTPROV_LEGACY optional -> UintPtr
// dwFlags : CERT_OPEN_STORE_FLAGS -> Uint32
// pvPara : void* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CertOpenStore(
  lpszStoreProvider: PAnsiChar;   // LPCSTR
  dwEncodingType: DWORD;   // CERT_QUERY_ENCODING_TYPE
  hCryptProv: NativeUInt;   // HCRYPTPROV_LEGACY optional
  dwFlags: DWORD;   // CERT_OPEN_STORE_FLAGS
  pvPara: Pointer   // void* optional
): THandle; stdcall;
  external 'CRYPT32.dll' name 'CertOpenStore';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "CertOpenStore"
  c_CertOpenStore :: CString -> Word32 -> CUIntPtr -> Word32 -> Ptr () -> IO (Ptr ())
-- lpszStoreProvider : LPCSTR -> CString
-- dwEncodingType : CERT_QUERY_ENCODING_TYPE -> Word32
-- hCryptProv : HCRYPTPROV_LEGACY optional -> CUIntPtr
-- dwFlags : CERT_OPEN_STORE_FLAGS -> Word32
-- pvPara : void* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let certopenstore =
  foreign "CertOpenStore"
    (string @-> uint32_t @-> size_t @-> uint32_t @-> (ptr void) @-> returning (ptr void))
(* lpszStoreProvider : LPCSTR -> string *)
(* dwEncodingType : CERT_QUERY_ENCODING_TYPE -> uint32_t *)
(* hCryptProv : HCRYPTPROV_LEGACY optional -> size_t *)
(* dwFlags : CERT_OPEN_STORE_FLAGS -> uint32_t *)
(* pvPara : void* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library crypt32 (t "CRYPT32.dll"))
(cffi:use-foreign-library crypt32)

(cffi:defcfun ("CertOpenStore" cert-open-store :convention :stdcall) :pointer
  (lpsz-store-provider :string)   ; LPCSTR
  (dw-encoding-type :uint32)   ; CERT_QUERY_ENCODING_TYPE
  (h-crypt-prov :uint64)   ; HCRYPTPROV_LEGACY optional
  (dw-flags :uint32)   ; CERT_OPEN_STORE_FLAGS
  (pv-para :pointer))   ; void* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CertOpenStore = Win32::API::More->new('CRYPT32',
    'HANDLE CertOpenStore(LPCSTR lpszStoreProvider, DWORD dwEncodingType, WPARAM hCryptProv, DWORD dwFlags, LPVOID pvPara)');
# my $ret = $CertOpenStore->Call($lpszStoreProvider, $dwEncodingType, $hCryptProv, $dwFlags, $pvPara);
# lpszStoreProvider : LPCSTR -> LPCSTR
# dwEncodingType : CERT_QUERY_ENCODING_TYPE -> DWORD
# hCryptProv : HCRYPTPROV_LEGACY optional -> WPARAM
# dwFlags : CERT_OPEN_STORE_FLAGS -> DWORD
# pvPara : void* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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