Mercurial > trustbridge
view cinst/windowsstore.c @ 185:ee37c085b9f7
Try to handle crypt32 errors. Print the error code as fallback
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Tue, 25 Mar 2014 18:03:49 +0000 |
parents | 8cfcd38a9bb3 |
children | 292e2cb60ef0 |
line wrap: on
line source
#ifdef WIN32 #include <stdio.h> #include "windowsstore.h" #include "errorcodes.h" #include "listutil.h" #include "strhelp.h" static LPWSTR getLastErrorMsg() { LPWSTR bufPtr = NULL; DWORD err = GetLastError(); FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPWSTR) &bufPtr, 0, NULL); if (!bufPtr) { HMODULE hWinhttp = GetModuleHandleW (L"crypt32"); if (hWinhttp) { FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, hWinhttp, HRESULT_CODE (err), 0, (LPWSTR) &bufPtr, 0, NULL); } } if (!bufPtr) printf ("Error getting last error for code: %lx \n", err); return bufPtr; } int write_stores_win (char **to_install, char **to_remove, bool user_store) { int i = 0; int ret = -1; HCERTSTORE hStore = NULL; if (user_store) { hStore = CertOpenStore (CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, L"Root"); } else { hStore = CertOpenStore (CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"Root"); } if (!hStore) { return ERR_STORE_ACCESS_DENIED; } for (i=0; to_install[i]; i++) { size_t cert_len = strnlen (to_install[i], MAX_LINE_LENGTH), buf_size = 0; char *buf = NULL; ret = str_base64_decode (&buf, &buf_size, to_install[i], cert_len); if (ret != 0) { return ERR_INVALID_INSTRUCTIONS; } ret = CertAddEncodedCertificateToStore (hStore, X509_ASN_ENCODING, (PBYTE) buf, buf_size, CERT_STORE_ADD_ALWAYS, NULL); if (ret == 0) { LPWSTR error = getLastErrorMsg(); if (error) { printf ("Failed to add certificate: %S \n", error); LocalFree (error); } } i++; free (buf); } for (i=0; to_remove[i]; i++) { // TODO } if (hStore) { CertCloseStore (hStore, 0); } return 0; } #endif // WIN32