void KGDIObjectTable::UpdateTable(void) { // clear nNew array for an updating for (int i=0; i<m_info.size(); i++) memset(m_info[i].nNew, 0, sizeof(m_info[i].nNew)); for (i=0; i<MAXGDIHANDLE; i++) // all GDI handles { GDITableCell cell = m_gditable[i]; cell._nProcess = m_gditable.GetProcess(i); cell._nCount = m_gditable.GetCount(i); // if kernel object point is invalid, object is deleted if ( (unsigned) cell.pKernel < 0x80000000 ) continue; // search for the processid in m_info table int k = -1; for (int j=0; j<m_info.size(); j++) if ( m_info[j].processid == cell._nProcess ) { k = j; break; } if ( k==-1) { ProcessInfo pi = { 0 }; m_info.push_back(pi); k = m_info.size() - 1; m_info[k].processid = cell._nProcess; TCHAR szPath[MAX_PATH]; GetProcessName(m_info[k].processid, szPath); // new process in listview m_process.AddItem(0, m_info[k].processid); m_process.AddItem(1, szPath); } switch ( cell.nType & 0x1F ) // 0..31 { case DC_TYPE : m_info[k].nNew[0] ++; break; case RGN_TYPE : m_info[k].nNew[1] ++; break; case SURF_TYPE : m_info[k].nNew[2] ++; break; case PAL_TYPE : m_info[k].nNew[3] ++; break; case LFONT_TYPE: m_info[k].nNew[4] ++; break; case BRUSH_TYPE: m_info[k].nNew[5] ++; break; default : m_info[k].nNew[6] ++; break; } } // update any changed process for (i=0; i<m_info.size(); i++) // if changed if ( memcmp(m_info[i].nObject, m_info[i].nNew, sizeof(m_info[i].nNew)) ) { memcpy(m_info[i].nObject, m_info[i].nNew, sizeof(m_info[i].nNew)); m_process.SetItem(i, 2, m_info[i].nObject[0] + m_info[i].nObject[1] + m_info[i].nObject[2] + m_info[i].nObject[3] + m_info[i].nObject[4] + m_info[i].nObject[5] + m_info[i].nObject[6]); m_process.SetItem(i, 3, m_info[i].nObject[0]); m_process.SetItem(i, 4, m_info[i].nObject[1]); m_process.SetItem(i, 5, m_info[i].nObject[2]); m_process.SetItem(i, 6, m_info[i].nObject[3]); m_process.SetItem(i, 7, m_info[i].nObject[4]); m_process.SetItem(i, 8, m_info[i].nObject[5]); m_process.SetItem(i, 9, m_info[i].nObject[6]); } }