Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Atly  
#1 Оставлено : 29 ноября 2013 г. 16:31:06(UTC)
Atly

Статус: Новичок

Группы: Участники
Зарегистрирован: 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? Можно ли уменьшить количество выделяемой памяти, если я ограничиваюсь только подсчётом хэшей?
Offline Максим Коллегин  
#2 Оставлено : 29 ноября 2013 г. 18:48:33(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,399
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Тип памяти зависит от используемых блокировок. Не используйте lfmm. Последние версии поддерживают работу по умолчанию - посмотрите пример в сдк.
Знания в базе знаний, поддержка в техподдержке
Offline Atly  
#3 Оставлено : 2 декабря 2013 г. 10:37:48(UTC)
Atly

Статус: Новичок

Группы: Участники
Зарегистрирован: 29.11.2013(UTC)
Сообщений: 3
Российская Федерация

Пример в SDK только один, там lfmm используется - под него выделяется ~6 Мб в NonPagedPool. Каким образом можно отказаться от lfmm?
Offline Максим Коллегин  
#4 Оставлено : 2 декабря 2013 г. 21:58:09(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,399
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Точно, сейчас постараюсь выложить макет.
Знания в базе знаний, поддержка в техподдержке
Offline Максим Коллегин  
#5 Оставлено : 2 декабря 2013 г. 21:59:08(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 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)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline Максим Коллегин  
#6 Оставлено : 2 декабря 2013 г. 22:11:43(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,399
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Странный стек - как драйвер оказался в ntfs.sys?
sample драйвер спроектирован для работы на <=APC_LEVEL, ровно как и все механизмы блокировок по умолчанию.
Знания в базе знаний, поддержка в техподдержке
Offline Atly  
#7 Оставлено : 3 декабря 2013 г. 10:35:25(UTC)
Atly

Статус: Новичок

Группы: Участники
Зарегистрирован: 29.11.2013(UTC)
Сообщений: 3
Российская Федерация

Автор: maxdm Перейти к цитате
Странный стек - как драйвер оказался в ntfs.sys?


Мне это тоже странным показалось. Может быть из-за того, что у меня не было ваших отладочных символов и стек определился не правильно.
Но после выделения памяти в NonPagedPool ошибка не воспроизводится. Сейчас попробую с вашим кодом сделать.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.