Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <Windows.h>
- #include <wincrypt.h>
- #include <iomanip>
- #include <vector>
- #include <map>
- using std::cin;
- using std::cout;
- using std::string;
- using std::wcout;
- using std::vector;
- using std::map;
- // вывод ошибок
- void ErrorHandling(string message)
- {
- DWORD dw = GetLastError();
- cout << "Error with: " << message << "\n";
- cout << "Error code: " << dw << "\n";
- }
- int main()
- {
- LPTSTR pszName;
- DWORD dwType;
- DWORD cbName;
- DWORD dwIndex = 0;
- LPTSTR chosedProvName; // выбранный провайдер пользователем
- DWORD cbProvName;
- /*LPCTSTR provName = nullptr;
- provName = MS_STRONG_PROV;
- wcout << provName << "\n";*/
- // переменная содержит всех провайдеров после парсинга локальных значений
- vector<LPTSTR> providersList{};
- // Цикл по перечисляемым провайдерам.
- dwIndex = 0;
- while (CryptEnumProviders(
- dwIndex, // in -- dwIndex
- NULL, // in -- pdwReserved- устанавливается в NULL
- 0, // in -- dwFlags -- устанавливается в ноль
- &dwType, // out -- pdwProvType
- NULL, // out -- pszProvName -- NULL при первом вызове
- &cbName // in, out -- pcbProvName
- ))
- {
- // cbName - длина имени следующего провайдера.
- // Распределение памяти в буфере для восстановления этого имени.
- pszName = static_cast<LPTSTR>(malloc(cbName));
- if (!pszName)
- ErrorHandling("malloc failed!");
- memset(pszName, 0, cbName);
- // Получение имени типа провайдера.
- if (CryptEnumProviders(
- dwIndex++,
- NULL,
- 0,
- &dwType,
- pszName,
- &cbName))
- {
- // красивый вывод данных
- /*wcout << std::left << std::setw(sizeof(dwType)) << std::setfill(L' ') << dwType;
- wcout << std::left << std::setw(sizeof(pszName)) << std::setfill(L' ') << pszName << "\n";
- */
- // парсим названия провайдера
- providersList.push_back(pszName);
- }
- else
- {
- ErrorHandling("CryptEnumProviders");
- }
- }
- cout << "\nfound providers\n";
- for (size_t i = 0; i < providersList.size(); i++)
- {
- wcout << i << " " << providersList[i] << "\n";
- }
- cout << "choose provider: ";
- int choice = 0;
- do
- {
- cin >> choice;
- chosedProvName = providersList[choice];
- wcout << chosedProvName << "\n";
- } while (choice < 0 && choice > providersList.size());
- // уже передаём параметр chosedProvName в CryptAcquireContext и т.д.
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement