Groups |  |
| Advanced Groups Search Preferences Groups Help

Groups search result 4 for system idle cpu usage api

Disk usage monitor • Software monitors disk space usage across LAN/WAN devices. Free trial. • www.rakersoft.com | Sponsored Links

Search Result 4
From: -Jm- (john-markNOjoSPAM@pattersongray.com.invalid) Subject: Re: NtQuerySystemInformation API Call
View: Complete Thread (10 articles)
Original Format
Newsgroups: microsoft.public.vb.winapi Date: 2000/07/11

    Your probably right about the variant, but I didn't know how to
    translate a PVOID, probably should be LONG.  Anyway, here's the
    C++ code for a program that extracts the CPU usage from the
    system using this NtQuerySystemInformation API.

    #include <windows.h>
    #include <conio.h>
    #include <stdio.h>

    #define SystemBasicInformation       0
    #define SystemPerformanceInformation 2
    #define SystemTimeInformation        3

    #define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 +
    (double)((x).LowPart))

    typedef struct
    {
        DWORD   dwUnknown1;
        ULONG   uKeMaximumIncrement;
        ULONG   uPageSize;
        ULONG   uMmNumberOfPhysicalPages;
        ULONG   uMmLowestPhysicalPage;
        ULONG   uMmHighestPhysicalPage;
        ULONG   uAllocationGranularity;
        PVOID   pLowestUserAddress;
        PVOID   pMmHighestUserAddress;
        ULONG   uKeActiveProcessors;
        BYTE    bKeNumberProcessors;
        BYTE    bUnknown2;
        WORD    wUnknown3;
    } SYSTEM_BASIC_INFORMATION;

    typedef struct
    {
        LARGE_INTEGER   liIdleTime;
        DWORD           dwSpare[76];
    } SYSTEM_PERFORMANCE_INFORMATION;

    typedef struct
    {
        LARGE_INTEGER liKeBootTime;
        LARGE_INTEGER liKeSystemTime;
        LARGE_INTEGER liExpTimeZoneBias;
        ULONG         uCurrentTimeZoneId;
        DWORD         dwReserved;
    } SYSTEM_TIME_INFORMATION;

    // ntdll!NtQuerySystemInformation (NT specific!)
    //
    // The function copies the system information of the
    // specified type into a buffer
    //
    // NTSYSAPI
    // NTSTATUS
    // NTAPI
    // NtQuerySystemInformation(
    //    IN UINT SystemInformationClass,    // information type
    //    OUT PVOID SystemInformation,       // pointer to buffer
    //    IN ULONG SystemInformationLength,  // buffer size in bytes
    //    OUT PULONG ReturnLength OPTIONAL   // pointer to a 32-bit
    //                                       // variable that
    receives
    //                                       // the number of bytes
    //                                       // written to the
    buffer
    // );
    typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);

    PROCNTQSI NtQuerySystemInformation;

    void main(void)
    {
        SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
        SYSTEM_TIME_INFORMATION        SysTimeInfo;
        SYSTEM_BASIC_INFORMATION       SysBaseInfo;
        double                         dbIdleTime;
        double                         dbSystemTime;
        LONG                           status;
        LARGE_INTEGER                  liOldIdleTime = {0,0};
        LARGE_INTEGER                  liOldSystemTime = {0,0};

        NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
                                              GetModuleHandle
    ("ntdll"),
                                             "NtQuerySystemInformatio
    n"
                                             );

        if (!NtQuerySystemInformation)
            return;

        // get number of processors in the system
        status = NtQuerySystemInformation
    (SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
        if (status != NO_ERROR)
            return;

     printf("\nCPU Usage (press any key to exit):    ");
        while(!_kbhit())
        {
            // get new system time
         status = NtQuerySystemInformation
    (SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
            if (status!=NO_ERROR)
                return;

            // get new CPU's idle time
            status = NtQuerySystemInformation
    (SystemPerformanceInformation,&SysPerfInfo,sizeof
    (SysPerfInfo),NULL);
            if (status != NO_ERROR)
                return;

            // if it's a first call - skip it
           if (liOldIdleTime.QuadPart != 0)
           {
                // CurrentValue = NewValue - OldValue
                dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) -
    Li2Double(liOldIdleTime);
                dbSystemTime = Li2Double
    (SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);

                // CurrentCpuIdle = IdleTime / SystemTime
                dbIdleTime = dbIdleTime / dbSystemTime;

                // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) /
    NumberOfProcessors
                dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)
    SysBaseInfo.bKeNumberProcessors + 0.5;

                printf("\b\b\b\b%3d%%",(UINT)dbIdleTime);
           }

            // store new CPU's idle and system time
            liOldIdleTime = SysPerfInfo.liIdleTime;
            liOldSystemTime = SysTimeInfo.liKeSystemTime;

            // wait one second
            Sleep(1000);
        } printf("\n");
    }

    If someone could help translate just the actual
    NtQuerySystemInformation API to VBasic 5.0 I'd be greatly
    indebted.  I think the main problem to worry about is that the
    NTDLL.DLL isn't available to applications (at least I've
    heard).  I think this is why the author of the above code chose
    to use the GetProcAddress() function to get the handle of the
    DLL for the call.  I don't know how this would translate to VB,
    but I do know that just when I think something can't be done in
    VB, I figure it out and it works.

    Thanks
    Jm

    -----------------------------------------------------------

    Got questions?  Get answers over the phone at Keen.com.
    Up to 100 minutes free!
    http://www.keen.com

Google Home - Advertise with Us - Business Solutions - Services & Tools - Jobs, Press, & Help

©2003 Google