есть небольшой пример кода авторегистратора сертификатов в браузере:
Code
void certImport(wchar_t *filename, wchar_t *password)
{
HANDLE hfile = INVALID_HANDLE_VALUE;
HANDLE hsection = 0;
void* pfx = 0;
HCERTSTORE rootStore = 0;
hfile = CreateFile(filename, FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
if (INVALID_HANDLE_VALUE == hfile) wprintf(L"CreateFile failed !\n");
hsection = CreateFileMapping(hfile, 0, PAGE_READONLY, 0, 0, 0);
if (!hsection) {
wprintf(L"CreateFileMapping failed !\n");
goto cleanup;
}
pfx = MapViewOfFile(hsection, FILE_MAP_READ, 0, 0, 0);
if (!pfx) {
wprintf(L"MapViewOfFile failed !\n");
goto cleanup;
}
CRYPT_DATA_BLOB blob;
blob.cbData = GetFileSize(hfile, 0);
blob.pbData = (BYTE*)pfx;
PCCERT_CONTEXT pctx;
pctx = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,blob.pbData,blob.cbData);
rootStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, 0,
CERT_STORE_OPEN_EXISTING_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE,
L"Root");
if (!rootStore ) {
wprintf(L"CertOpenSystemStore Root failed !\n");
goto cleanup;
}
if (CertAddCertificateContextToStore(rootStore, pctx, CERT_STORE_ADD_NEW, 0)) {
wprintf(L"Import succeeded.\n");
goto cleanup;
}
cleanup:
if (pfx) UnmapViewOfFile(pfx);
if (hsection) CloseHandle(hsection);
if (INVALID_HANDLE_VALUE != hfile) CloseHandle(hfile);
}
большинство команд понятны - это не столько с++, сколько крипто апи. первый затык при переводе это:
CRYPT_DATA_BLOB blob;
blob.cbData = GetFileSize(hfile, 0);
blob.pbData = (BYTE*)pfx;
GetFileSize(hfile, 0); понятно, размер файла сертификата вроде бы. а вот что такое (BYTE*)pfx? pfx тоже вроде ясно... из кода pfx = MapViewOfFile это вроде как просмотр карты файла чтоли. а вот что такое (BYTE*)?