СБиС++ ЭО 2.4.42 WINE@Etersoft SQL 2.0.0-eter0.3/1 После установки СБиС++ ЭО в Wine надо вручную устанавливать сертификат TENSORCA1. При установке в консоли выводятся такие сообщения: Error: Failed to save to the destination store Error: Failed to save to the destination store CertMgr Failed Error: Failed to save to the destination store Error: Failed to save to the destination store CertMgr Failed Error: Failed to save to the destination store Error: Failed to save to the destination store CertMgr Failed Error: Failed to save to the destination store Error: Failed to save to the destination store CertMgr Failed Error: Failed to save to the destination store Error: Failed to save to the destination store CertMgr Failed
Ошибка выводится утилитой certmgr, расположенной в поддиректории RootCerts директории СБиС++. $ wine certmgr.exe -add -all CASimpleTest_RootNew.cer -s Root -r localMachine Error: Failed to save to the destination store Error: Failed to save to the destination store CertMgr Failed
Ошибка вызвана вызовом данной функции: static BOOL WINAPI CRYPT_RootWriteCert(HCERTSTORE hCertStore, PCCERT_CONTEXT cert, DWORD dwFlags) { /* The root store can't have certs added */ return FALSE; }
Если запускать утилиту без параметра -r localMachine, то сертификат добавляется успешно.
Разбирался, как устроены хранилища сертификатов в Wine
Добавил поддержку сохранения сертификатов в корневое хранилище в HKLM. Теперь при открытии корневого хранилища локальной машины, предоставляемого провайдером CERT_STORE_PROV_SYSTEM_REGISTRY, создаётся хранилище с новым типом StoreTypeRoot. Это хранилище содержит в себе collection-хранилище, в которое добавлены корневое хранилище в HKLM и старое корневое хранилище, формируемое из сертификатов, установленных в Linux-системе, и доступное только для чтения. Новый тип для хранилища установлен для того, чтобы для него не рабтали функции, предназначенные для collection-хранилища.
Флаг CERT_STORE_DELETE_FLAG в CRYPT_RootRegOpenStore специально не обрабатывается, т.к. при его наличии CRYPT_RegOpenStore должна вернуть NULL, и CRYPT_RootRegOpenStore просто не будет вызвана.
принято