CertControlStore 함수(wincrypt.h)

CertControlStore 함수를 사용하면 사용 중인 캐시된 저장소의 콘텐츠와 스토리지에 유지되는 해당 저장소의 콘텐츠 간에 차이가 있을 때 애플리케이션에 알림을 받을 수 있습니다. 다른 프로세스가 저장소에 영향을 주는 변경 내용이 유지됨에 따라 차이가 발생할 수 있습니다.

CertControlStore 함수는 필요한 경우 캐시된 저장소를 동기화하는 데 사용할 수 있으며 캐시된 저장소의 변경 내용을 지속형 스토리지에 커밋하는 수단을 제공합니다.

구문

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

매개 변수

[in] hCertStore

인증서 저장소의 핸들입니다.

[in] dwFlags

dwCtrlType 매개 변수가 CERT_STORE_CTRL_COMMIT 설정된 경우 이 매개 변수는 다음 값 중 하나일 수 있습니다.

의미
CERT_STORE_CTRL_COMMIT_FORCE_FLAG
캐시가 변경되지 않은 경우에도 캐시 메모리 저장소의 콘텐츠를 영구 스토리지에 복사하도록 합니다.
CERT_STORE_CTRL_COMMIT_CLEAR_FLAG
저장소가 닫혀 있는 경우에도 캐시 메모리 저장소의 콘텐츠를 영구 스토리지로 복사하지 않습니다.
CERT_STORE_CTRL_INHIBIT_DUPLICATE_HANDLE_FLAG
이벤트 핸들의 중복 핸들을 억제합니다. 이 플래그가 설정되면 hCertStore 핸들을 닫기 전에 이 이벤트 HANDLE에 대해 CERT_STORE_CTRL_CANCEL_NOTIFY 전달된 CertControlStore를 호출해야 합니다.
 

dwCtrlType이 CERT_STORE_CTRL_NOTIFY_CHANGE 또는 CERT_STORE_CTRL_RESYNC 설정된 경우 dwFlags 매개 변수는 사용되지 않으며 0으로 설정해야 합니다.

[in] dwCtrlType

CertControlStore에서 수행할 제어 작업입니다. pvCtrlParadwFlags의 해석은 dwCtrlType 값에 따라 달라집니다. 현재 다음 작업이 정의되어 있습니다.

의미
CERT_STORE_CTRL_RESYNC
캐시된 저장소는 다시 동기화되고 지속형 저장소와 일치하도록 만들어집니다.
CERT_STORE_CTRL_NOTIFY_CHANGE
캐시된 저장소의 현재 콘텐츠가 저장소의 지속 상태와 다르다는 것을 나타내기 위해 pvCtrlPara가 가리키는 공간에 신호가 반환됩니다.
CERT_STORE_CTRL_COMMIT
캐시된 저장소에 대한 모든 변경 내용은 지속형 스토리지에 복사됩니다. 캐시된 저장소가 열린 이후 또는 마지막 커밋 이후 변경 내용이 없는 경우 호출은 무시됩니다. 저장소 공급자가 변경 내용을 즉시 자동으로 유지하는 공급자인 경우에도 호출이 무시됩니다.
CERT_STORE_CTRL_AUTO_RESYNC
모든 열거형 또는 매장 찾기 호출이 시작될 때 저장소에서 변경되었는지 여부를 확인하기 위한 검사 수행됩니다. 저장소가 변경된 경우 다시 동기화가 수행됩니다. 이 검사 pPrevContextNULL인 경우 첫 번째 열거 또는 찾기 호출에서만 수행됩니다.

pvCtrPara 멤버는 사용되지 않으며 NULL로 설정해야 합니다.

CERT_STORE_CTRL_CANCEL_NOTIFY
이전 CERT_STORE_CTRL_NOTIFY_CHANGE 또는 CERT_STORE_CTRL_RESYNC 전달된 이벤트 HANDLE의 알림 신호를 취소합니다. pvCtrlPara 매개 변수는 취소할 이벤트 HANDLE을 가리킵니다.

[in] pvCtrlPara

dwCtrlType이 CERT_STORE_NOTIFY_CHANGE 경우 pvCtrlPara는 저장소의 지속된 상태에서 변경이 감지될 때 시스템에서 알림 변경 이벤트를 알리는 핸들의 주소로 설정됩니다. CreateEvent 함수를 호출하여 핸들을 초기화해야 합니다. 레지스트리 기반 저장소의 경우 pvCtrlPara 매개 변수를 NULL 로 설정할 수 있습니다. pvCtrlParaNULL이면 내부 알림 변경 이벤트가 생성되고 신호를 받을 수 있도록 등록됩니다. 내부 알림 변경 이벤트를 사용하면 저장소가 변경된 경우에만 다시 동기화 작업을 수행할 수 있습니다.

dwCtrlType이 CERT_STORE_CTRL_RESYNC 경우 지속형 저장소의 다음 변경 시 신호를 받을 이벤트 핸들의 주소로 pvCtrlPara를 설정합니다. 일반적으로 이 주소는 초기화 중에 CERT_STORE_CTRL_NOTIFY_CHANGE 전달된 이벤트 핸들의 주소입니다. 전달된 이벤트 핸들이 다시 정렬됩니다. pvCtrlParaNULL로 설정된 경우 이벤트가 다시 정렬되지 않습니다.

dwCtrlType이 CERT_STORE_CTRL_COMMIT 경우 pvCtrlPara가 사용되지 않으며 NULL로 설정해야 합니다.

반환 값

함수가 성공하면 함수는 0이 아닌 값을 반환합니다.

함수가 실패하면 0을 반환합니다. 확장 오류 정보는 GetLastError를 호출합니다.

dwCtrlType이 CERT_STORE_NOTIFY_CHANGE 경우 이벤트 신호에 대한 핸들이 성공적으로 설정되면 함수는 0이 아닌 값을 반환합니다. 이벤트 핸들이 설정되지 않은 경우 함수는 0을 반환합니다.

dwCtrlType이 CERT_STORE_CTRL_RESYNC 경우 다시 동기화에 성공하면 함수는 0이 아닌 값을 반환합니다. 다시 동기화에 실패한 경우 함수는 0을 반환합니다.

dwCtrlType이 CERT_STORE_CTRL_COMMIT 경우 함수는 0이 아닌 값을 반환하여 지속형 스토리지에 대한 커밋이 성공적으로 완료되었음을 나타냅니다. 커밋에 실패한 경우 함수는 0을 반환합니다.

일부 공급자는 특정 컨트롤 형식을 지원하지 않을 수 있습니다. 이러한 경우 CertControlStore 는 0을 반환하고 GetLastError 는 ERROR_NOT_SUPPORTED 코드로 설정됩니다.

설명

저장소의 다시 동기화는 언제든지 수행할 수 있습니다. 신호를 받은 알림 변경 이벤트를 따를 필요는 없습니다.

CERT_STORE_CTRL_NOTIFY_CHANGE RegNotifyChangeKeyValue 함수를 사용하여 레지스트리 기반 저장소 공급자에서 지원됩니다.

CERT_STORE_CTRL_NOTIFY_CHANGE 사용하는 CertControlStore는 CERT_STORE_CTRL_RESYNC 함께 전달될 각 이벤트 핸들에 대해 한 번 호출됩니다. CERT_STORE_CTRL_NOTIFY_CHANGE 사용하여 이러한 호출은 이벤트가 신호를 받은 후가 아니라 각 이벤트를 만든 후에 이루어져야 합니다.

예제

다음 예제에서는 사용 중인 캐시된 저장소의 콘텐츠와 스토리지에 유지되는 해당 저장소의 콘텐츠 간에 차이가 있을 때 애플리케이션에 알림을 받을 수 있도록 하는 방법을 보여 줍니다. 이 예제의 전체 컨텍스트를 포함하는 전체 예제는 예제 C 프로그램: 인증서 저장소 속성 설정 및 가져오기를 참조하세요.


//--------------------------------------------------------------------
// 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");
}

요구 사항

   
지원되는 최소 클라이언트 Windows XP [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 wincrypt.h
라이브러리 Crypt32.lib
DLL Crypt32.dll

추가 정보

인증서 저장소 함수

CreateEvent

WaitForSingleObjectEx