perfdata.cpp
上传用户:jinandeyu
上传日期:2007-01-05
资源大小:620k
文件大小:8k
源码类别:

远程控制编程

开发平台:

WINDOWS

  1. /*  Back Orifice 2000 - Remote Administration Suite
  2.     Copyright (C) 1999, Cult Of The Dead Cow
  3.     This program is free software; you can redistribute it and/or modify
  4.     it under the terms of the GNU General Public License as published by
  5.     the Free Software Foundation; either version 2 of the License, or
  6.     (at your option) any later version.
  7.     This program is distributed in the hope that it will be useful,
  8.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.     GNU General Public License for more details.
  11.     You should have received a copy of the GNU General Public License
  12.     along with this program; if not, write to the Free Software
  13.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14. The author of this program may be contacted at dildog@l0pht.com. */
  15. #include <windows.h> 
  16. #include <winperf.h> 
  17. #include <perfdata.h>
  18. #include <stdlib.h> 
  19.  
  20.  
  21. LPTSTR      *gPerfTitleSz; 
  22. LPTSTR      TitleData; 
  23.  
  24.  
  25. // GetPerfData() - Get a new set of performance data. 
  26. //      *ppData should be NULL initially. 
  27. //      This function will allocate a buffer big enough to hold the 
  28. //      data requested by szObjectIndex. 
  29. // 
  30. //      *pDataSize specifies the initial buffer size.  If the size is 
  31. //      too small, the function will increase it until it is big enough 
  32. //      then return the size through *pDataSize.  Caller should 
  33. //      deallocate *ppData if it is no longer being used. 
  34. // 
  35. //      Returns ERROR_SUCCESS if no error occurs. 
  36. // 
  37. //      Note: the trial and error loop is quite different from the normal 
  38. //            registry operation.  Normally if the buffer is too small, 
  39. //            RegQueryValueEx returns the required size.  In this case, 
  40. //            the perflib, since the data is dynamic, a buffer big enough 
  41. //            for the moment may not be enough for the next. Therefor, 
  42. //            the required size is not returned. 
  43. // 
  44. //            One should start with a resonable size to avoid the overhead 
  45. //            of reallocation of memory. 
  46. DWORD GetPerfData (HKEY hPerfKey, LPTSTR szObjectIndex, PPERF_DATA *ppData, DWORD *pDataSize)
  47. DWORD   DataSize; 
  48. DWORD   dwR; 
  49. DWORD   Type; 
  50.     if (!*ppData) 
  51.         *ppData = (PPERF_DATA) LocalAlloc (LMEM_FIXED, *pDataSize); 
  52.     do  { 
  53.         DataSize = *pDataSize; 
  54.         dwR = RegQueryValueEx (hPerfKey, 
  55. szObjectIndex, 
  56. NULL, 
  57. &Type, 
  58. (BYTE *)*ppData, 
  59. &DataSize); 
  60.         if (dwR == ERROR_MORE_DATA) 
  61.             LocalFree (*ppData); 
  62.             *pDataSize += 1024; 
  63.             *ppData = (PPERF_DATA) LocalAlloc (LMEM_FIXED, *pDataSize); 
  64.         if (!*ppData) 
  65.             LocalFree (*ppData); 
  66.             return ERROR_NOT_ENOUGH_MEMORY; 
  67. } while (dwR == ERROR_MORE_DATA); 
  68.     return dwR; 
  69.  
  70.  
  71.  
  72.  
  73. #ifdef UNICODE 
  74.  
  75. #define atoi    atoiW 
  76.  
  77. //  atoiW() - Unicode version of atoi. 
  78. INT atoiW (LPTSTR s) 
  79. INT i = 0; 
  80. while (iswdigit (*s)) { 
  81. i = i*10 + (BYTE)*s - L'0'; 
  82.         s++; 
  83.     return i; 
  84.  
  85. #endif 
  86.  
  87.  
  88.  
  89.  
  90. //  GetPerfTitleSz() - Retrieves the performance data title strings. 
  91. // 
  92. //   This call retrieves english version of the title strings. 
  93. // 
  94. //   For NT 3.1, the counter names are stored in the "Counters" value 
  95. //   in the ...perflib09 key.  For 3.5 and later, the 009 key is no 
  96. //      longer used.  The counter names should be retrieved from "Counter 009" 
  97. //      value of HKEY_PERFORMANCE_KEY. 
  98. // 
  99. //      Caller should provide two pointers, one for buffering the title 
  100. //      strings the other for indexing the title strings.  This function will 
  101. //      allocate memory for the TitleBuffer and TitleSz.  To get the title 
  102. //      string for a particular title index one would just index the TitleSz. 
  103. //      *TitleLastIdx returns the highest index can be used.  If TitleSz[N] is 
  104. //      NULL then there is no Title for index N. 
  105. // 
  106. //      Example:  TitleSz[20] points to titile string for title index 20. 
  107. // 
  108. //      When done with the TitleSz, caller should LocalFree(*TitleBuffer). 
  109. // 
  110. //      This function returns ERROR_SUCCESS if no error. 
  111. DWORD   GetPerfTitleSz (HKEY    hKeyMachine, 
  112.                         HKEY    hKeyPerf, 
  113.                         LPTSTR  *TitleBuffer, 
  114.                         LPTSTR  *TitleSz[], 
  115.                         DWORD   *TitleLastIdx) 
  116. HKEY  hKey1; 
  117. HKEY    hKey2; 
  118. DWORD   Type; 
  119. DWORD   DataSize; 
  120. DWORD   dwR; 
  121. DWORD   Len; 
  122. DWORD   Index; 
  123. DWORD   dwTemp; 
  124. BOOL    bNT10; 
  125. LPTSTR  szCounterValueName; 
  126. LPTSTR  szTitle; 
  127.     // Initialize 
  128.     // 
  129.     hKey1        = NULL; 
  130.     hKey2        = NULL; 
  131.     *TitleBuffer = NULL; 
  132.     *TitleSz     = NULL; 
  133.     // Open the perflib key to find out the last counter's index and system version. 
  134.     
  135. dwR = RegOpenKeyEx (hKeyMachine, 
  136. TEXT("software\microsoft\windows nt\currentversion\perflib"), 
  137. 0, 
  138. KEY_READ, 
  139. &hKey1); 
  140.     if (dwR != ERROR_SUCCESS) 
  141.         goto done; 
  142.     // Get the last counter's index so we know how much memory to allocate for TitleSz 
  143.     
  144. DataSize = sizeof (DWORD); 
  145.     dwR = RegQueryValueEx (hKey1, TEXT("Last Counter"), 0, &Type, (LPBYTE)TitleLastIdx, &DataSize); 
  146.     if (dwR != ERROR_SUCCESS) 
  147.         goto done; 
  148.     // Find system version, for system earlier than 1.0a, there's no version value. 
  149.     
  150. dwR = RegQueryValueEx (hKey1, TEXT("Version"), 0, &Type, (LPBYTE)&dwTemp, &DataSize); 
  151.     if (dwR != ERROR_SUCCESS) 
  152.         // unable to read the value, assume NT 1.0 
  153.         bNT10 = TRUE; 
  154.     else 
  155.         // found the value, so, NT 1.0a or later 
  156.         bNT10 = FALSE; 
  157.     // Now, get ready for the counter names and indexes. 
  158.     
  159. if (bNT10) 
  160.         // NT 1.0, so make hKey2 point to ...perflib09 and get 
  161.         //  the counters from value "Counters" 
  162.         // 
  163.         szCounterValueName = TEXT("Counters"); 
  164.         dwR = RegOpenKeyEx (hKeyMachine, 
  165. TEXT("software\microsoft\windows nt\currentversion\perflib\009"), 
  166. 0, 
  167. KEY_READ, 
  168. &hKey2); 
  169.         if (dwR != ERROR_SUCCESS) 
  170.             goto done; 
  171.     else 
  172.         // NT 1.0a or later.  Get the counters in key HKEY_PERFORMANCE_KEY 
  173.         //  and from value "Counter 009" 
  174.     
  175. szCounterValueName = TEXT("Counter 009"); 
  176.         hKey2 = hKeyPerf; 
  177.     // Find out the size of the data. 
  178.     // 
  179.     dwR = RegQueryValueEx (hKey2, szCounterValueName, 0, &Type, 0, &DataSize); 
  180.     if (dwR != ERROR_SUCCESS) 
  181.         goto done; 
  182.     // Allocate memory 
  183.     // 
  184.     *TitleBuffer = (LPTSTR)LocalAlloc (LMEM_FIXED, DataSize); 
  185.     if (!*TitleBuffer) 
  186.         dwR = ERROR_NOT_ENOUGH_MEMORY; 
  187.         goto done; 
  188.     *TitleSz = (LPTSTR *)LocalAlloc (LPTR, (*TitleLastIdx+1) * sizeof (LPTSTR)); 
  189.     if (!*TitleSz) 
  190.         dwR = ERROR_NOT_ENOUGH_MEMORY; 
  191.         goto done; 
  192. // Query the data 
  193.  
  194. dwR = RegQueryValueEx (hKey2, szCounterValueName, 0, &Type, (BYTE *)*TitleBuffer, &DataSize); 
  195.     if (dwR != ERROR_SUCCESS) 
  196.         goto done; 
  197. // Setup the TitleSz array of pointers to point to beginning of each title string. 
  198.     // TitleBuffer is type REG_MULTI_SZ. 
  199.     
  200. szTitle = *TitleBuffer; 
  201.     while (Len = lstrlen (szTitle)) 
  202.         Index = atoi (szTitle); 
  203.         szTitle = szTitle + Len +1; 
  204.         if (Index <= *TitleLastIdx) 
  205.             (*TitleSz)[Index] = szTitle; 
  206.         szTitle = szTitle + lstrlen (szTitle) +1; 
  207. done: 
  208.     // Done. Now cleanup! 
  209.     
  210. if (dwR != ERROR_SUCCESS) 
  211.         // There was an error, free the allocated memory 
  212.         // 
  213.         if (*TitleBuffer) LocalFree (*TitleBuffer); 
  214.         if (*TitleSz)     LocalFree (*TitleSz); 
  215.     // Close the hKeys. 
  216.     if (hKey1) RegCloseKey (hKey1); 
  217.     if (hKey2 && hKey2 != hKeyPerf) RegCloseKey (hKey2); 
  218.     return dwR; 
  219.