Вроде произвожу тривиальные действия: Код (Text): ....... status = GetFullPath(newProcess, &child); status |= GetFullPath(process, &parent); if (!NT_SUCCESS(status)) { ObDereferenceObject(process); ObDereferenceObject(newProcess); return; } bTerminate = AskUser(&parent, &child); //тут строки только читаются RtlFreeUnicodeString(&parent); RtlFreeUnicodeString(&child); //сюда показывает анализ крэш-дампа //ExFreePool(parent.Buffer); //ExFreePool(child.Buffer); ....... GetFullPath: Код (Text): ....... status = IoVolumeDeviceToDosName(fileObject->DeviceObject, &driveLetter); //__asm int 3; path->Buffer = ExAllocatePool(0x1000, PagedPool); path->Length = 0; path->MaximumLength = 0x1000; RtlCopyUnicodeString(path, &driveLetter); //ExFreePool(driveLetter->Buffer); RtlAppendUnicodeStringToString(path, &fileObject->FileName); ....... При этом при освобождении буфера второй строки получаю бсод с BadPoolHeader, я чего-то не учитываю, или этот баг вызван какими-то ошибками с переполнением буфера в другой части кода, вроде бы же тут все чисто? Подскажите, плиз, как это дело можно отловить..
Извиняюсь, я как всегда написал ерунду, перепутал параметры ExAllocatePool местами.. Вот всегда так, опишусь где-нибудь, не работает, перечитаю много раз и не могу найти, потом только через некоторое время свежим взглядом замечаю.. и хз что с этим делать =(
=) Кстати, когда учил с++ после ассемблера, очень возмущался проверке типов и т.д., типа: "Они что программиста дебилом недееспособным считают?" =)