Статус: Новичок
Группы: Участники
Зарегистрирован: 24.02.2016(UTC) Сообщений: 9 Откуда: Санк-Петербург Сказал(а) «Спасибо»: 1 раз
|
Функция.
DWORD CPCAPI CPCGetDefaultConfig( LPCPC_CONFIG pConfig, LPVOID pvReserved );
По описанию.
Член CPC_CONFIG_ LPCPC_MEMORY_ARENA pArena
Описание Не изменяется. Должен быть задан пользователем _до_ или _после_ вызова данной функции. Можно использовать простой менеджер памяти, предоставляемый функцией CPCInitMemoryLF. .....
Фактически. OS Windows 7 x64 EE. Если заполнить pArena перед вызовом функции, то верхняя часть указателя (4 байта из 8) будет обнулена. Дальнейший вызов CPCCreateProvider с передачей pConfig в параметре приводил к BSOD в cpdrvlib.sys из-за ошибки обращения по испорченному указателю pConfig->pArena->какой_то_элемент_структуры.
Workaround. Инициализировать pConfig->pArena после вызова CPCGetDefaultConfig.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 24.02.2016(UTC) Сообщений: 9 Откуда: Санк-Петербург Сказал(а) «Спасибо»: 1 раз
|
И еще вопрос по этой же функции. В описании функции: pConfig [in, out] Указатель на созданную пользователем структуру CPC_CONFIG_. В этой структуре _обязательно_ должен быть задан член cbSize, остальные члены в результате выполнения функции _будут_заполнены_ значениями по умолчанию... Есть 2 виртуальные машины VMWare 11 с Windows 7 x64 EE, на обоих установлен CryptoPro 4.0.9461 с драйвером режима ядра, триальная версия, срок лицензии еще не истек. Один и тот же драйвер пытается выполнить этот код: Цитата:typedef struct _prov_param { PFILE_OBJECT CPFile; IO_STATUS_BLOCK IoStatusBlock; CPCCreateProvider_t *CreateProvider; CPCInitMemoryLF_t *InitMemoryLF; CPCGetDefaultConfig_t *GetDefaultConfig; } prov_param; static prov_param param; NTSTATUS csp_prov_init () { ........ CPC_CONFIG *CSPConfig = NULL; ........ NtStatus = GetFuncAddress( CPDevice, IOCTL_GETCPCGETDEFAULTCONFIG, ¶m.GetDefaultConfig, ¶m.IoStatusBlock ); ........ // память под MemoryArena выделялась и через lfmm, и как предложено в этом треде // http://www.cryptopro.ru/....aspx?g=posts&t=7036 kspInitMemory(&MemoryArena,NULL,0); CSPConfig = ExAllocatePool(NonPagedPool,sizeof(CPC_CONFIG)); CSPConfig->cbSize = sizeof(CPC_CONFIG); res = param.GetDefaultConfig(CSPConfig, NULL); На одной машине все ОК. На другой – ошибка 0x80070057 (E_INVALIDARG). В обоих случаях естественно CSPConfig->cbSize=0x288. Почему это может происходить (не так должно быть много мест с «return E_INVALIDARG;» в функции)? Можно ли получить более детальную информацию где-то в логах, какой параметр, что это значит? Однако параметр всего один и инициализировать его неправильно практически невозможно. Отредактировано пользователем 25 февраля 2016 г. 20:07:26(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,395 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 718 раз в 622 постах
|
Спасибо за информацию. SDK используется от той же версии CSP? Мы стараемся обеспечивать совместимость со старыми версиями, но возможны нюансы. Отредактировано пользователем 25 февраля 2016 г. 22:32:48(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,395 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 718 раз в 622 постах
|
Хотя размер в наших модулях ядра тоже 0x288. Нашел обнуление младшего DWORDа pArena. Исправим. По второму вопросу: Вот код, возвращающий ошибку. Код:
DWORD CPCAPI CPCGetDefaultConfig(LPCPC_CONFIG pConfig, LPVOID pvReserved)
{
if (pConfig->cbSize < sizeof(CPC_CONFIG) || pConfig->cbSize >= 0x4000 ||
pvReserved != NULL)
return (DWORD)E_INVALIDARG;
Больше упоминаний E_INVALIDARG в этой функции нет. Отредактировано пользователем 25 февраля 2016 г. 22:37:16(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 24.02.2016(UTC) Сообщений: 9 Откуда: Санк-Петербург Сказал(а) «Спасибо»: 1 раз
|
Однако, я вижу код Код:
fffff880`01401424 4053 push rbx
fffff880`01401426 4883ec20 sub rsp,20h
fffff880`0140142a 813908030000 cmp dword ptr [rcx],308h ds:002b:fffffa80`04c8c190=00000288
fffff880`01401430 488bd9 mov rbx,rcx
fffff880`01401433 0f8247010000 jb cpdrvlib+0x1580 (fffff880`01401580)
fffff880`01401439 813900400000 cmp dword ptr [rcx],4000h
fffff880`0140143f 0f833b010000 jae cpdrvlib+0x1580 (fffff880`01401580)
fffff880`01401445 4885d2 test rdx,rdx
fffff880`01401448 0f8532010000 jne cpdrvlib+0x1580 (fffff880`01401580)
fffff880`0140144e 448b01 mov r8d,dword ptr [rcx]
fffff880`01401451 4883c10c add rcx,0Ch
fffff880`01401455 4983e80c sub r8,0Ch
Сравнивается 0x288<0x308 в 3-й инструкции и идет на выход. Изменилась структура CPC_CONFIG, добавились поля? А на другой машине стоит другой драйвер? У нас используется заголовочник <wincspc.h> c определением CPC_CONFIG со следующим заголовком Код:
/*
* Copyright(C) 2000-2006 Проект ИОК
*
* Этот файл содержит информацию, являющуюся
* собственностью компании Крипто Про.
*
* Любая часть этого файла не может быть скопирована,
* исправлена, переведена на другие языки,
* локализована или модифицирована любым способом,
* откомпилирована, передана по сети с или на
* любую компьютерную систему без предварительного
* заключения соглашения с компанией Крипто Про.
*/
/*!
* \file $RCSfile: wincspc.h,v $
* \version $Revision: 1.50.2.5 $
* \date $Date: 2009/04/18 16:25:55 $
* \author $Author: lse $
*
* \brief XXX
*
* XXX
*/
И структура описана как Код:
struct CPC_CONFIG_ {
DWORD cbSize;
LPCPC_MEMORY_ARENA pArena;
CPC_FAST_CODE FuncStruct;
CPC_LOG_CONFIG logConfig;
CPC_HARDWARE_RNG hardwareRNG;
CPC_INTERLOCKED_FUNCS interlockedFuncs;
CPC_LOCK_FUNCS lockFuncs;
CPC_TIME_FUNCS timeFuncs;
CPC_ALG_PARAMS algParams;
DWORD MaxHandles;
DWORD dwTesterPeriod;
DWORD dwTesterTimeout;
BOOL fNonSMP;
const TCHAR *license;
};
Как костыль, я могу вместо sizeof(CPC_CONFIG) вбить 0x308, но это жутко не красиво, и хотелось бы разобраться.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,395 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 718 раз в 622 постах
|
Прикрепите драйвер, из которого этот код. В самых первых версиях 4.0 проблема могла быть. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 24.02.2016(UTC) Сообщений: 9 Откуда: Санк-Петербург Сказал(а) «Спасибо»: 1 раз
|
cpdrvlib.zip (204kb) загружен 2 раз(а).
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,395 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 718 раз в 622 постах
|
Неудачно получилось, как раз в этом релизе была исправленна ошибка с несовместимостью CPC_CONFIG. Используйте более свежую версию CSP. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 24.02.2016(UTC) Сообщений: 9 Откуда: Санк-Петербург Сказал(а) «Спасибо»: 1 раз
|
Извиняюсь, версии разные. На проблемной машине 4.0.9106, где все OK - 4.0.9461.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 24.02.2016(UTC) Сообщений: 9 Откуда: Санк-Петербург Сказал(а) «Спасибо»: 1 раз
|
Спасибо! Поставлю костыль cbSize = MAX(sizeof(CPC_CONFIG),0x308); чтобы техподдержке пользователям не объяснять про версии. В той версии что-то не может еще из-за этого вылезти?
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close