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);
}
}
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);
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货