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.
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 |
---|---|
|
Penyimpanan yang di-cache disinkronkan ulang dan dibuat agar sesuai dengan penyimpanan yang bertahan. |
|
Sinyal dikembalikan dalam spasi yang ditunjukkan oleh pvCtrlPara untuk menunjukkan bahwa konten penyimpanan yang di-cache saat ini berbeda dari status penyimpanan yang bertahan. |
|
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. |
|
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. |
|
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk