win32.c

来自「系统任务管理器」· C语言 代码 · 共 2,156 行 · 第 1/5 页

C
2,156
字号
} SharedSensor;

typedef struct {
    short siSMB_Base;            // SMBus base address
    BusType siSMB_Type;         // SMBus/Isa bus used to access chip
    SMBType siSMB_Code;         // SMBus sub type, Intel, AMD or ALi
    char siSMB_Addr;            // Address of sensor chip on SMBus
    unsigned char siSMB_Name[41];        // Nice name for SMBus
    short siISA_Base;            // ISA base address of sensor chip on ISA
    int siChipType;             // Chip nr, connects with Chipinfo.ini
    char siVoltageSubType;      // Subvoltage option selected
} SharedInfo;

typedef struct {
    double sdVersion;           // version number (example: 51090)
    SharedIndex sdIndex[10];     // Sensor index
    SharedSensor sdSensor[100];  // sensor info
    SharedInfo sdInfo;          // misc. info
    unsigned char sdStart[41];           // start time
    unsigned char sdCurrent[41];         // current time
    unsigned char sdPath[256];           // MBM path
} SharedData;

static int tempCount, voltCount, fanCount;

static int ReadSharedData(void)
{
  SharedData *ptr;
  SharedSensor *sens;
  HANDLE hSData;
  int i, j;
  int totalCount;

  hSData=OpenFileMapping(FILE_MAP_READ, FALSE, "$M$B$M$5$S$D$");
  if (hSData==0) 
      return 1;

  ptr = (SharedData *)MapViewOfFile(hSData, FILE_MAP_READ, 0, 0, 0);
  if (ptr == 0){
      CloseHandle(hSData);
      return 1;
  }

  totalCount = 0;
  for (i = 0; i < 5; i++) {
      totalCount += ptr->sdIndex[i].Count;
  }

  tempCount = 0;
  voltCount = 0;
  fanCount = 0;
  for (j = 0; j < totalCount; j++) {
      sens = &(ptr->sdSensor[j]);

      switch (ptr->sdSensor[j].ssType) {
      case stUnknown:
          break;
      case stTemperature:
          temperatures[tempCount] = ptr->sdSensor[j].ssCurrent;
          ++tempCount;
          break;
      case stVoltage:
          voltages[voltCount] = ptr->sdSensor[j].ssCurrent;
          ++voltCount;
          break;
      case stFan:
          fans[fanCount] = ptr->sdSensor[j].ssCurrent;
          ++fanCount;
          break;
      case stMhz:
          break;
      case stPercentage:
          break;
      }
  }
        
  UnmapViewOfFile(ptr);
  CloseHandle(hSData);

  return 0;
}

gboolean gkrellm_sys_sensors_get_voltage(gchar *device_name, gint id,
		gint iodev, gint inter, gfloat *volt)
{

    if (iodev < NrVoltage && iodev >= 0) {
        if (ReadSharedData() == 1) {
            *volt = 0;
            return FALSE;
        }

        *volt = voltages[iodev];

        return TRUE;
    }
    else {
        *volt = 0;
        return FALSE;
    }
}

gboolean gkrellm_sys_sensors_get_fan(gchar *device_name, gint id,
		gint iodev, gint inter, gfloat *fan)
{

    if (iodev < NrFan && iodev >= 0) {
        if (ReadSharedData() == 1) {
            *fan = 0;
            return FALSE;
        }

        *fan = fans[iodev];    

        return TRUE;
    }
    else {
        *fan = 0;
        return FALSE;
    }
}

gboolean gkrellm_sys_sensors_get_temperature(gchar *device_name, gint id,
		gint iodev, gint inter, gfloat *temp)
{

    if (iodev < NrTemperature && iodev >= 0) {
        if (ReadSharedData() == 1) {
            *temp = 0;
            return FALSE;
        }

        *temp = temperatures[iodev];

        return TRUE;
    }
    else {
        *temp = 0;
        return FALSE;
    }
}

gboolean gkrellm_sys_sensors_init(void)
{
    int haveMBM = 0;
    char buf[25];
//    SharedData *ptr;
//    SharedSensor *sens;
//    HANDLE hSData;
    int i;
//    int j;
//    int totalCount;

    if (_GK.debug_level & DEBUG_SYSDEP)
        printf("Initializing sensors.\n");

//    hSData=OpenFileMapping(FILE_MAP_READ, FALSE, "$M$B$M$5$S$D$");
//    if (hSData != 0) { 
//        ptr = (SharedData *)MapViewOfFile(hSData, FILE_MAP_READ, 0, 0, 0);
//        if (ptr == 0){
//          CloseHandle(hSData);
//          haveMBM = 0;
//        }
//        else {
//            haveMBM = 1;
//        }
//    }
//    else {
//        haveMBM = 0;
//    }

/*    if (haveMBM == 1) {
        totalCount = 0;
        for (i = 0; i < 5; i++) {
          totalCount += ptr->sdIndex[i].Count;
        }

        tempCount = 0;
        voltCount = 0;
        fanCount = 0;
        for (j = 0; j < totalCount; j++) {
          sens = &(ptr->sdSensor[j]);

          switch (ptr->sdSensor[j].ssType) {
          case stUnknown:
              break;
          case stTemperature:
                gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, NULL, sens->ssName,
			        tempCount, tempCount, 0,
			        1, 0, NULL, sens->ssName);
                ++tempCount;
              break;
          case stVoltage:
                if (strlen(sens->ssName) == 0) 
                    gkrellm_sensors_add_sensor(SENSOR_VOLTAGE, NULL, "Volt",
		                voltCount, voltCount, 0,
		                1, 0, NULL, "Volt");
                else 
                    gkrellm_sensors_add_sensor(SENSOR_VOLTAGE, NULL, sens->ssName,
		                voltCount, voltCount, 0,
		                1, 0, NULL, sens->ssName);
                ++voltCount;
              break;
          case stFan:
                gkrellm_sensors_add_sensor(SENSOR_FAN, NULL, sens->ssName,
	                fanCount, fanCount, 0,
	                1, 0, NULL, sens->ssName);
                ++fanCount;
              break;
          case stMhz:
              break;
          case stPercentage:
              break;
          }
        }
    
        UnmapViewOfFile(ptr);
        CloseHandle(hSData);
    }
    else  */
    {   
        tempCount = 0;
        voltCount = 0;
        fanCount = 0;

        for (i = 0; i < NrTemperature; i++) {
            sprintf(buf, "Temp %i", i);
            gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, NULL, buf,
	            tempCount, tempCount, 0,
	            1, 0, NULL, buf);
            ++tempCount;
        }

        for (i = 0; i < NrVoltage; i++) {
            sprintf(buf, "Volt %i", i);
            gkrellm_sensors_add_sensor(SENSOR_VOLTAGE, NULL, buf,
		        voltCount, voltCount, 0,
		        1, 0, NULL, buf);
            ++voltCount;
        }
    
        for (i = 0; i < NrFan; i++) {
            sprintf(buf, "Fan %i", i);
            gkrellm_sensors_add_sensor(SENSOR_FAN, NULL, buf,
	            fanCount, fanCount, 0,
	            1, 0, NULL, buf);
            ++fanCount;
        }
    }

    if (_GK.debug_level & DEBUG_SYSDEP)
        printf("Initialized sensors for %i temps, %i volts, %i fans.\n", tempCount, voltCount, fanCount);

    return TRUE;
}

/* ===================================================================== */
/* CPU monitor interface */
/* ===================================================================== */

void
gkrellm_sys_cpu_read_data(void)
	{
	/* One routine reads cpu, disk, and swap data.  All three monitors will
	| call it, but only the first call per timer tick will do the work.
	*/

#if defined(USE_PDH)
    static gulong user[MAX_CPU], nice[MAX_CPU], sys[MAX_CPU], idle[MAX_CPU];
    DWORD type;
    PDH_FMT_COUNTERVALUE value;
    int i;
#else
    static gulong user, nice, sys, idle;
    DWORD* value;
#endif
    long userInt = 0, idleInt = 0, sysInt = 0;

    win32_read_proc_stat();

#if defined(USE_PDH)
    if (winVer > 0 && query != 0) {
        for (i = 0; i < numCPUs; i++) {
            status = PdhGetFormattedCounterValue(cpuUserCounter[i], PDH_FMT_LONG, &type, &value);
            if (status != 0) 
                userInt = 0;
            else 
                userInt = value.longValue;
    
            status = PdhGetFormattedCounterValue(cpuSysCounter[i], PDH_FMT_LONG, &type, &value);
            if (status != 0)
                sysInt = 0;
            else
                sysInt = value.longValue;

            // user time defined as total - system
            userInt -= sysInt;

            idleInt = 100 - userInt - sysInt;

            user[i] += userInt;
            sys[i] += sysInt;
            idle[i] += idleInt;
   
	        gkrellm_cpu_assign_data(i, user[i], nice[i], sys[i], idle[i]);
        }
    }
#else
    if (cpuperfKey != 0) {
        dataLen = 8192;
        RegQueryValueEx(cpuperfKey, perfKeys[0], NULL, &dataType, data, &dataLen);
        if (dataType == REG_BINARY) {
            sysInt = 0;
            value = data;
            userInt = *value;
        }
    }

    // user time defined as total - system
    userInt -= sysInt;

    idleInt = 100 - userInt - sysInt;

    user += userInt;
    sys += sysInt;
    idle += idleInt;
   
	gkrellm_cpu_assign_data(0, user, nice, sys, idle);
#endif
	}

gboolean
gkrellm_sys_cpu_init(void)
	{
#if !defined(USE_PDH)
    HKEY startPerf;
#else
    SYSTEM_INFO sysInfo;
    int i;
    TCHAR buf[50];
    TCHAR buf2[10];
#endif

    if (_GK.debug_level & DEBUG_SYSDEP)
        printf("Initializing CPU monitor.\n");

    gkrellm_cpu_nice_time_unsupported();

#if defined(USE_PDH)
    GetSystemInfo(&sysInfo);

    numCPUs = sysInfo.dwNumberOfProcessors;

    if (numCPUs < 1) {
        numCPUs = 1;
    }
    if (numCPUs > MAX_CPU) {
        numCPUs = MAX_CPU;
    }

    if (winVer > 0 && query != 0) {
        for (i = 0; i < numCPUs; i++) {
            _tcscpy(buf, perfKeys[11]);
            _itot(i, buf2, 10);
            _tcscat(buf, buf2);
            _tcscat(buf, perfKeys[0]);
            status = PdhAddCounter(query, buf, 0, &cpuUserCounter[i]);
            if (_GK.debug_level & DEBUG_SYSDEP)
                printf("Initialized cpu %i user portion (%s) with error code %i\n", i, buf, status);

            _tcscpy(buf, perfKeys[11]);
            _itot(i, buf2, 10);
            _tcscat(buf, buf2);
            _tcscat(buf, perfKeys[1]);
            status = PdhAddCounter(query, buf, 0, &cpuSysCounter[i]);
            if (_GK.debug_level & DEBUG_SYSDEP)
                printf("Initialized cpu %i system portion (%s) with error code %i\n", i, buf, status);
        }
    }
#else
    numCPUs = 1;
    if (_GK.debug_level & DEBUG_SYSDEP)
        printf("Initializing cpu (%s)\n", perfKeys[0]);
    if (RegOpenKey(HKEY_DYN_DATA, "PerfStats\\StartStat", &startPerf) == ERROR_SUCCESS) {
        // success
        dataLen = 8192;
        if (RegQueryValueEx(startPerf, perfKeys[0], NULL, &dataType, data, &dataLen) != ERROR_SUCCESS) {
            // failed
            if (_GK.debug_level & DEBUG_SYSDEP)
                printf("Initializing cpu failed.\n");
            cpuperfKey = 0;
        }
        else {
            if (RegOpenKey(HKEY_DYN_DATA, "PerfStats\\StatData", &cpuperfKey) != ERROR_SUCCESS) {
                // failed
                if (_GK.debug_level & DEBUG_SYSDEP)
                    printf("Initializing cpu failed.\n");
                cpuperfKey = 0;
            }
        }
        RegCloseKey(startPerf);
    }
    else {
        // failed
        if (_GK.debug_level & DEBUG_SYSDEP)
            printf("Initializing cpu failed.\n");
        cpuperfKey = 0;
    }
#endif

	gkrellm_cpu_set_number_of_cpus(numCPUs);

	return TRUE;
	}

void win32_sys_cpu_stop(void)
{
#if !defined(USE_PDH)
    HKEY startPerf;

    if (RegOpenKey(HKEY_DYN_DATA, "PerfStats\\StopStat", &startPerf) == ERROR_SUCCESS) {
        // success
        dataLen = 8192;
        RegQueryValueEx(startPerf, perfKeys[0], NULL, &dataType, data, &dataLen);
        cpuperfKey = 0;
        RegCloseKey(startPerf);
    }
#endif
}

/* ===================================================================== */
/* Net monitor interface */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?