Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
Проблема с CSP 3.6 R3, kernel mode, Win7 x32 и x64
Статус: Новичок
Группы: Участники
Зарегистрирован: 29.11.2013(UTC) Сообщений: 3 
|
Мой драйвер использует компоненты ядра CSP для рассчета хэш-сумм. Иногда (на некоторых машинах часто, на некоторых - никогда, операционные системы Win7 x86 и x64) вылетает BSoD: Код:
kd> !analyze -v
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
IRQL_NOT_LESS_OR_EQUAL (a)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high. This is usually
caused by drivers using improper addresses.
If a kernel debugger is available get the stack backtrace.
Arguments:
Arg1: fffff8a000a23b80, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000001, bitfield :
bit 0 : value 0 = read operation, 1 = write operation
bit 3 : value 0 = not an execute operation, 1 = execute operation (only on chips which support this level of status)
Arg4: fffff8000286486e, address which referenced memory
Debugging Details:
------------------
WRITE_ADDRESS: fffff8a000a23b80 Paged pool
CURRENT_IRQL: 2
FAULTING_IP:
nt!ExDeleteResourceLite+ce
fffff800`0286486e 488908 mov qword ptr [rax],rcx
DEFAULT_BUCKET_ID: WIN7_DRIVER_FAULT
BUGCHECK_STR: 0xA
PROCESS_NAME: System
TRAP_FRAME: fffff88002f38740 -- (.trap 0xfffff88002f38740)
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=fffff8a000a23b80 rbx=0000000000000000 rcx=fffffa8001e58de8
rdx=000000000000070d rsi=0000000000000000 rdi=0000000000000000
rip=fffff8000286486e rsp=fffff88002f388d0 rbp=fffff80002a1b5a0
r8=fffff88002f389e1 r9=fffff8a0001f5ec8 r10=fffff80002806000
r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0 nv up ei pl zr na po nc
nt!ExDeleteResourceLite+0xce:
fffff800`0286486e 488908 mov qword ptr [rax],rcx ds:fffff8a0`00a23b80=408de50180faffff
Resetting default scope
LAST_CONTROL_TRANSFER: from fffff80002877469 to fffff80002877f00
STACK_TEXT:
fffff880`02f385f8 fffff800`02877469 : 00000000`0000000a fffff8a0`00a23b80 00000000`00000002 00000000`00000001 : nt!KeBugCheckEx
fffff880`02f38600 fffff800`028760e0 : 00000000`00000002 fffffa80`01e58d40 00000000`00000000 fffff65e`afb6e710 : nt!KiBugCheckDispatch+0x69
fffff880`02f38740 fffff800`0286486e : 00000000`000007ff 00000000`00000030 fffff8a0`003788f0 fffffa80`01e67a78 : nt!KiPageFault+0x260
fffff880`02f388d0 fffff880`01215803 : fffffa80`01e58d00 fffff800`02a1b5a0 fffffa80`01e58d00 fffffa80`01c3e180 : nt!ExDeleteResourceLite+0xce
fffff880`02f38930 fffff880`012a7193 : fffff880`02f389f0 fffff800`02a1b5a0 fffffa80`01e58d00 fffffa80`01e7f240 : Ntfs!NtfsFreeNonpagedDataFcb+0x13
fffff880`02f38960 fffff880`01219f6a : fffff800`02a1b5a0 fffff880`02f38b01 fffff880`02f389e1 fffff8a0`003eb010 : Ntfs!NtfsDeleteFcb+0x3a3
fffff880`02f389c0 fffff880`012a42cc : fffffa80`01e7f240 fffffa80`01c3e180 fffff8a0`003eb010 fffff8a0`003eb3a8 : Ntfs!NtfsTeardownFromLcb+0x1ea
fffff880`02f38a50 fffff880`01222882 : fffffa80`01e7f240 fffffa80`01e7f240 fffff8a0`003eb010 fffff880`02f38c00 : Ntfs!NtfsTeardownStructures+0xcc
fffff880`02f38ad0 fffff880`012bb813 : fffffa80`01c3e180 fffff800`02a1b5a0 fffff8a0`6366744e 00000000`00000009 : Ntfs!NtfsDecrementCloseCounts+0xa2
fffff880`02f38b10 fffff880`0129538f : fffffa80`01e7f240 fffff8a0`003eb140 fffff8a0`003eb010 fffffa80`01c3e180 : Ntfs!NtfsCommonClose+0x353
fffff880`02f38be0 fffff800`02885161 : 00000000`00000000 fffff880`01295200 fffff800`02a7d101 fffff800`00000002 : Ntfs!NtfsFspClose+0x15f
fffff880`02f38cb0 fffff800`02b1b166 : 031c0502`18040215 fffffa80`00ccf680 00000000`00000080 fffffa80`00cb7040 : nt!ExpWorkerThread+0x111
fffff880`02f38d40 fffff800`02856486 : fffff800`029f0e80 fffffa80`00ccf680 fffffa80`00ccfb60 271a6926`1a69251a : nt!PspSystemThreadStartup+0x5a
fffff880`02f38d80 00000000`00000000 : fffff880`02f39000 fffff880`02f33000 fffff880`02f389f0 00000000`00000000 : nt!KiStartSystemThread+0x16
Обращение идёт к адресу fffff8a000a23b80, принадлежащему буферу, выделенному при инициализации Crypto Pro функцией InitMemoryLF: Код:
!pool fffff8a000a23b80
Pool page fffff8a000a23b80 region is Paged pool
*fffff8a000a00000 : large page allocation, Tag is IicD, size is 0x888000 bytes
Память у меня выделяется в PagedPool, PoolSizes задаются так, как указано в документации: http://cpdn.cryptopro.ru...m_m___c_o_n_f_i_g__.htmlПравильно ли я понимаю, что это неверно, и буфер нужно выделять в NonPagedPool? Можно ли уменьшить количество выделяемой памяти, если я ограничиваюсь только подсчётом хэшей?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,399  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 719 раз в 623 постах
|
Тип памяти зависит от используемых блокировок. Не используйте lfmm. Последние версии поддерживают работу по умолчанию - посмотрите пример в сдк. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 29.11.2013(UTC) Сообщений: 3 
|
Пример в SDK только один, там lfmm используется - под него выделяется ~6 Мб в NonPagedPool. Каким образом можно отказаться от lfmm?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,399  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 719 раз в 623 постах
|
Точно, сейчас постараюсь выложить макет. |
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,399  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 719 раз в 623 постах
|
Код:#define KCSP_POOL 'PSCK'
/*! Инициализация памяти */
extern DWORD kspInitMemory (LPCPC_MEMORY_ARENA *pArena, LONG *PoolSizes, DWORD nPools);
/*! Уничтожение всех куч */
static void CPCAPI kspDoneMemory (LPCPC_MEMORY_ARENA pArena);
/*! Выделение памяти */
static DWORD CPCAPI kspAllocMemory (LPCPC_MEMORY_ARENA pArena, size_t dwSize, DWORD dwMemPoolId, DWORD dwThreadId, LPVOID *pRes);
/*! Освобождение памяти */
static DWORD CPCAPI kspFreeMemory (LPCPC_MEMORY_ARENA pArena, VOID *pMem, DWORD dwMemPoolId);
DWORD
kspInitMemory (LPCPC_MEMORY_ARENA *pArena, LONG *PoolSizes, DWORD nPools)
{
LPCPC_MEMORY_ARENA pRes = NULL;
UNUSED(nPools);
UNUSED(PoolSizes);
pRes = ExAllocatePoolWithTag( NonPagedPool, sizeof(CPC_MEMORY_ARENA), KCSP_POOL );
if (!pRes)
return (DWORD) NTE_NO_MEMORY;
RtlZeroMemory( pRes, sizeof(CPC_MEMORY_ARENA) );
pRes->pDoneMemory = kspDoneMemory;
pRes->pAllocMemory = kspAllocMemory;
pRes->pFreeMemory = kspFreeMemory;
*pArena = pRes;
return 0;
}
void CPCAPI kspDoneMemory (LPCPC_MEMORY_ARENA pArena)
{
ExFreePoolWithTag( pArena, KCSP_POOL );
}
DWORD CPCAPI kspAllocMemory (LPCPC_MEMORY_ARENA pArena, size_t dwSize, DWORD dwMemPoolId, DWORD dwThreadId, LPVOID *pRes)
{
POOL_TYPE PoolType;
LPVOID pMem = NULL;
UNUSED(dwThreadId);
UNUSED(pArena);
switch ( dwMemPoolId ) {
case MP_PRIME:
case MP_PRIME_M:
case MP_SEC_M:
PoolType = NonPagedPool;
break;
default:
PoolType = PagedPool;
}
pMem = ExAllocatePoolWithTag( PoolType, dwSize, KCSP_POOL );
if (!pMem)
return (DWORD)NTE_NO_MEMORY;
RtlZeroMemory(pMem,dwSize);
*pRes = pMem;
return 0;
}
DWORD CPCAPI kspFreeMemory (LPCPC_MEMORY_ARENA pArena, VOID *pMem, DWORD dwMemPoolId)
{
(pArena);
(dwMemPoolId);
ExFreePoolWithTag( pMem, KCSP_POOL );
return 0;
}
LPCPC_MEMORY_ARENA MemoryArena;
CPC_CONFIG CSPConfig = {sizeof(CPC_CONFIG)};
res = kspInitMemory(&MemoryArena, NULL, 0);
if (res) {
KdPrint((MODNAME "! kspInitMemory failed with a return of 0x%.8X!\n", res));
NtStatus = STATUS_UNSUCCESSFUL;
goto exit;
}
res = GetDefaultConfig(&CSPConfig, NULL);
if (res) {
KdPrint((MODNAME "! GetDefaultConfig failed with a return of 0x%.8X!\n", res));
NtStatus = STATUS_UNSUCCESSFUL;
goto exit;
}
CSPConfig.pArena = MemoryArena;
//CSPConfig.FuncStruct.UsedMask = dwUsedMask;
res = CreateProvider(&hCSP, &CSPConfig);
if (res) {
KdPrint((MODNAME "! CreateProvider failed with a return of 0x%.8X!\n", res));
NtStatus = STATUS_UNSUCCESSFUL;
goto exit;
}
Отредактировано пользователем 2 декабря 2013 г. 22:01:36(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,399  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 719 раз в 623 постах
|
Странный стек - как драйвер оказался в ntfs.sys? sample драйвер спроектирован для работы на <=APC_LEVEL, ровно как и все механизмы блокировок по умолчанию. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 29.11.2013(UTC) Сообщений: 3 
|
Автор: maxdm  Странный стек - как драйвер оказался в ntfs.sys? Мне это тоже странным показалось. Может быть из-за того, что у меня не было ваших отладочных символов и стек определился не правильно. Но после выделения памяти в NonPagedPool ошибка не воспроизводится. Сейчас попробую с вашим кодом сделать.
|
|
|
|
Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
Проблема с CSP 3.6 R3, kernel mode, Win7 x32 и x64
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close