◆プロセスの時間情報を取得
2008年07月04日 11時25分00秒 | プロセス関連
プロセスに関する時間情報を取得するには GetProcessTimes() 関数を利用します。(戻る)

プロセスのハンドルを開く(OpenProcess)
プロセスの時間情報を取得(GetProcessTimes)
世界協定時刻からローカル時間に変換(FileTimeToLocalFileTime)
ファイル時刻からシステム時間に変換(FileTimeToSystemTime)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときに PROCESS_QUERY_INFORMATION アクセス権を割り当てる必要があります。

取得可能な時間情報

プロセスの作成時刻
プロセスの終了時刻
プロセスのカーネルモード動作時間
プロセスのユーザーモード動作時間
時間情報はすべて FILETIME 構造体に格納されます。

プロトタイプ宣言

HANDLE OpenProcess(
    DWORD       dwDesiredAccess,            // アクセス・フラグ
    BOOL        bInheritHandle,             // ハンドルの継承オプション
    DWORD       dwProcessId                 // プロセス識別子
);

BOOL CloseHandle(
    HANDLE      hObject                     // オブジェクトのハンドル
);

BOOL GetProcessTimes(
    HANDLE       hProcess,                  // プロセスのハンドル
    LPFILETIME  lpCreationTime,             // プロセスの作成時刻
    LPFILETIME  lpExitTime,                 // プロセスの終了時刻
    LPFILETIME  lpKernelTime,               // プロセスのカーネルモードでの動作時間
    LPFILETIME  lpUserTime                  // プロセスのユーザーモードでの動作時間
);

BOOL FileTimeToLocalFileTime(
    CONST FILETIME*     lpFileTime,         // 変更前の世界協定時刻(UTC)
    LPFILETIME          lpLocalFileTime     // 変換後のファイル時刻
);

BOOL FileTimeToSystemTime(
    CONST FILETIME*     lpFileTime,         // 変更前のファイル時刻
    LPSYSTEMTIME        lpSystemTime        // 変更後のシステム日時
);
構造体

typedef struct _FILETIME {
    DWORD   dwLowDateTime;      // ファイル時刻の下位32ビット
    DWORD   dwHighDateTime;     // ファイル時刻の上位32ビット
} FILETIME, *LPFILETIME;

typedef struct _SYSTEMTIME {
    WORD    wYear;              // 年
    WORD    wMonth;             // 月
    WORD    wDayOfWeek;         // 曜日
    WORD    wDay;               // 日
    WORD    wHour;              // 時
    WORD    wMinute;            // 分
    WORD    wSecond;            // 秒
    WORD    wMilliseconds;      // ミリ秒(1/1000)
} SYSTEMTIME, *LPSYSTEMTIME;
共用体

typedef union _ULARGE_INTEGER {
    struct {
        DWORD   LowPart;        // 符号なしの32ビット整数(下位)
        DWORD   HighPart;       // 符号なしの32ビット整数(上位)
    } u;
    ULONGLONG   QuadPart;       // 符号なしの64ビット整数
} ULARGE_INTEGER, *LPULARGE_INTEGER;
サンプル

#include 
#include 
#include 
#include       // Psapi.Lib

// ファイル時間から64ビット整数に変換
static ULONGLONG getTimeInt64( LPFILETIME ftTime )
{
    ULARGE_INTEGER u64Time;
    
    u64Time.u.LowPart  = ftTime->dwLowDateTime;
    u64Time.u.HighPart = ftTime->dwHighDateTime;
    return u64Time.QuadPart;
}

// ファイル時間の加算
static LPFILETIME addFileTime( LPFILETIME ftTime1, LPFILETIME ftTime2 )
{
    static FILETIME ftTime;
    ULARGE_INTEGER  u64Time1;
    ULARGE_INTEGER  u64Time2;
    
    // 1セット
    u64Time1.u.LowPart  = ftTime1->dwLowDateTime;
    u64Time1.u.HighPart = ftTime1->dwHighDateTime;
    // 2セット
    u64Time2.u.LowPart  = ftTime2->dwLowDateTime;
    u64Time2.u.HighPart = ftTime2->dwHighDateTime;
    // 加算
    u64Time1.QuadPart += u64Time2.QuadPart;
    // 変換
    ftTime.dwLowDateTime  = u64Time1.u.LowPart;
    ftTime.dwHighDateTime = u64Time1.u.HighPart;
    return &ftTime;
}

// ファイル時間から時間文字列に変換
static LPCTSTR getTimeString( LPTSTR lpBuff, LPFILETIME ftTime, BOOL bLocalTime )
{
    FILETIME    ltTime;
    SYSTEMTIME  stTime;
    
    if ( bLocalTime ){
        FileTimeToLocalFileTime( ftTime, <Time );
    }
    else{
        ltTime = *ftTime;
    }
    FileTimeToSystemTime( <Time, &stTime );
    wsprintf( lpBuff, TEXT("%04d/%02d/%02d(%.2s) %02d:%02d:%02d.%03d秒(%I64u)"),
        stTime.wYear,
        stTime.wMonth,
        stTime.wDay,
        &TEXT("日月火水木金土")[ stTime.wDayOfWeek * 2 ],
        stTime.wHour,
        stTime.wMinute,
        stTime.wSecond,
        stTime.wMilliseconds,
        getTimeInt64(ftTime)
        );
    return lpBuff;
}

// メイン関数
int main( int argc, char *argv[] )
{
    TCHAR       szBuff[ 1024 ];
    DWORD       dwProcessID = GetCurrentProcessId();
    HANDLE      hProcess;
    FILETIME    ftMakeTime;     // プロセスの作成時刻
    FILETIME    ftExitTime;     // プロセスの終了時刻
    FILETIME    ftKernTime;     // プロセスのカーネル動作時間
    FILETIME    ftUserTime;     // プロセスのユーザー動作時間
    
    if ( argc > 1 ){
        dwProcessID = atoi( argv[1] );
    }
    if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
        if ( GetProcessTimes(hProcess,&ftMakeTime,&ftExitTime,&ftKernTime,&ftUserTime) ){
            printf( TEXT("プロセスID                :%lu\n"),  dwProcessID );
            printf( TEXT("プロセス・ハンドル        :0x%p\n"), hProcess );
            printf( TEXT("プロセスの作成時刻        :%s\n"),   getTimeString(szBuff,&ftMakeTime,TRUE) );
            printf( TEXT("プロセスの終了時刻        :%s\n"),   getTimeString(szBuff,&ftExitTime,TRUE) );
            printf( TEXT("プロセスのカーネル動作時間:%s\n"),   getTimeString(szBuff,&ftKernTime,FALSE) );
            printf( TEXT("プロセスのユーザー動作時間:%s\n"),   getTimeString(szBuff,&ftUserTime,FALSE) );
            printf( TEXT("プロセスのトータル動作時間:%s\n"),   getTimeString(szBuff,addFileTime(&ftKernTime,&ftUserTime),FALSE) );
        }
        else{
            printf( TEXT("%lu:GetProcessTimes()関数のエラーです。\n"), GetLastError() );
        }
        CloseHandle( hProcess );
        return 0;
    }
    printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
    return 1;
}
ヘッダファイルとして Psapi.h をインクルードします。
インポートライブラリとして Psapi.Lib をリンクします。

◆プロセスのハンドル数を取得
2008年07月06日 13時32分00秒 | プロセス関連
プロセスのハンドル数を取得するにはGetProcessHandleCount()関数を利用します。(戻る)

プロセスのハンドルを開く(OpenProcess)
プロセスのハンドル数を取得(GetProcessHandleCount)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があります。

プロトタイプ宣言

HANDLE OpenProcess(
    DWORD   dwDesiredAccess,    // アクセス・フラグ
    BOOL    bInheritHandle,     // ハンドルの継承オプション
    DWORD   dwProcessId         // プロセス識別子
);

BOOL CloseHandle(
    HANDLE  hObject             // オブジェクトのハンドル
);

BOOL GetProcessHandleCount(
    HANDLE  hProcess,           // プロセスのハンドル
    PDWORD  pdwHandleCount      // ハンドル数へのポインタ
);
サンプル

#define _WIN32_WINNT    (0x0501)    // GetProcessHandleCount()
#include 
#include 
#include 

// メイン関数
int main( int argc, char *argv[] )
{
    DWORD dwProcessID = GetCurrentProcessId();
    HANDLE hProcess;
    DWORD dwHandle;
    
    if ( argc > 1 ){
        dwProcessID = atoi( argv[1] );
    }
    if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
        if ( GetProcessHandleCount(hProcess,&dwHandle) ){
            printf( TEXT("プロセスID:%lu\n"), dwProcessID );
            printf( TEXT("ハンドル数:%lu個\n"), dwHandle );
        }
        else{
            printf( TEXT("%lu:GetProcessHandleCount()関数のエラーです。\n"), GetLastError() );
        }
        CloseHandle( hProcess );
        return 0;
    }
    printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
    return 1;
}
GetProcessHandleCount()関数はWindows 2000以降でサポートされました。
それ以前のバージョンでは利用できません。

◆プロセスのメモリ情報を取得
2008年07月07日 15時55分00秒 | プロセス関連
プロセスのメモリ情報を取得するにはGetProcessMemoryInfo()関数を利用します。(戻る)

プロセスのハンドルを開く(OpenProcess)
プロセスのメモリ情報を取得(GetProcessMemoryInfo)
プロセスのハンドルを閉じる(CloseHandle)
取得可能なメモリ情報

ページ・フォールト数(ページ フォルト)
現在ワーキングセット(メモリ使用量)
最大ワーキングセット(最大メモリ使用量)
現在ページプールの使用サイズ(ページ プール)
最大ページプールの使用サイズ
現在非ページプールの使用サイズ(非ページ プール)
最大非ページプールの使用サイズ
現在ページングファイルの使用サイズ(仮想メモリ サイズ)
最大ページングファイルの使用サイズ
※カッコ内はタスクマネージャでの表現です。

プロトタイプ宣言

HANDLE OpenProcess(
    DWORD   dwDesiredAccess,    // アクセス・フラグ
    BOOL    bInheritHandle,     // ハンドルの継承オプション
    DWORD   dwProcessId         // プロセス識別子
);

BOOL CloseHandle(
    HANDLE  hObject             // オブジェクトのハンドル
);

BOOL GetProcessMemoryInfo(
    HANDLE                      Process,            // プロセスのハンドル
    PPROCESS_MEMORY_COUNTERS ppsmemCounters,     // 構造体のポインタ
    DWORD                       cb                  // 構造体のサイズ
);
構造体

typedef struct _PROCESS_MEMORY_COUNTERS {
    DWORD   cb;                             // 構造体のサイズ
    DWORD   PageFaultCount;                 // ページ・フォールト数
    SIZE_T  PeakWorkingSetSize;             // 最大ワーキングセット
    SIZE_T  WorkingSetSize;                 // 現在ワーキングセット
    SIZE_T  QuotaPeakPagedPoolUsage;        // 最大ページプールの使用サイズ
    SIZE_T  QuotaPagedPoolUsage;            // 現在ページプールの使用サイズ
    SIZE_T  QuotaPeakNonPagedPoolUsage;     // 最大非ページプールの使用サイズ
    SIZE_T  QuotaNonPagedPoolUsage;         // 現在非ページプールの使用サイズ
    SIZE_T  PagefileUsage;                  // 現在ページングファイルの使用サイズ
    SIZE_T  PeakPagefileUsage;              // 最大ページングファイルの使用サイズ
} PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS;
サンプル

#include 
#include 
#include 
#include       // Psapi.Lib

// マクロ関数
#define DISP_PARAM(n)    (n), ((n) / 1024)

// メイン関数
int main( int argc, char *argv[] )
{
    PROCESS_MEMORY_COUNTERS pmc = { 0 };
    DWORD dwProcessID = GetCurrentProcessId();
    HANDLE hProcess;
    
    if ( argc > 1 ){
        dwProcessID = atoi( argv[1] );
    }
    if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
        if ( GetProcessMemoryInfo(hProcess,&pmc,sizeof(pmc)) ){
            printf( TEXT("プロセスID                        :%lu\n"), dwProcessID );
            printf( TEXT("プロセス・ハンドル                :0x%p\n"), hProcess );
            printf( TEXT("ページフォールト数                :%10lu個\n"),             pmc.PageFaultCount );
            printf( TEXT("最大ワーキングセットのサイズ      :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.PeakWorkingSetSize) );
            printf( TEXT("現在ワーキングセットのサイズ      :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.WorkingSetSize) );
            printf( TEXT("最大ページプールの使用サイズ      :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaPeakPagedPoolUsage) );
            printf( TEXT("現在ページプールの使用サイズ      :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaPagedPoolUsage) );
            printf( TEXT("最大非ページプールの使用サイズ    :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaPeakNonPagedPoolUsage) );
            printf( TEXT("現在非ページプールの使用サイズ    :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaNonPagedPoolUsage) );
            printf( TEXT("最大ページングファイルの使用サイズ:%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.PeakPagefileUsage) );
            printf( TEXT("現在ページングファイルの使用サイズ:%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.PagefileUsage) );
        }
        else{
            printf( TEXT("%lu:GetProcessMemoryInfo()関数のエラーです。\n"), GetLastError() );
        }
        CloseHandle( hProcess );
        return 0;
    }
    printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
    return 1;
}
ヘッダファイルとしてPsapi.hをインクルードします。
インポートライブラリとしてPsapi.Libをリンクします。


◆プロセスのメモリ・ページ情報を取得
2008年07月15日 10時50分00秒 | プロセス関連
プロセスのワーキングセット内のメモリ・ページ情報を取得します。
取得するにはQueryWorkingSet()関数を利用します。(戻る)

プロセスのハンドルを開く(OpenProcess)
プロセスのメモリ・ページ情報を取得(QueryWorkingSet)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があります。

バッファ内容について

DWORD型の最初の要素は、有効なメモリ・ページ情報の個数
DWORD型の2番目からは、有効なメモリ・ページ情報の配列
メモリ・ページ情報の構造

上位20ビットがメモリ・ページのアドレスを保持
下位12ビットはメモリ・ページのフラグ情報
フラグ情報の意味

0x001:このページは読み取り専用
0x002:このページは実行可能
0x004:このページは読み書き可能
0x005:このページは書き込み時コピー
0x100:このページは共有アクセス可能(複数のプロセス間での共有)
0x001、0x004、0x005はどれか1つの状態です。

プロトタイプ宣言

HANDLE OpenProcess(
    DWORD   dwDesiredAccess,    // アクセス・フラグ
    BOOL    bInheritHandle,     // ハンドルの継承オプション
    DWORD   dwProcessId         // プロセス識別子
);

BOOL CloseHandle(
    HANDLE  hObject             // オブジェクトのハンドル
);

BOOL QueryWorkingSet(
    HANDLE  hProcess,           // プロセスのハンドル
    PVOID   pv,                 // 情報を受け取るバッファ
    DWORD   cb                  // バッファのサイズ
);
サンプル

#include 
#include 
#include 
#include       // Psapi.Lib

// break付きのキーワード
#define CASE        break;case
#define DEFAULT     break;default

// メイン関数
int main( int argc, char *argv[] )
{
    DWORD dwQuery[ 1024 ];
    DWORD dwProcessID = GetCurrentProcessId();
    HANDLE hProcess;
    
    if ( argc > 1 ){
        dwProcessID = atoi( argv[1] );
    }
    if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
        if ( QueryWorkingSet(hProcess,dwQuery,sizeof(dwQuery)) ){
            LPDWORD lpData = &dwQuery[1];
            LPDWORD lpStop = &dwQuery[1] + dwQuery[0];
            
            while ( lpData < lpStop ){
                DWORD dwAddress = (*lpData & 0xFFFFF000);   // 上位20Bit
                DWORD dwAttrib  = (*lpData & 0x00000FFF);   // 下位12Bit
                
                printf( TEXT("0x%08X(0x%03X)⇒0x%08Xアドレスのページは、"), *lpData, dwAttrib, dwAddress );
                switch ( dwAttrib & 0x005 ){
                    CASE 0x001:     printf( TEXT("読み取り専用") );
                    CASE 0x004:     printf( TEXT("読み書き") );
                    CASE 0x005:     printf( TEXT("読み書き時コピー") );
                    DEFAULT:        printf( TEXT("不明") );
                }
                if ( dwAttrib & 0x002 ){
                    printf( TEXT("、実行可能") );
                }
                if ( dwAttrib & 0x100 ){
                    printf( TEXT("、共有アクセス可能") );
                }
                else{
                    printf( TEXT("、アクセス可能") );
                }
                printf( TEXT("です。\n") );
                lpData++;
            }
        }
        else{
            printf( TEXT("%lu:QueryWorkingSet()関数のエラーです。\n"), GetLastError() );
        }
        CloseHandle( hProcess );
        return 0;
    }
    printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
    return 1;
}
ヘッダファイルとしてPsapi.hをインクルードします。
インポートライブラリとしてPsapi.Libをリンクします。

◆プロセスの最大/最小ワーキングセットを取得
2008年07月11日 15時22分00秒 | プロセス関連
プロセスの最大/最小ワーキングセットを取得するにはGetProcessWorkingSetSize()関数を利用します。
プロセスの『ワーキングセット』とは、プロセスが利用しているメモリでページ・フォールトを起こさずに常に使える物理メモリのことです。
詳しくはMSDNサイトや仮想メモリ、メモリページで独自に調べてみて下さい。(戻る)

プロセスのハンドルを開く(OpenProcess)
プロセスの優先順位クラスを取得(GetProcessWorkingSetSize)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があります。

プロトタイプ宣言

HANDLE OpenProcess(
    DWORD   dwDesiredAccess,            // アクセス・フラグ
    BOOL    bInheritHandle,             // ハンドルの継承オプション
    DWORD   dwProcessId                 // プロセス識別子
);

BOOL CloseHandle(
    HANDLE  hObject                     // オブジェクトのハンドル
);

BOOL GetProcessWorkingSetSize(
    HANDLE  hProcess,                   // プロセスのハンドル
    LPDWORD lpMinimumWorkingSetSize,    // 最小ワーキングセットへのポインタ
    LPDWORD lpMaximumWorkingSetSize     // 最大ワーキングセットへのポインタ
);
サンプル

#include 
#include 
#include 

// メイン関数
int main( int argc, char *argv[] )
{
    HANDLE hProcess;
    DWORD dwProcessID = GetCurrentProcessId();
    DWORD dwMin;
    DWORD dwMax;
    
    if ( argc > 1 ){
        dwProcessID = atoi( argv[1] );
    }
    if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
        if ( GetProcessWorkingSetSize(hProcess,&dwMin,&dwMax) ){
            printf( TEXT("プロセスID                  :%lu\n"), dwProcessID );
            printf( TEXT("プロセス・ハンドル          :0x%p\n"), hProcess );
            printf( TEXT("最小のワーキングセットサイズ:%10luバイト(%lu KB)\n"), dwMin, (dwMin / 1024) );
            printf( TEXT("最大のワーキングセットサイズ:%10luバイト(%lu KB)\n"), dwMax, (dwMax / 1024) );
        }
        else{
            printf( TEXT("%lu:GetProcessWorkingSetSize()関数のエラーです。\n"), GetLastError() );
        }
        CloseHandle( hProcess );
        return 0;
    }
    printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
    return 1;
}
プロセスの最大/最小ワーキングセットはSetProcessWorkingSetSize()関数で設定することが出来ます。


◆プロセスのワーキングセットを最小化
2008年07月12日 20時52分00秒 | プロセス関連
プロセスのワーキングセットをできるだけ減らして最小化します。
最小化するにはEmptyWorkingSet()関数、またはSetProcessWorkingSetSize()関数を利用します。(戻る)

プロセスのハンドルを開く(OpenProcess)
プロセスのワーキングセットを最小化(EmptyWorkingSet)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときにPROCESS_QUERY_INFORMATIONとPROCESS_SET_QUOTAの2つのアクセス権を割り当てる必要があります。

プロトタイプ宣言

HANDLE OpenProcess(
    DWORD   dwDesiredAccess,    // アクセス・フラグ
    BOOL    bInheritHandle,     // ハンドルの継承オプション
    DWORD   dwProcessId         // プロセス識別子
);

BOOL CloseHandle(
    HANDLE  hObject             // オブジェクトのハンドル
);

BOOL EmptyWorkingSet(
    HANDLE      hProcess        // プロセスのハンドル
);
サンプル

#include 
#include 
#include 
#include       // Psapi.Lib

// メイン関数
int main( int argc, char *argv[] )
{
    DWORD dwAccess = (PROCESS_QUERY_INFORMATION | PROCESS_SET_QUOTA);
    DWORD dwProcessID = GetCurrentProcessId();
    HANDLE hProcess;
    
    if ( argc > 1 ){
        dwProcessID = atoi( argv[1] );
    }
    if ( (hProcess = OpenProcess(dwAccess,FALSE,dwProcessID)) != NULL ){
//      if ( SetProcessWorkingSetSize(hProcess,0xFFFFFFFF,0xFFFFFFFF) ){
        if ( EmptyWorkingSet(hProcess) ){
            printf( TEXT("指定プロセスのワーキングセットを最小化しました。\n") );
        }
        else{
            printf( TEXT("%lu:EmptyWorkingSet()関数のエラーです。\n"), GetLastError() );
        }
        CloseHandle( hProcess );
        return 0;
    }
    printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
    return 1;
}
ヘッダファイルとしてPsapi.hをインクルードします。
インポートライブラリとしてPsapi.Libをリンクします。
不必要にプロセスのワーニングセットを最小化するとパフォーマンスが低下することがあります。


◆プロセスの優先順位クラスを取得
2008年07月03日 10時26分00秒 | プロセス関連
プロセスの優先順位クラスを取得するにはGetPriorityClass()関数を利用します。(戻る)

プロセスのハンドルを開く(OpenProcess)
プロセスの優先順位クラスを取得(GetPriorityClass)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があります。

定数

定数	意味
REALTIME_PRIORITY_CLASS	リアルタイム(R)
HIGH_PRIORITY_CLASS	高(H)
ABOVE_NORMAL_PRIORITY_CLASS	通常以上(A)
NORMAL_PRIORITY_CLASS	通常(N)
BELOW_NORMAL_PRIORITY_CLASS	通常以下(B)
IDLE_PRIORITY_CLASS	底(L)
日本語の表記はタスクマネージャの『優先度の設定(P)』と同じにしています。

プロトタイプ宣言

HANDLE OpenProcess(
    DWORD   dwDesiredAccess,    // アクセス・フラグ
    BOOL    bInheritHandle,     // ハンドルの継承オプション
    DWORD   dwProcessId         // プロセス識別子
);

BOOL CloseHandle(
    HANDLE  hObject             // オブジェクトのハンドル
);

DWORD GetPriorityClass(
    HANDLE  hProcess            // プロセスのハンドル
);
サンプル

#include 
#include 
#include 

// break付きのキーワード
#define CASE        break;case
#define DEFAULT     break;default

// メイン関数
int main( int argc, char *argv[] )
{
    DWORD  dwProcessID = GetCurrentProcessId();
    HANDLE  hProcess;
    LPTSTR lpMsg;
    
    if ( argc > 1 ){
        dwProcessID = atoi( argv[1] );
    }
    if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
        switch ( GetPriorityClass(hProcess) ){
            CASE REALTIME_PRIORITY_CLASS:       lpMsg = TEXT("REALTIME_PRIORITY_CLASS『リアルタイム(R)』");
            CASE HIGH_PRIORITY_CLASS:           lpMsg = TEXT("HIGH_PRIORITY_CLASS『高(H)』");
            CASE ABOVE_NORMAL_PRIORITY_CLASS:   lpMsg = TEXT("ABOVE_NORMAL_PRIORITY_CLASS『通常以上(A)』");
            CASE NORMAL_PRIORITY_CLASS:         lpMsg = TEXT("NORMAL_PRIORITY_CLASS『通常(N)』");
            CASE BELOW_NORMAL_PRIORITY_CLASS:   lpMsg = TEXT("BELOW_NORMAL_PRIORITY_CLASS『通常以下(B)』");
            CASE IDLE_PRIORITY_CLASS:           lpMsg = TEXT("IDLE_PRIORITY_CLASS『底(L)』");
            DEFAULT:                            lpMsg = TEXT("open error");
        }
        printf( TEXT("プロセスID        :%lu\n"), dwProcessID );
        printf( TEXT("プロセス・ハンドル:0x%p\n"), hProcess );
        printf( TEXT("プロセスの優先順位:%s\n"), lpMsg );
        CloseHandle( hProcess );
        return 0;
    }
    printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
    return 1;
}