Освобождаю память, в ответ получаю BSOD

Тема в разделе "WASM.WIN32", создана пользователем LuckyDevil, 25 янв 2006.

  1. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Всем доброго!

    Где грабли?

    есть структура:
    Код (Text):
    1.  
    2. typedef struct _CRIJNDAEL {
    3.     CHAIN_BLOCK Chain_block;
    4.     int m_Ke[MAX_ROUNDS+1][MAX_BC];
    5.     char m_chain0[MAX_BLOCK_SIZE];
    6.     char m_chain[MAX_BLOCK_SIZE];
    7. ...
    8. } CRIJNDAEL, * PCRIJNDAEL;
    9.  
    10. typedef struct _FORMATS_ENTRY
    11. {   CCHAR   KeySize;
    12.     PCRIJNDAEL varCrypto;
    13. } FORMATS_ENTRY,* PFORMATS_ENTRY;
    14.  
    15.  


    PCRIJNDAEL инициализирую, выделяю память в NonPagedPool,

    работаю, но когда пытаюсь осободить ранее выделенную память , получаю BSOD, в чем может быть проблема?

    Может есть какие-то правила, для особождения структур использующе массивы?


    Код (Text):
    1. PAGE_FAULT_IN_NONPAGED_AREA (50)
    2. Invalid system memory was referenced.  This cannot be protected by try-except,
    3. it must be protected by a Probe.  Typically the address is just plain bad or it
    4. is pointing at freed memory.
    5. Arguments:
    6. Arg1: fffffffb, memory referenced.
    7. Arg2: 00000000, value 0 = read operation, 1 = write operation.
    8. Arg3: 8046b462, If non-zero, the instruction address which referenced the bad memory
    9.     address.
    10. Arg4: 00000000, (reserved)
    11.  
    12. OVERLAPPED_MODULE:  vpc_s3_fba8f000
    13.  
    14. READ_ADDRESS:  fffffffb Nonpaged pool expansion
    15.  
    16. FAULTING_IP:
    17. nt!ExFreePoolWithTag+f2
    18. 8046b462 8a47fa           mov     al,[edi-0x6]
    19.  
    20. MM_INTERNAL_CODE:  0
    21.  
    22. DEFAULT_BUCKET_ID:  INTEL_CPU_MICROCODE_ZERO
    23.  
    24. BUGCHECK_STR:  0x50
    25.  
    26. LAST_CONTROL_TRANSFER:  from 8046b2e2 to 8046b462
    27.  
    28.  
     
  2. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    имхо, память глючит, memtest надо
     
  3. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Имхо руки патчить надо, или хотя-бы приводить код, а то телепаты все убежали давно.

    Тут дело может быть скорее в двух причинах

    1) Освобождаешь не по тому указателю какой получил при выделении.

    2) Обращаешся за границы выделенного участка и затираешь служебные структуры диспетчера памяти.
     
  4. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ms Rem, проверю твое предположение, насчет кода, так там ничего эдакого я не творю, выделяю память, а после удалю.
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ Ms Rem</font><!--color--><font color="gray]: ...а то телепаты все убежали давно. ]</font><!--color-->



    Не все ;)
    Код (Text):
    1. :0046A6A6 _ExFreePoolWithTag@8 proc near
    2.  
    3. :0046A6A6 i_p             = dword ptr  8
    4. :0046A6A6 i_uTag          = dword ptr  0Ch
    5. . . .
    6. :0046A6AF                 mov     edi, [ebp+i_p]
    7. :0046A6B2                 cmp     edi, _MmSpecialPoolStart
    8. :0046A6B8                 jb      short loc_46A6D1
    9. :0046A6BA                 cmp     edi, _MmSpecialPoolEnd
    10. :0046A6C0                 jnb     short loc_46A6D1
    11. . . .
    12. :0046A6D1 loc_46A6D1:
    13. :0046A6D1                 xor     ebx, ebx
    14. :0046A6D3                 test    di, 0FFFh          ; if ( PAGE_ALIGNED( i_p ) ) {
    15. :0046A6D8                 jnz     loc_46A7A2
    16. . . .
    17. :0046A7A2 loc_46A7A2:
    18. <font color="red]:0046A7A2                 mov     al, [edi-6]        ; Entry->PoolType</font><!--color-->
    19.                                                      ; #define POOL_OVERHEAD sizeof(POOL_HEADER) = 8
    20. :0046A7A5                 lea     esi, [edi-8]       ; Entry = (PPOOL_HEADER)((PCHAR)P - POOL_OVERHEAD);
    21. :0046A7A8                 mov     cl, al             ; PoolType = (Entry->PoolType & POOL_TYPE_MASK) - 1;
    22. :0046A7AA                 and     ecx, 3
    23. :0046A7AD                 dec     ecx
    memory referenced = fffffffb = (edi-6) => edi = fffffffb + 6 = 1. Т.о. выясняется, что указатель, переданный ExFreePoolWithTag равен 1.
     
  6. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F и как это лечить?
     
  7. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Вообщем по какой-то причине, у меня действительно вместо нормального адреса идет еденица, почему не понятно, щас буду с кодом разбираться.
     
  8. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: Four-F и как это лечить? ]</font><!--color-->



    Ответ на этот вопрос лежит за гранью моих телепатических способностей ;)
     
  9. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, насчет способностей ты скромничаешь :).