Всем добрый день! Я первый раз Я разрабатываю 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): NTSTATUS DrvDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP irp) { switch (irps->MajorFunction) { ... case IRP_MJ_INTERNAL_DEVICE_CONTROL: switch( irps->MinorFunction ) { case TDI_SEND: if( ParentControlModeModule_GetMode() == EParentControlMode_PC) { status = ProcessGetIrpForParentControl( DeviceObject, irp, irps, (PCHAR) PsGetCurrentProcess() + gProcessNameOffset ); //если совпало - дропаю! if( STATUS_INVALID_CONNECTION == status ) { status = tdi_dispatch_complete(DeviceObject, irp, FILTER_DENY); return status; } } status = tdi_dispatch_complete(DeviceObject, irp, FILTER_ALLOW); break; }; break; }; return status; } Теперь схема самой интересной функции ProcessGetIrpForParentControl: Код (Text): NTSTATUS ProcessGetIrpForParentControl(PDEVICE_OBJECT DeviceObject, PIRP irp, PIO_STACK_LOCATION irps, PCHAR ProcName) { PTDI_REQUEST_KERNEL_SEND pTdiRQS = NULL; if( KeGetCurrentIrql() >= DISPATCH_LEVEL ) return STATUS_SUCCESS; __try{ pTdiRQS = (PTDI_REQUEST_KERNEL_SEND)&(irps->Parameters); if( NULL == pTdiRQS ) __leave; if( pTdiRQS->SendLength <= 15 ) // проверка на запрос GET от HTTP c полем host __leave; MmProbeAndLockPages( irp->MdlAddress, KernelMode, IoReadAccess ); pInfo = MmGetSystemAddressForMdlSafe( irp->MdlAddress, NormalPagePriority ); if(NULL == pInfo) { __leave; } ..... } __except(EXCEPTION_EXECUTE_HANDLER){ pInfo = NULL; } } Может мы не корректно работаем с памятью? Есть у кого - нибудь исходники или полезные ссылки как организовать родительский контроль без ошибок?
1) Кода как-будто маловато... 2) Что по этому адресу: HTTP+0x3acd7 ? Есть мнение что там вызов IoCallDriver... просто кажется я такой код где-то видел. 3) MmUnlockPages используете ? 4) Под какую ОСь ?
3) MmUnlockPages используете ? 4) Под какую ОСь ? MmUnlockPages использовали сначала, но падало под WinXP, убрали - падения пропали, поэтому оставили код таким. А под Vista падает!
Ладно. Напишу что думаю 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... Кода мало !!!
Wizard109 и 1 и 2 неправда. вылетает и на фри билдах и не только при освобождении пте. вылетает много где - сделай поиск по сорцам винды, увидишь много мест. первый параметр вроде __LINE__
Great Да, точно. Я просто ограничился беглой проверкой в первом попавшемся файле (allocpag.c). Там в #if DBG... #endif
З.Ы. Место где встречается его ошибка: 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); } ... }