Мне удалось найти исходный код для версии фильтра демультиплексора Windows CE.Изучив его, действительно, , кажется, что можно безопасно переназначить вывод во время работы фильтра .
. Мне также удалось найти источник моих проблем с фильтром PSI-Parser.
При обнаружении нового транспортного потока или изменении версии PAT, PAT сбрасывается (все программы удаляются, таблица повторно анализируется и заполняется). В методе CPATProcessor::flush()
есть небольшая ошибка.
//
// flush
//
// flush an array of struct: m_mpeg2_program[];
// and unmap all PMT_PIDs pids, except one: PAT
BOOL CPATProcessor::flush()
{
BOOL bResult = TRUE;
bResult = m_pPrograms->free_programs(); // CPrograms::free_programs() call
if(bResult == FALSE)
return bResult;
bResult = UnmapPmtPid();
return bResult;
}// flush
Вот реализация CPrograms::free_programs()
.
_inline BOOL free_programs()
{
for(int i= 0; i<m_ProgramCount; i++){
if(!HeapFree(GetProcessHeap(), 0, (LPVOID) m_programs[i] ))
return FALSE;
}
return TRUE;
}
Проблема в том, что m_ProgramCount
участник никогда не очищается .Таким образом, -apart от сообщения о неправильном количестве программ в таблице после сброса (поскольку оно обновляется постепенно для каждой программы, найденной в таблице) -, при следующей очистке таблицы она попытается освободить памятьэто было уже выпущено .
Вот моя обновленная версия, которая исправляет ошибки повреждения кучи:
_inline BOOL free_programs()
{
for(int i= 0; i<m_ProgramCount; i++){
if(!HeapFree(GetProcessHeap(), 0, (LPVOID) m_programs[i] ))
return FALSE;
}
m_ProgramCount = 0; // This was missing, next call will try to free memory twice
return TRUE;
}