Fungsi CertControlStore (wincrypt.h)

Fungsi CertControlStore memungkinkan aplikasi untuk diberi tahu ketika ada perbedaan antara konten penyimpanan yang di-cache yang digunakan dan konten penyimpanan tersebut saat disimpan ke penyimpanan. Perbedaan dapat terjadi karena proses lain membuat perubahan yang memengaruhi penyimpanan saat disimpan.

Fungsi CertControlStore dapat digunakan untuk menyinkronkan penyimpanan yang di-cache, jika perlu, dan menyediakan sarana untuk melakukan perubahan yang dilakukan di penyimpanan yang di-cache ke penyimpanan yang bertahan.

Sintaks

BOOL CertControlStore(
  [in] HCERTSTORE hCertStore,
  [in] DWORD      dwFlags,
  [in] DWORD      dwCtrlType,
  [in] void const *pvCtrlPara
);

Parameter

[in] hCertStore

Menangani penyimpanan sertifikat.

[in] dwFlags

Jika parameter dwCtrlType diatur ke CERT_STORE_CTRL_COMMIT, parameter ini bisa menjadi salah satu nilai berikut.

Nilai Makna
CERT_STORE_CTRL_COMMIT_FORCE_FLAG
Memaksa konten penyimpanan memori cache disalin ke penyimpanan permanen meskipun cache belum diubah.
CERT_STORE_CTRL_COMMIT_CLEAR_FLAG
Menghambat penyalinan konten penyimpanan memori cache ke penyimpanan permanen bahkan ketika penyimpanan ditutup.
CERT_STORE_CTRL_INHIBIT_DUPLICATE_HANDLE_FLAG
Menghambat handel duplikat dari handle peristiwa. Jika bendera ini diatur, CertControlStore dengan CERT_STORE_CTRL_CANCEL_NOTIFY lulus harus dipanggil untuk HANDLE peristiwa ini sebelum menutup handel hCertStore .
 

Jika dwCtrlType diatur ke CERT_STORE_CTRL_NOTIFY_CHANGE atau CERT_STORE_CTRL_RESYNC, parameter dwFlags tidak digunakan dan harus diatur ke nol.

[in] dwCtrlType

Kontrol tindakan yang akan diambil oleh CertControlStore. Interpretasi pvCtrlPara dan dwFlags bergantung pada nilai dwCtrlType. Saat ini, tindakan berikut didefinisikan.

Nilai Makna
CERT_STORE_CTRL_RESYNC
Penyimpanan yang di-cache disinkronkan ulang dan dibuat agar sesuai dengan penyimpanan yang bertahan.
CERT_STORE_CTRL_NOTIFY_CHANGE
Sinyal dikembalikan dalam spasi yang ditunjukkan oleh pvCtrlPara untuk menunjukkan bahwa konten penyimpanan yang di-cache saat ini berbeda dari status penyimpanan yang bertahan.
CERT_STORE_CTRL_COMMIT
Setiap perubahan yang dilakukan pada penyimpanan cache disalin ke penyimpanan yang bertahan. Jika tidak ada perubahan yang dilakukan sejak penyimpanan cache dibuka atau sejak penerapan terakhir, panggilan diabaikan. Panggilan juga diabaikan jika penyedia toko adalah penyedia yang secara otomatis segera berubah.
CERT_STORE_CTRL_AUTO_RESYNC
Pada awal setiap enumerasi atau menemukan panggilan toko, pemeriksaan dilakukan untuk menentukan apakah perubahan telah dilakukan di toko. Jika penyimpanan telah berubah, sinkronisasi ulang dilakukan. Pemeriksaan ini hanya dilakukan pada enumerasi pertama atau menemukan panggilan, ketika pPrevContext adalah NULL.

Anggota pvCtrPara tidak digunakan dan harus diatur ke NULL.

CERT_STORE_CTRL_CANCEL_NOTIFY
Membatalkan sinyal pemberitahuan tentang HANDLE peristiwa yang diteruskan di CERT_STORE_CTRL_NOTIFY_CHANGE atau CERT_STORE_CTRL_RESYNC sebelumnya. Parameter pvCtrlPara menunjuk ke handle peristiwa yang akan dibatalkan.

[in] pvCtrlPara

Jika dwCtrlType CERT_STORE_NOTIFY_CHANGE, pvCtrlPara diatur ke alamat handel tempat sistem memberi sinyal peristiwa perubahan pemberitahuan saat perubahan dari status penyimpanan yang bertahan terdeteksi. Handel harus diinisialisasi dengan panggilan ke fungsi CreateEvent. Parameter pvCtrlPara dapat diatur ke NULL untuk penyimpanan berbasis registri. Jika pvCtrlPara adalah NULL, peristiwa perubahan pemberitahuan internal dibuat dan terdaftar untuk diberi sinyal. Menggunakan peristiwa perubahan pemberitahuan internal memungkinkan operasi sinkronisasi ulang hanya jika penyimpanan diubah.

Jika dwCtrlType CERT_STORE_CTRL_RESYNC, atur pvCtrlPara ke alamat handel kejadian untuk diberi sinyal pada perubahan berikutnya di penyimpanan yang dipertahankan. Biasanya, alamat ini adalah alamat handel peristiwa yang diteruskan dengan CERT_STORE_CTRL_NOTIFY_CHANGE selama inisialisasi. Handel kejadian yang diteruskan akan disusun ulang. Jika pvCtrlPara diatur ke NULL, tidak ada peristiwa yang disusun ulang.

Jika dwCtrlType CERT_STORE_CTRL_COMMIT, pvCtrlPara tidak digunakan dan harus diatur ke NULL.

Mengembalikan nilai

Jika fungsi berhasil, fungsi mengembalikan bukan nol.

Jika fungsi gagal, fungsi akan mengembalikan nol. Untuk informasi kesalahan yang diperluas, hubungi GetLastError.

Jika dwCtrlType CERT_STORE_NOTIFY_CHANGE, fungsi mengembalikan bukan nol jika handel untuk sinyal peristiwa berhasil disiapkan. Fungsi mengembalikan nol jika penanganan aktivitas tidak disiapkan.

Jika dwCtrlType CERT_STORE_CTRL_RESYNC, fungsi mengembalikan bukan nol jika sinkronisasi ulang berhasil. Fungsi mengembalikan nol jika sinkronisasi ulang gagal.

Jika dwCtrlType CERT_STORE_CTRL_COMMIT, fungsi mengembalikan nonzero untuk menunjukkan keberhasilan penyelesaian penerapan ke penyimpanan yang bertahan. Fungsi mengembalikan nol jika penerapan gagal.

Beberapa penyedia mungkin tidak mendukung jenis kontrol tertentu. Dalam kasus ini, CertControlStore mengembalikan nol dan GetLastError diatur ke kode ERROR_NOT_SUPPORTED.

Keterangan

Sinkronisasi ulang toko dapat dilakukan kapan saja. Ini tidak perlu mengikuti peristiwa perubahan pemberitahuan yang disinyalir.

CERT_STORE_CTRL_NOTIFY_CHANGE didukung pada penyedia penyimpanan berbasis registri dengan menggunakan fungsi RegNotifyChangeKeyValue .

CertControlStore yang menggunakan CERT_STORE_CTRL_NOTIFY_CHANGE dipanggil sekali agar setiap handel peristiwa diteruskan dengan CERT_STORE_CTRL_RESYNC. Panggilan menggunakan CERT_STORE_CTRL_NOTIFY_CHANGE ini harus dilakukan setelah setiap peristiwa dibuat dan bukan setelah peristiwa diberi sinyal.

Contoh

Contoh berikut menunjukkan mengizinkan aplikasi untuk diberi tahu ketika ada perbedaan antara konten penyimpanan yang di-cache yang digunakan dan konten penyimpanan tersebut saat disimpan ke penyimpanan. Untuk contoh lengkap termasuk konteks lengkap untuk contoh ini, lihat Contoh Program C: Mengatur dan Mendapatkan Properti Penyimpanan Sertifikat.


//--------------------------------------------------------------------
// Declare and initialize variables.

HCERTSTORE hCertStore;     // Original certificate store
HANDLE     hEvent;
BOOL       fSignal;

//--------------------------------------------------------------------
// Initialize an event.

if(hEvent = CreateEvent(
    NULL,
    FALSE,          // Manual reset is FALSE
    FALSE,          // The initial state of the event is FALSE
    NULL))
{
     printf("An event has been created. \n");
}
else
{
     printf("The event was not created. \n");
     exit(1);
}

//--------------------------------------------------------------------
// Open the MY certificate store. 

if ( hCertStore = CertOpenStore(
    CERT_STORE_PROV_SYSTEM,
    0,
    NULL,
    CERT_SYSTEM_STORE_CURRENT_USER,
    L"MY"))
{
    printf("The MY store is open. \n");
}
else
{
    printf("The MY store did not open. \n");
    exit(1);
}

//--------------------------------------------------------------------
//  Call CertControlStore the first time with 
//  CERT_CONTROL_STORE_NOTIFY_CHANGE.

if(CertControlStore(
    hCertStore,                        //  The store to be controlled
    0,                                 //  Not used 
    CERT_STORE_CTRL_NOTIFY_CHANGE,     //  Control action type
    &hEvent))                          //  Points to the event handle
                           //  When a change is detected,
                           //  a signal is written to the 
                    //  memory location pointed to by
                    //  hHandle.
{
    printf("Notify change worked. \n");
}
else
{
    printf("Notify change failed. \n");
    exit(1);
}

//--------------------------------------------------------------------
// Wait for the store to change.

fSignal = (WAIT_OBJECT_0 == WaitForSingleObjectEx(
    hEvent,
    1000,        // Number of milliseconds to wait;
            // Use INFINITE to wait indefinitely for
            // a change
    FALSE));

if (fSignal)
{

//--------------------------------------------------------------------
// The store has changed.
// Call the function a second time with CERT_STORE_CTRL_RESYNC.

    if(CertControlStore(
        hCertStore,             // The store to be controlled
        0,                      // Not used
        CERT_STORE_CTRL_RESYNC, // Control action type
        &hEvent))               // The handle of the event 
                                // to be rearmed

    printf("Resynchronization worked. \n");
    
    else
    {
        printf("Resynchronization failed. \n");
        exit(1);
    }
}
else
{
      printf("The store was not changed. \n");
      printf("Resynchronization was not needed. \n");
}

// Release the handle to the store.

if(CertCloseStore(hCertStore,
                   0))
{
        printf("The MY store was closed. \n");
}
else
{
        printf("An error occurred. The MY store was not closed. \n");
}

Persyaratan

   
Klien minimum yang didukung Windows XP [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2003 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header wincrypt.h
Pustaka Crypt32.lib
DLL Crypt32.dll

Lihat juga

Fungsi Penyimpanan Sertifikat

CreateEvent

WaitForSingleObjectEx