Синий экран с ошибкой MEMORY_MANAGEMENT (1a)

Тема в разделе "WASM.NT.KERNEL", создана пользователем eboev, 1 сен 2009.

  1. eboev

    eboev New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2009
    Сообщения:
    7
    Всем добрый день! Я первый раз :)
    Я разрабатываю TDI драйвер и он у меня падает с ошибкой:

    MEMORY_MANAGEMENT (1a)
    # Any other values for parameter 1 must be individually examined.
    Arguments:
    Arg1: 00001236, The subtype of the bugcheck.
    Arg2: 85b120a0
    Arg3: 85b120bc
    Arg4: 0007e912

    MODULE_NAME: HTTP

    FAULTING_MODULE: 82244000 nt

    DEBUG_FLR_IMAGE_TIMESTAMP: 479190c9

    BUGCHECK_STR: 0x1a_1236

    DEFAULT_BUCKET_ID: WRONG_SYMBOLS

    CURRENT_IRQL: 0

    LAST_CONTROL_TRANSFER: from 98d30cd7 to 822bfb71

    STACK_TEXT:
    WARNING: Stack unwind information not available. Following frames may be wrong.
    8903acd4 98d30cd7 85b120a0 98d1bd80 8903ad00 nt!MmFreePagesFromMdl+0x10b
    8903ace4 98d30f69 85b120a0 98d1bd80 00000000 HTTP+0x3acd7
    8903ad00 98d29807 8733fb10 85b1b008 85b12008 HTTP+0x3af69
    8903ad14 98cffb10 85b12008 00000000 873f10b8 HTTP+0x33807
    8903ad50 98d1d209 00b12018 00000000 873fb950 HTTP+0x9b10
    8903ad7c 82419b18 00000002 75386a31 00000000 HTTP+0x27209
    8903adc0 82272a2e 98d1d005 873f10b8 00000000 nt!RtlDestroyAtomTable+0x4fe
    00000000 00000000 00000000 00000000 00000000 nt!RtlSubAuthorityCountSid+0x3c4


    STACK_COMMAND: kb

    FOLLOWUP_IP:
    HTTP+3acd7
    98d30cd7 6a00 push 0

    SYMBOL_STACK_INDEX: 1

    SYMBOL_NAME: HTTP+3acd7

    FOLLOWUP_NAME: MachineOwner

    IMAGE_NAME: HTTP.sys

    BUCKET_ID: WRONG_SYMBOLS

    Followup: MachineOwner
    ---------

    Дебаггер отказывается показывать в каком месте моего драйвера ошибка и поэтому у я пока не могу локализовать причину проблемы. Может быть вы уважаемые что - нибудь подскажите - где например искать багу?

    Наши рассуждения таковы: вызов функции MmFreePagesFromMdl, вызвавший ошибку указывает на работу с Mdl списком, с которым мы работаем только в процессе обработки IRP запроса с TDI_SEND,
    общая процедура обработки примерно такая:

    Код (Text):
    1. NTSTATUS DrvDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP irp)
    2. {
    3. switch (irps->MajorFunction)
    4. {
    5. ...
    6. case IRP_MJ_INTERNAL_DEVICE_CONTROL:  
    7. switch( irps->MinorFunction )
    8. {
    9. case TDI_SEND:
    10. if( ParentControlModeModule_GetMode() == EParentControlMode_PC)
    11. {
    12. status = ProcessGetIrpForParentControl( DeviceObject, irp, irps, (PCHAR) PsGetCurrentProcess() + gProcessNameOffset );
    13. //если совпало - дропаю!
    14. if( STATUS_INVALID_CONNECTION == status )
    15. {
    16. status = tdi_dispatch_complete(DeviceObject, irp, FILTER_DENY);
    17. return status;
    18. }
    19. }
    20. status = tdi_dispatch_complete(DeviceObject, irp, FILTER_ALLOW);
    21. break;
    22. };
    23. break;
    24. };
    25. return status;
    26. }
    Теперь схема самой интересной функции ProcessGetIrpForParentControl:
    Код (Text):
    1. NTSTATUS ProcessGetIrpForParentControl(PDEVICE_OBJECT DeviceObject, PIRP irp, PIO_STACK_LOCATION irps, PCHAR ProcName)
    2. {
    3. PTDI_REQUEST_KERNEL_SEND  pTdiRQS = NULL;
    4.  
    5.   if( KeGetCurrentIrql() >= DISPATCH_LEVEL )
    6.     return STATUS_SUCCESS;
    7.  
    8.   __try{
    9.     pTdiRQS = (PTDI_REQUEST_KERNEL_SEND)&(irps->Parameters);
    10.     if( NULL == pTdiRQS )
    11.       __leave;
    12.  
    13.     if( pTdiRQS->SendLength <= 15 )   // проверка на запрос GET от HTTP c полем host
    14.       __leave;
    15.  
    16.     MmProbeAndLockPages( irp->MdlAddress, KernelMode, IoReadAccess );
    17.  
    18.     pInfo = MmGetSystemAddressForMdlSafe( irp->MdlAddress, NormalPagePriority );
    19.  
    20.     if(NULL == pInfo)
    21.     {
    22.         __leave;
    23.     }
    24.      .....
    25.   }
    26.   __except(EXCEPTION_EXECUTE_HANDLER){
    27.     pInfo = NULL;
    28.   }
    29. }
    Может мы не корректно работаем с памятью? Есть у кого - нибудь исходники или полезные ссылки как организовать родительский контроль без ошибок?
     
  2. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    1) Кода как-будто маловато...
    2) Что по этому адресу: HTTP+0x3acd7 ? Есть мнение что там вызов IoCallDriver... просто кажется я такой код где-то видел.
    3) MmUnlockPages используете ?
    4) Под какую ОСь ?
     
  3. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    А... MmProbeAndLockPages нужно вообще делать ?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    eboev
    ну ты блин) больше кода надо
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Символы бы настроить. Без них совсем адово. (Например: .symfix, .sympath).
     
  6. eboev

    eboev New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2009
    Сообщения:
    7
    3) MmUnlockPages используете ?
    4) Под какую ОСь ?


    MmUnlockPages использовали сначала, но падало под WinXP, убрали - падения пропали, поэтому оставили код таким. А под Vista падает!
     
  7. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Ладно. Напишу что думаю :)

    MmFreePagesFromMdl - освобождает память выделенную MmAllocatePagesForMdl.
    MmAllocatePagesForMdl - выделяет заполненную нулями, nonpaged, физическую память для Mdl.
    Падает код судя по всему на MmFreePagesFromMdl, и скорее всего выделяете память не вы, и освобождаете тоже не вы. Про подобную ошибку помню что она часто вылетает:
    1) (не точно) Только на checked build'ах
    2) (опять же не точно, нашел в своем хелпе с пометкой "непроверено")
    This bugcheck occurs when Mm is freeing a PTE that appears to be
    in pagefile format, but the corresponding bit in the pagefile bitmap is
    already clear
    ===============
    Хорошо бы еще затестить на XP с включенным Driver Verifier. Есть мнение что грохнется тоже, может легче будет найти проблему.

    Если вы работаете с физически выделенной через MmAllocatePagesForMdl памятью... ну я не знаю, нужно ли использовать MmProbeAndLockPages... :)

    Кода мало !!! :)
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Wizard109
    и 1 и 2 неправда. вылетает и на фри билдах и не только при освобождении пте. вылетает много где - сделай поиск по сорцам винды, увидишь много мест. первый параметр вроде __LINE__
     
  9. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Great
    Да, точно. Я просто ограничился беглой проверкой в первом попавшемся файле (allocpag.c). Там в #if DBG... #endif :)
     
  10. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    З.Ы. Место где встречается его ошибка:

    iosup.c
    PMMPFN Pfn1;

    void MmFreePagesFromMdl(...)
    {
    ...
    Pfn1 = MI_PFN_ELEMENT (*Page);
    ...
    if (Pfn1->u4.PteFrame != MI_MAGIC_AWE_PTEFRAME) {
    KeBugCheckEx (MEMORY_MANAGEMENT,
    0x1236,
    (ULONG_PTR) MemoryDescriptorList,
    (ULONG_PTR) Page,
    *Page);
    }
    ...
    }