BOOL CTNetTraffic::GetInterfaces(){
try{
#define DEFAULT_BUFFER_SIZE 40960LInterfaces.RemoveAll();unsigned char *data = (unsigned char*)malloc(DEFAULT_BUFFER_SIZE);DWORD type;
DWORD size = DEFAULT_BUFFER_SIZE;
DWORD ret;

char s_key[4096];_stprintf( s_key , _T("%d") , 510 );

while((ret = RegQueryValueEx(HKEY_PERFORMANCE_DATA, s_key, 0, &type, data, &size)) != ERROR_SUCCESS){
while(ret == ERROR_MORE_DATA){
size += DEFAULT_BUFFER_SIZE;
data = (unsigned char*) realloc(data, size);

if(ret != ERROR_SUCCESS){
return(FALSE);
}
}

PERF_DATA_BLOCK  *dataBlockPtr = (PERF_DATA_BLOCK *)data;
PERF_OBJECT_TYPE *objectPtr = FirstObject(dataBlockPtr);

for(int a=0 ; a<(int)dataBlockPtr->NumObjectTypes ; a++) 
{
char nameBuffer[255];
if(objectPtr->ObjectNameTitleIndex == 510) 
{
DWORD processIdOffset = ULONG_MAX;
PERF_COUNTER_DEFINITION *counterPtr = FirstCounter(objectPtr);

for(int b=0 ; b<(int)objectPtr->NumCounters ; b++) 
{
if(counterPtr->CounterNameTitleIndex == 520){
processIdOffset = counterPtr->CounterOffset;
}

counterPtr = NextCounter(counterPtr);
}

if(processIdOffset == ULONG_MAX) {
free(data);
return(1);
}

PERF_INSTANCE_DEFINITION *instancePtr = FirstInstance(objectPtr);

for(b=0 ; b<objectPtr->NumInstances ; b++){ wchar_t *namePtr = (wchar_t *) ((BYTE *)instancePtr + instancePtr->NameOffset);
PERF_COUNTER_BLOCK *counterBlockPtr = GetCounterBlock(instancePtr);
char *pName = WideToMulti(namePtr, nameBuffer, sizeof(nameBuffer));
DWORD bandwith = *((DWORD *) ((BYTE *)counterBlockPtr + processIdOffset));
DWORD tottraff = 0; Interfaces.AddTail(CString(pName));
Bandwidths.AddTail(bandwith); TotalTraffics.AddTail(tottraff);  // initial 0, just for creating the list

instancePtr = NextInstance(instancePtr);
}
}
objectPtr = NextObject(objectPtr);
} free(data);

return(TRUE);
}
catch(...){
return(FALSE);
}
}