Esempio n. 1
0
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]);
		}
}