⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win32.c

📁 系统任务管理器
💻 C
📖 第 1 页 / 共 5 页
字号:
/* ===================================================================== */


void gkrellm_sys_net_read_data(void)
{
	gint	i;
#if defined(USE_PDH)
    DWORD type;
    PDH_FMT_COUNTERVALUE value;
#else
    DWORD* value;
#endif

    win32_read_proc_stat();

#if defined(USE_PDH)
    if (winVer > 0 && query != 0) {
        for (i = 0; i < numAdapters; i++) {
            status = PdhGetFormattedCounterValue(netRecCounter[i], PDH_FMT_LONG, &type, &value);
            rx[i] += value.longValue / _GK.update_HZ;

            status = PdhGetFormattedCounterValue(netSendCounter[i], PDH_FMT_LONG, &type, &value);
            tx[i] += value.longValue / _GK.update_HZ;

            gkrellm_net_assign_data(netName[i], rx[i], tx[i]);
        }
    }
#else
    for (i = 0; i < numAdapters; i++) {
        rx[i] = 0;
        tx[i] = 0;
        if (netPerfKey[i] != 0) {
            dataLen = 8192;
            RegQueryValueEx(netPerfKey[i], perfKeys[4], NULL, &dataType, data, &dataLen);
            if (dataType == REG_BINARY) {
                value = data;
                rx[i] = *value;
            }
        }
        gkrellm_net_assign_data(netName[i], rx[i], tx[i]);
    }
#endif
}

void gkrellm_sys_net_check_routes(void)
{
}


gboolean gkrellm_sys_net_isdn_online(void)
{
	return FALSE;	/* ISDN is off line */
}

gboolean gkrellm_sys_net_init(void)
{
#if !defined(USE_PDH)
    HKEY startPerf;
#endif
    DWORD size = 0;
    DWORD isize = 0;
    LPTSTR objects = NULL;
    LPTSTR instances = NULL;
    LPTSTR instance = NULL;
    TCHAR buf[1024];
    int strSize;
    int i;
    int adapter = -1;

    // turn off for now
//	gkrellm_net_add_timer_type_ppp("ppp0");
//	gkrellm_net_add_timer_type_ippp("ippp0");

    numAdapters = 0;
    if (_GK.debug_level & DEBUG_SYSDEP)
        printf("Initializing network monitor.\n");

#if defined(USE_PDH)
    if (winVer > 0 && query != 0) {
        PdhEnumObjectItems(NULL, NULL, TEXT("Network Interface"), NULL, &size, NULL, &isize, PERF_DETAIL_WIZARD, 0);
        if (_GK.debug_level & DEBUG_SYSDEP) {
            printf("Found %i network objects and %i network instances.\n", size, isize);
        }
        if (size > 0) {
            ++isize;
            ++size;

            objects = (LPTSTR) malloc(sizeof(TCHAR) * size);
            instances = (LPTSTR) malloc(sizeof(TCHAR) * isize);

            PdhEnumObjectItems(NULL, NULL, TEXT("Network Interface"), objects, &size, instances, &isize, PERF_DETAIL_WIZARD, 0);
            if (_GK.debug_level & DEBUG_SYSDEP) {
                printf("Enumerated %i network objects and %i network instances.\n", size, isize);
            }

            for (instance = instances; *instance != 0; instance += lstrlen(instance) + 1) {
                ++adapter;
                if (adapter >= MAX_NET_ADAPTERS) {
                    if (_GK.debug_level & DEBUG_SYSDEP)
                        printf("Hit maximum number of network adapters.\n");
                    break;
                }

                strSize = MAX_NET_NAME;
                if (_tcslen(instance) < MAX_NET_NAME) {
                    strSize = _tcslen(instance);
                }

                for (i = 0; i < strSize; i++) {
                    if (instance[i] == _T(' ')) 
                        netName[adapter][i] = _T('_');
                    else
                        netName[adapter][i] = instance[i];
                }

                netName[adapter][strSize] = _T('\0');

                gkrellm_net_add_timer_type_ppp(netName[adapter]);

                _tcscpy(buf, perfKeys[5]);
                _tcscat(buf, instance);
                _tcscat(buf, perfKeys[6]);
                rx[adapter] = 0;
                status = PdhAddCounter(query, buf, 0, &(netRecCounter[adapter]));
                if (_GK.debug_level & DEBUG_SYSDEP)
                    printf("Added network receive for %s interface with status %i.\n", buf, status);

                _tcscpy(buf, perfKeys[5]);
                _tcscat(buf, instance);
                _tcscat(buf, perfKeys[7]);
                status = PdhAddCounter(query, buf, 0, &(netSendCounter[adapter]));
                tx[adapter] = 0;
                if (_GK.debug_level & DEBUG_SYSDEP)
                    printf("Added network transmit for %s interface with status %i.\n", buf, status);
            } 

            numAdapters = adapter + 1;
        }

        if (objects != NULL)
            free(objects);
        if (instances != NULL)
            free(instances);
    }
#else

    // need to enumerate these
    // and pick up names
    numAdapters = 0;
    if (_GK.debug_level & DEBUG_SYSDEP)
        printf("Initializing interface for %s with name of %s\n", perfKeys[4], perfKeys[5]);
    if (RegOpenKey(HKEY_DYN_DATA, "PerfStats\\StartStat", &startPerf) == ERROR_SUCCESS) {
        // success
        dataLen = 8192;
        if (RegQueryValueEx(startPerf, perfKeys[4], NULL, &dataType, data, &dataLen) != ERROR_SUCCESS) { 
            // failed
            netPerfKey[numAdapters] = 0;
            if (_GK.debug_level & DEBUG_SYSDEP)
                printf("Initizialization failed.\n");
        }
        else {
            if (RegOpenKey(HKEY_DYN_DATA, "PerfStats\\StatData", &(netPerfKey[numAdapters])) != ERROR_SUCCESS) {
                // failed
                netPerfKey[numAdapters] = 0;
                if (_GK.debug_level & DEBUG_SYSDEP)
                    printf("Initizialization failed.\n");
            }
            else {
                // success
                _tcscpy(netName[numAdapters], perfKeys[5]);
                gkrellm_net_add_timer_type_ppp(netName[numAdapters]);
                numAdapters = 1;
            }
        }
        RegCloseKey(startPerf);
    }
    else {
        // failed
        if (_GK.debug_level & DEBUG_SYSDEP)
            printf("Initizialization failed.\n");
        netPerfKey[0] = 0;
    }
#endif

    if (_GK.debug_level & DEBUG_SYSDEP)
        printf("Found %i interfaces for monitoring.\n", numAdapters);

    if (numAdapters == 0)
        return FALSE;
    else
        return TRUE;
	}

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

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

/* ===================================================================== */
/* Disk monitor interface */
/* ===================================================================== */

static gint numDisks = 0;
static long diskread[MAX_DISKS], diskwrite[MAX_DISKS];

gchar * gkrellm_sys_disk_name_from_device(gint device_number, gint unit_number,
			gint *order)
{
	static gchar name[32];

	sprintf(name, "Disk%s", diskName[device_number]);
	*order = device_number;
	return name;
}

gint gkrellm_sys_disk_order_from_name(gchar *name)
{
	return 0;	/* Disk by name not implemented in Windows */
}

void gkrellm_sys_disk_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)
    DWORD type;
    PDH_FMT_COUNTERVALUE value;
#else
    DWORD* value;
#endif
    double readInt = 0, writeInt = 0;
    int i;

    win32_read_proc_stat();

#if defined(USE_PDH)
    if (winVer > 0 && query != 0) {
        for (i = 0; i < numDisks; i++) {
            status = PdhGetFormattedCounterValue(diskReadCounter[i], PDH_FMT_DOUBLE, &type, &value);
            readInt = value.doubleValue / _GK.update_HZ;

            status = PdhGetFormattedCounterValue(diskWriteCounter[i], PDH_FMT_DOUBLE, &type, &value);
            writeInt = value.doubleValue / _GK.update_HZ;

            diskread[i] += readInt;
            diskwrite[i] += writeInt;

        }
    }
#else
    if (diskreadPerfKey != 0) {
        dataLen = 8192;
        RegQueryValueEx(diskreadPerfKey, perfKeys[2], NULL, &dataType, data, &dataLen);
        if (dataType == REG_BINARY) {
            value = data;
            readInt = *value;
        }
    }

    if (diskwritePerfKey != 0) {
        dataLen = 8192;
        RegQueryValueEx(diskwritePerfKey, perfKeys[3], NULL, &dataType, data, &dataLen);
        if (dataType == REG_BINARY) {
            value = data;
            writeInt = *value;
        }
    }

    // readInt & writeInt appear to be cumulative already
    diskread[0] = readInt;
    diskwrite[0] = writeInt;

#endif

	for (i = 0; i < numDisks; i++)
		{
//    		gkrellm_disk_assign_data_nth(i, diskread[i], diskwrite[i]);
    	    gkrellm_disk_assign_data_by_device(i, 0,						diskread[i], diskwrite[i], FALSE);
		}
	}

gboolean gkrellm_sys_disk_init(void)
	{
#if defined(USE_PDH)
    DWORD size = 0;
    DWORD isize = 0;
    LPTSTR objects = NULL;
    LPTSTR instances = NULL;
    LPTSTR instance = NULL;
    TCHAR buf[1024];
    int strSize;
    int i;
    int disk = -1;

    numDisks = 0;

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

    if (winVer > 0 && query != 0) {
        PdhEnumObjectItems(NULL, NULL, TEXT("PhysicalDisk"), NULL, &size, NULL, &isize, PERF_DETAIL_WIZARD, 0);
        if (size > 0) {
            ++isize;
            ++size;

            objects = (LPTSTR) malloc(sizeof(TCHAR) * size);
            instances = (LPTSTR) malloc(sizeof(TCHAR) * isize);

            PdhEnumObjectItems(NULL, NULL, TEXT("PhysicalDisk"), objects, &size, instances, &isize, PERF_DETAIL_WIZARD, 0);

            for (instance = instances; *instance != 0; instance += lstrlen(instance) + 1) {
                ++disk;
                if (disk >= MAX_DISKS)
                    break;

                strSize = MAX_DISK_NAME;
                if (_tcsclen(instance) < MAX_DISK_NAME) {
                    strSize = _tcsclen(instance);
                }

                for (i = 0; i < strSize; i++) {
                    if (instance[i] == _T(' ')) 
                        diskName[disk][i] = _T('_');
                    else
                        diskName[disk][i] = instance[i];
                }

                diskName[disk][strSize] = _T('\0');

                _tcscpy(buf, perfKeys[8]);
                _tcscat(buf, instance);
                _tcscat(buf, perfKeys[9]);
                status = PdhAddCounter(query, buf, 0, &(diskReadCounter[disk]));
                diskread[disk] = 0;
                if (_GK.debug_level & DEBUG_SYSDEP)
                    printf("Adding disk %s for read monitoring with status code %i\n", buf, status);

                _tcscpy(buf, perfKeys[8]);
                _tcscat(buf, instance);
                _tcscat(buf, perfKeys[10]);
                status = PdhAddCounter(query, buf, 0, &(diskWriteCounter[disk]));
                diskwrite[disk] = 0;
                if (_GK.debug_level & DEBUG_SYSDEP)
                    printf("Adding disk %s for write monitoring with status code %i\n", buf, status);
            }

            numDisks = disk + 1;
        }
        if (objects != NULL)
            free(objects);
        if (instances != NULL)
            free(instances);
    }
#else
    HKEY startPerf;

    numDisks = 0;
    if (_GK.debug_level & DEBUG_SYSDEP)
        printf("Initializing disk key %s for read monitoring\n", perfKeys[2]);

    if (RegOpenKey(HKEY_DYN_DATA, "PerfStats\\StartStat", &startPerf) == ERROR_SUCCESS) {
        // success
        dataLen = 8192;
        if (RegQueryValueEx(startPerf, perfKeys[2], NULL, &dataType, data, &dataLen) != ERROR_SUCCESS) {
            // failed
            if (_GK.debug_level & DEBUG_SYSDEP)
                printf("Initialization failed.\n");
            diskreadPerfKey = 0;
        }
        else {
            if (RegOpenKey(HKEY_DYN_DATA, "PerfStats\\StatData", &diskreadPerfKey) != ERROR_SUCCESS) {
                // failed
                if (_GK.debug_level & DEBUG_SYSDEP)
                    printf("Initialization failed.\n");
                diskreadPerfKey = 0;
            }
        }
        RegCloseKey(startPerf);
    }
    else {
        // failed
        if (_GK.debug_level & DEBUG_SYSDEP)
            printf("Initialization failed.\n");
        diskreadPerfKey = 0;
    }

    if (_GK.debug_level & DEBUG_SYSDEP)
        printf("Initializing disk key %s for write monitoring\n", perfKeys[3]);

    if (RegOpenKey(HKEY_DYN_DATA, "PerfStats\\StartStat", &startPerf) == ERROR_SUCCESS) {
        // success
        dataLen = 8192;
        if (RegQueryValueEx(startPerf, perfKeys[3], NULL, &dataType, data, &dataLen) != ERROR_SUCCESS) {
            // failed
            if (_GK.debug_level & DEBUG_SYSDEP)
                printf("Initialization failed.\n");
            diskwritePerfKey = 0;
        }
        else {
            if (RegOpenKey(HKEY_DYN_DATA, "PerfStats\\StatData", &diskwritePerfKey) != ERROR_SUCCESS) {
                // failed
                if (_GK.debug_level & DEBUG_SYSDEP)
                    printf("Initialization failed.\n");
                diskwritePerfKey = 0;
            }
            else {
                numDisks = 1;
                _tcscpy(diskName[0], _T("Total"));
            }
        }
        RegCloseKey(startPerf);
    }
    else {
        // failed
        if (_GK.debug_level & DEBUG_SYSDEP)
            printf("Initialization failed.\n");
        diskwritePerfKey = 0;
    }

⌨️ 快捷键说明

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