枚举本地远程NT系统进程[5]

[入库:2005年9月19日] [更新:2007年3月24日]

本文简介:

 // free the counter names buffer

 free( buf );

 // allocate the initial buffer for the performance data

 dwSize = INITIAL_SIZE;

 buf = (LPSTR) malloc( dwSize );



 while (TRUE)

 {

 if (buf == NULL)

 __leave;

  memset( buf, 0, dwSize );

  rc=RegQueryValueEx(ghPerfKey,szSubKey,NULL,&dwType,(LPBYTE) buf,&dwSize);

  pPerf = (PPERF_DATA_BLOCK) buf;

 // check for success and valid perf data block signature

 if ((rc == ERROR_SUCCESS) &&

  (dwSize > 0) &&

 (pPerf)->Signature[0] == (WCHAR)'P' &&

 (pPerf)->Signature[1] == (WCHAR)'E' &&

 (pPerf)->Signature[2] == (WCHAR)'R' &&

 (pPerf)->Signature[3] == (WCHAR)'F' )

 break;

 // if buffer is not big enough, reallocate and try again

 if (rc == ERROR_MORE_DATA)

 {

 dwSize += EXTEND_SIZE;

 buf = (LPSTR) realloc( buf, dwSize );

 }

  else __leave;

 }

 // set the perf_object_type pointer

 pObj = (PPERF_OBJECT_TYPE) ((DWORD)pPerf + pPerf->HeaderLength);

 //loop thru the performance counter definition records looking

 //for the process id counter and then save its offset



 pCounterDef = (PPERF_COUNTER_DEFINITION) ((DWORD)pObj + pObj->HeaderLength);



 for (i=0; i<(DWORD)pObj->NumCounters; i++)

 {

 if (pCounterDef->CounterNameTitleIndex == dwProcessIdTitle)

 {

 dwProcessIdCounter = pCounterDef->CounterOffset;

 break;

 }

  pCounterDef++;

 }



 pInst = (PPERF_INSTANCE_DEFINITION) ((DWORD)pObj + pObj->DefinitionLength);



 // loop thru the performance instance data extracting each process name

 // and process id



 for (i=0; i < (DWORD)pObj->NumInstances-1 && i 
 {

 // pointer to the process name

 p = (LPSTR) ((DWORD)pInst + pInst->NameOffset);

 // convert it to ascii

 rc = WideCharToMultiByte( CP_ACP,0,(LPCWSTR)p,-1,szProcessName,sizeof(szProcessName),NULL,NULL);



 // if we cant convert the string then use a default value

 if (!rc) strcpy( ProList[i].ProcessName, UNKNOWN_TASK );

  else strncpy(ProList[i].ProcessName, szProcessName,sizeof(ProList[i].ProcessName)-1);



 // get the process id

 pCounter = (PPERF_COUNTER_BLOCK) ((DWORD)pInst + pInst->ByteLength);

ProList[i].dwProcessID = *((LPDWORD) ((DWORD)pCounter + dwProcessIdCounter));



 // next process

pInst = (PPERF_INSTANCE_DEFINITION) ((DWORD)pCounter + pCounter->ByteLength); 

 }

 dwRet=i;

 }//end of try

 __finally

 {

 if (buf) free( buf );

 RegCloseKey( hKeyNames );

 RegCloseKey( HKEY_PERFORMANCE_DATA );

 if(bRemote)

 {

  char tmp[52],tmp2[96];

  strncpy(tmp,ip,sizeof(tmp)-1);

  wsprintf(tmp2,"\\\\%s\\ipc$",tmp);

  WNetCancelConnection2(tmp2,CONNECT_UPDATE_PROFILE,TRUE);

 }

 }

 return dwRet;

}



////////////////////////////////////////////////////////////////////////////////



int ConnIPC(char *RemoteName,char *User,char *Pass)

{

 NETRESOURCE nr;

 char RN[50]="\\\\";



本文关键:枚举本地远程NT系统进程
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top