Всем доброго! Где грабли? есть структура: Код (Text): typedef struct _CRIJNDAEL { CHAIN_BLOCK Chain_block; int m_Ke[MAX_ROUNDS+1][MAX_BC]; char m_chain0[MAX_BLOCK_SIZE]; char m_chain[MAX_BLOCK_SIZE]; ... } CRIJNDAEL, * PCRIJNDAEL; typedef struct _FORMATS_ENTRY { CCHAR KeySize; PCRIJNDAEL varCrypto; } FORMATS_ENTRY,* PFORMATS_ENTRY; PCRIJNDAEL инициализирую, выделяю память в NonPagedPool, работаю, но когда пытаюсь осободить ранее выделенную память , получаю BSOD, в чем может быть проблема? Может есть какие-то правила, для особождения структур использующе массивы? Код (Text): PAGE_FAULT_IN_NONPAGED_AREA (50) Invalid system memory was referenced. This cannot be protected by try-except, it must be protected by a Probe. Typically the address is just plain bad or it is pointing at freed memory. Arguments: Arg1: fffffffb, memory referenced. Arg2: 00000000, value 0 = read operation, 1 = write operation. Arg3: 8046b462, If non-zero, the instruction address which referenced the bad memory address. Arg4: 00000000, (reserved) OVERLAPPED_MODULE: vpc_s3_fba8f000 READ_ADDRESS: fffffffb Nonpaged pool expansion FAULTING_IP: nt!ExFreePoolWithTag+f2 8046b462 8a47fa mov al,[edi-0x6] MM_INTERNAL_CODE: 0 DEFAULT_BUCKET_ID: INTEL_CPU_MICROCODE_ZERO BUGCHECK_STR: 0x50 LAST_CONTROL_TRANSFER: from 8046b2e2 to 8046b462
Имхо руки патчить надо, или хотя-бы приводить код, а то телепаты все убежали давно. Тут дело может быть скорее в двух причинах 1) Освобождаешь не по тому указателю какой получил при выделении. 2) Обращаешся за границы выделенного участка и затираешь служебные структуры диспетчера памяти.
Ms Rem, проверю твое предположение, насчет кода, так там ничего эдакого я не творю, выделяю память, а после удалю.
<font color="gray][ Ms Rem</font><!--color--><font color="gray]: ...а то телепаты все убежали давно. ]</font><!--color--> Не все Код (Text): :0046A6A6 _ExFreePoolWithTag@8 proc near :0046A6A6 i_p = dword ptr 8 :0046A6A6 i_uTag = dword ptr 0Ch . . . :0046A6AF mov edi, [ebp+i_p] :0046A6B2 cmp edi, _MmSpecialPoolStart :0046A6B8 jb short loc_46A6D1 :0046A6BA cmp edi, _MmSpecialPoolEnd :0046A6C0 jnb short loc_46A6D1 . . . :0046A6D1 loc_46A6D1: :0046A6D1 xor ebx, ebx :0046A6D3 test di, 0FFFh ; if ( PAGE_ALIGNED( i_p ) ) { :0046A6D8 jnz loc_46A7A2 . . . :0046A7A2 loc_46A7A2: <font color="red]:0046A7A2 mov al, [edi-6] ; Entry->PoolType</font><!--color--> ; #define POOL_OVERHEAD sizeof(POOL_HEADER) = 8 :0046A7A5 lea esi, [edi-8] ; Entry = (PPOOL_HEADER)((PCHAR)P - POOL_OVERHEAD); :0046A7A8 mov cl, al ; PoolType = (Entry->PoolType & POOL_TYPE_MASK) - 1; :0046A7AA and ecx, 3 :0046A7AD dec ecx memory referenced = fffffffb = (edi-6) => edi = fffffffb + 6 = 1. Т.о. выясняется, что указатель, переданный ExFreePoolWithTag равен 1.
Вообщем по какой-то причине, у меня действительно вместо нормального адреса идет еденица, почему не понятно, щас буду с кодом разбираться.
<font color="gray][ LuckyDevil</font><!--color--><font color="gray]: Four-F и как это лечить? ]</font><!--color--> Ответ на этот вопрос лежит за гранью моих телепатических способностей