Win32 API 日本語リファレンス
ホームSystem.JobObjects › JOBOBJECT_BASIC_LIMIT_INFORMATION

JOBOBJECT_BASIC_LIMIT_INFORMATION

構造体
サイズx64: 64 バイト / x86: 48 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
PerProcessUserTimeLimitLONGLONG8+0+0

LimitFlagsJOB_OBJECT_LIMIT_PROCESS_TIME が指定されている場合、このメンバーはプロセスごとのユーザーモード実行時間の制限(100 ナノ秒単位のティック)です。それ以外の場合、このメンバーは無視されます。

システムは、ジョブに関連付けられた各プロセスが設定された制限を超えるユーザーモード時間を累積していないかを定期的にチェックします。超えている場合、そのプロセスは終了されます。

ジョブが入れ子になっている場合、有効な制限はジョブ チェーン内で最も厳しい制限になります。

PerJobUserTimeLimitLONGLONG8+8+8

LimitFlagsJOB_OBJECT_LIMIT_JOB_TIME が指定されている場合、このメンバーはジョブごとのユーザーモード実行時間の制限(100 ナノ秒単位のティック)です。それ以外の場合、このメンバーは無視されます。

システムは、ジョブに関連付けられたプロセスの現在の時間をこの制限に加算します。たとえば、この制限を 1 分に設定し、ジョブに 5 分のユーザーモード時間を累積したプロセスがある場合、実際に適用される制限は 6 分になります。

システムは、すべてのプロセスのユーザーモード実行時間の合計がこのジョブ終了時の制限を超えていないかを定期的にチェックします。超えている場合、 JOBOBJECT_END_OF_JOB_TIME_INFORMATION 構造体の EndOfJobTimeAction メンバーで指定されたアクションが実行されます。既定では、すべてのプロセスが終了され、ステータス コードは ERROR_NOT_ENOUGH_QUOTA に設定されます。

プロセスを終了させずにこの制限の超過時に通知を受け取るように登録するには、SetInformationJobObject 関数を JobObjectNotificationLimitInformation 情報クラスと共に使用します。

LimitFlagsJOB_OBJECT_LIMIT4+16+16

有効になっている制限フラグです。このメンバーは、他の構造体メンバーが使用されるかどうかを決定するビットフィールドです。以下の値の任意の組み合わせを指定できます。

意味
JOB_OBJECT_LIMIT_ACTIVE_PROCESS
0x00000008
ジョブに関連付けられた同時にアクティブなプロセスの最大数を設定します。ActiveProcessLimit メンバーに追加情報が含まれます。
JOB_OBJECT_LIMIT_AFFINITY
0x00000010
ジョブに関連付けられたすべてのプロセスに、同じプロセッサ アフィニティを使用させます。Affinity メンバーに追加情報が含まれます。

ジョブが入れ子になっている場合、指定するプロセッサ アフィニティは親ジョブの有効なアフィニティのサブセットでなければなりません。指定したアフィニティが親ジョブのアフィニティのスーパーセットである場合、それは無視され、親ジョブのアフィニティが使用されます。

JOB_OBJECT_LIMIT_BREAKAWAY_OK
0x00000800
この制限が有効な間に、ジョブに関連付けられたプロセスが CREATE_BREAKAWAY_FROM_JOB フラグを使用して子プロセスを作成した場合、その子プロセスはジョブに関連付けられません。

この制限を使用するには、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体が必要です。その BasicLimitInformation メンバーは JOBOBJECT_BASIC_LIMIT_INFORMATION 構造体です。

JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION
0x00000400
ジョブに関連付けられた各プロセスに対して、SEM_NOGPFAULTERRORBOX フラグを指定した SetErrorMode 関数の呼び出しを強制します。

例外が発生し、システムが UnhandledExceptionFilter 関数を呼び出すと、デバッガーに処理の機会が与えられます。デバッガーが存在しない場合、この関数は EXCEPTION_EXECUTE_HANDLER を返します。通常、これにより例外コードを終了ステータスとしてプロセスが終了します。

この制限を使用するには、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体が必要です。その BasicLimitInformation メンバーは JOBOBJECT_BASIC_LIMIT_INFORMATION 構造体です。

JOB_OBJECT_LIMIT_JOB_MEMORY
0x00000200
ジョブに関連付けられたすべてのプロセスに対し、コミット済みメモリのジョブ全体での合計を制限します。プロセスがジョブ全体の制限を超えるメモリをコミットしようとすると、失敗します。ジョブ オブジェクトが完了ポートに関連付けられている場合、JOB_OBJECT_MSG_JOB_MEMORY_LIMIT メッセージが完了ポートに送信されます。

この制限を使用するには、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体が必要です。その BasicLimitInformation メンバーは JOBOBJECT_BASIC_LIMIT_INFORMATION 構造体です。

プロセスがメモリのコミットを継続できるようにしたまま、この制限の超過時に通知を受け取るように登録するには、SetInformationJobObject 関数を JobObjectNotificationLimitInformation 情報クラスと共に使用します。

JOB_OBJECT_LIMIT_JOB_TIME
0x00000004
ジョブに対するユーザーモード実行時間の制限を設定します。PerJobUserTimeLimit メンバーに追加情報が含まれます。このフラグは JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME と併用できません。
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
0x00002000
ジョブへの最後のハンドルが閉じられたときに、ジョブに関連付けられたすべてのプロセスを終了させます。

この制限を使用するには、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体が必要です。その BasicLimitInformation メンバーは JOBOBJECT_BASIC_LIMIT_INFORMATION 構造体です。

JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME
0x00000040
以前に設定したジョブ時間制限を保持します。このフラグが設定されている限り、ジョブごとの時間制限を一度設定した後、以降の呼び出しで他の制限を変更できます。このフラグは JOB_OBJECT_LIMIT_JOB_TIME と併用できません。
JOB_OBJECT_LIMIT_PRIORITY_CLASS
0x00000020
ジョブに関連付けられたすべてのプロセスに、同じ優先度クラスを使用させます。詳細については、 Scheduling Priorities を参照してください。PriorityClass メンバーに追加情報が含まれます。

ジョブが入れ子になっている場合、有効な優先度クラスはジョブ チェーン内で最も低い優先度クラスになります。

JOB_OBJECT_LIMIT_PROCESS_MEMORY
0x00000100
ジョブに関連付けられたすべてのプロセスに対し、コミット済みメモリを制限します。プロセスがプロセスごとの制限を超えるメモリをコミットしようとすると、失敗します。ジョブ オブジェクトが完了ポートに関連付けられている場合、JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT メッセージが完了ポートに送信されます。

ジョブが入れ子になっている場合、有効なメモリ制限はジョブ チェーン内で最も厳しいメモリ制限になります。

この制限を使用するには、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体が必要です。その BasicLimitInformation メンバーは JOBOBJECT_BASIC_LIMIT_INFORMATION 構造体です。

JOB_OBJECT_LIMIT_PROCESS_TIME
0x00000002
現在アクティブな各プロセス、およびジョブに今後関連付けられるすべてのプロセスに対して、ユーザーモード実行時間の制限を設定します。PerProcessUserTimeLimit メンバーに追加情報が含まれます。
JOB_OBJECT_LIMIT_SCHEDULING_CLASS
0x00000080
ジョブ内のすべてのプロセスに、同じスケジューリング クラスを使用させます。SchedulingClass メンバーに追加情報が含まれます。

ジョブが入れ子になっている場合、有効なスケジューリング クラスはジョブ チェーン内で最も低いスケジューリング クラスになります。

JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK
0x00001000
ジョブに関連付けられた任意のプロセスが、ジョブに関連付けられない子プロセスを作成できるようにします。

ジョブが入れ子になっており、直接のジョブ オブジェクトがブレークアウェイを許可している場合、子プロセスは直接のジョブ オブジェクトおよび親ジョブ チェーン内の各ジョブから分離し、ブレークアウェイを許可しないジョブに達するまで階層を上っていきます。直接のジョブ オブジェクトがブレークアウェイを許可していない場合、親ジョブ チェーン内のジョブが許可していても、子プロセスは分離しません。

この制限を使用するには、 JOBOBJECT_EXTENDED_LIMIT_INFORMATION 構造体が必要です。その BasicLimitInformation メンバーは JOBOBJECT_BASIC_LIMIT_INFORMATION 構造体です。

JOB_OBJECT_LIMIT_SUBSET_AFFINITY
0x00004000
ジョブに関連付けられたすべてのプロセスに対するプロセッサ アフィニティのサブセットを、プロセスが使用できるようにします。この値は JOB_OBJECT_LIMIT_AFFINITY と組み合わせて指定しなければなりません。

Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: このフラグは Windows 7 および Windows Server 2008 R2 以降でサポートされます。

JOB_OBJECT_LIMIT_WORKINGSET
0x00000001
ジョブに関連付けられたすべてのプロセスに、同じ最小および最大ワーキング セット サイズを使用させます。MinimumWorkingSetSize および MaximumWorkingSetSize メンバーに追加情報が含まれます。

ジョブが入れ子になっている場合、有効なワーキング セット サイズはジョブ チェーン内で最小のワーキング セット サイズになります。

MinimumWorkingSetSizeUINT_PTR8/4+24+20

LimitFlagsJOB_OBJECT_LIMIT_WORKINGSET が指定されている場合、このメンバーはジョブに関連付けられた各プロセスの最小ワーキング セット サイズ(バイト単位)です。それ以外の場合、このメンバーは無視されます。

MaximumWorkingSetSize が 0 以外の場合、MinimumWorkingSetSize を 0 にすることはできません。

MaximumWorkingSetSizeUINT_PTR8/4+32+24

LimitFlagsJOB_OBJECT_LIMIT_WORKINGSET が指定されている場合、このメンバーはジョブに関連付けられた各プロセスの最大ワーキング セット サイズ(バイト単位)です。それ以外の場合、このメンバーは無視されます。

MinimumWorkingSetSize が 0 以外の場合、MaximumWorkingSetSize を 0 にすることはできません。

ActiveProcessLimitDWORD4+40+28

LimitFlagsJOB_OBJECT_LIMIT_ACTIVE_PROCESS が指定されている場合、このメンバーはジョブのアクティブ プロセス数の制限です。それ以外の場合、このメンバーは無視されます。

プロセスをジョブに関連付けようとした結果、アクティブ プロセス数がこの制限を超える場合、そのプロセスは終了され、関連付けは失敗します。

AffinityUINT_PTR8/4+48+32

LimitFlagsJOB_OBJECT_LIMIT_AFFINITY が指定されている場合、このメンバーはジョブに関連付けられたすべてのプロセスのプロセッサ アフィニティです。それ以外の場合、このメンバーは無視されます。

アフィニティは、 GetProcessAffinityMask 関数の呼び出しによって取得されるシステム アフィニティ マスクのサブセットでなければなりません。各スレッドのアフィニティはこの値に設定されますが、指定したアフィニティ マスクのサブセットである限り、スレッドはその後自由に自身のアフィニティを設定できます。プロセスは自身のアフィニティ マスクを設定できません。

PriorityClassDWORD4+56+36

LimitFlagsJOB_OBJECT_LIMIT_PRIORITY_CLASS が指定されている場合、このメンバーはジョブに関連付けられたすべてのプロセスの優先度クラスです。それ以外の場合、このメンバーは無視されます。

プロセスおよびスレッドは自身の優先度クラスを変更できません。呼び出し元プロセスは SE_INC_BASE_PRIORITY_NAME 特権を有効にする必要があります。

SchedulingClassDWORD4+60+40

LimitFlagsJOB_OBJECT_LIMIT_SCHEDULING_CLASS が指定されている場合、このメンバーはジョブに関連付けられたすべてのプロセスのスケジューリング クラスです。それ以外の場合、このメンバーは無視されます。

有効な値は 0 ~ 9 です。他のスレッドと比べて最も不利なスケジューリング クラスには 0 を、最も有利なスケジューリング クラスには 9 を使用します。既定値は 5 です。5 より大きいスケジューリング クラスを使用するには、呼び出し元プロセスが SE_INC_BASE_PRIORITY_NAME 特権を有効にする必要があります。

公式ドキュメント

ジョブ オブジェクトの基本的な制限情報を格納します。

解説(Remarks)

JOB_OBJECT_LIMIT_WORKINGSET が使用されている場合でも、プロセスは SetProcessWorkingSetSize 関数に (SIZE_T)-1 を指定して自身のワーキング セットを空にすることができます。ただし、SetProcessWorkingSetSize を使用して、ジョブ オブジェクト内のプロセスの最小または最大ワーキング セット サイズを変更することはできません。

システムは、プロセスをジョブに関連付けようとしたときにアクティブ プロセス数をインクリメントします。制限を超えた場合、システムは、プロセスが終了し、かつそのプロセスへのすべてのハンドルが閉じられたときにのみ、アクティブ プロセス数をデクリメントします。そのため、このようにして終了したプロセスへのハンドルを開いたままにしていると、そのハンドルが閉じられてアクティブ プロセス数が制限を下回るまで、新しいプロセスを関連付けることはできません。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// JOBOBJECT_BASIC_LIMIT_INFORMATION  (x64 64 / x86 48 バイト)
typedef struct JOBOBJECT_BASIC_LIMIT_INFORMATION {
    LONGLONG PerProcessUserTimeLimit;
    LONGLONG PerJobUserTimeLimit;
    JOB_OBJECT_LIMIT LimitFlags;
    UINT_PTR MinimumWorkingSetSize;
    UINT_PTR MaximumWorkingSetSize;
    DWORD ActiveProcessLimit;
    UINT_PTR Affinity;
    DWORD PriorityClass;
    DWORD SchedulingClass;
} JOBOBJECT_BASIC_LIMIT_INFORMATION;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct JOBOBJECT_BASIC_LIMIT_INFORMATION
{
    public long PerProcessUserTimeLimit;
    public long PerJobUserTimeLimit;
    public uint LimitFlags;
    public UIntPtr MinimumWorkingSetSize;
    public UIntPtr MaximumWorkingSetSize;
    public uint ActiveProcessLimit;
    public UIntPtr Affinity;
    public uint PriorityClass;
    public uint SchedulingClass;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure JOBOBJECT_BASIC_LIMIT_INFORMATION
    Public PerProcessUserTimeLimit As Long
    Public PerJobUserTimeLimit As Long
    Public LimitFlags As UInteger
    Public MinimumWorkingSetSize As UIntPtr
    Public MaximumWorkingSetSize As UIntPtr
    Public ActiveProcessLimit As UInteger
    Public Affinity As UIntPtr
    Public PriorityClass As UInteger
    Public SchedulingClass As UInteger
End Structure
import ctypes
from ctypes import wintypes

class JOBOBJECT_BASIC_LIMIT_INFORMATION(ctypes.Structure):
    _fields_ = [
        ("PerProcessUserTimeLimit", ctypes.c_longlong),
        ("PerJobUserTimeLimit", ctypes.c_longlong),
        ("LimitFlags", wintypes.DWORD),
        ("MinimumWorkingSetSize", ctypes.c_size_t),
        ("MaximumWorkingSetSize", ctypes.c_size_t),
        ("ActiveProcessLimit", wintypes.DWORD),
        ("Affinity", ctypes.c_size_t),
        ("PriorityClass", wintypes.DWORD),
        ("SchedulingClass", wintypes.DWORD),
    ]
#[repr(C)]
pub struct JOBOBJECT_BASIC_LIMIT_INFORMATION {
    pub PerProcessUserTimeLimit: i64,
    pub PerJobUserTimeLimit: i64,
    pub LimitFlags: u32,
    pub MinimumWorkingSetSize: usize,
    pub MaximumWorkingSetSize: usize,
    pub ActiveProcessLimit: u32,
    pub Affinity: usize,
    pub PriorityClass: u32,
    pub SchedulingClass: u32,
}
import "golang.org/x/sys/windows"

type JOBOBJECT_BASIC_LIMIT_INFORMATION struct {
	PerProcessUserTimeLimit int64
	PerJobUserTimeLimit int64
	LimitFlags uint32
	MinimumWorkingSetSize uintptr
	MaximumWorkingSetSize uintptr
	ActiveProcessLimit uint32
	Affinity uintptr
	PriorityClass uint32
	SchedulingClass uint32
}
type
  JOBOBJECT_BASIC_LIMIT_INFORMATION = record
    PerProcessUserTimeLimit: Int64;
    PerJobUserTimeLimit: Int64;
    LimitFlags: DWORD;
    MinimumWorkingSetSize: NativeUInt;
    MaximumWorkingSetSize: NativeUInt;
    ActiveProcessLimit: DWORD;
    Affinity: NativeUInt;
    PriorityClass: DWORD;
    SchedulingClass: DWORD;
  end;
const JOBOBJECT_BASIC_LIMIT_INFORMATION = extern struct {
    PerProcessUserTimeLimit: i64,
    PerJobUserTimeLimit: i64,
    LimitFlags: u32,
    MinimumWorkingSetSize: usize,
    MaximumWorkingSetSize: usize,
    ActiveProcessLimit: u32,
    Affinity: usize,
    PriorityClass: u32,
    SchedulingClass: u32,
};
type
  JOBOBJECT_BASIC_LIMIT_INFORMATION {.bycopy.} = object
    PerProcessUserTimeLimit: int64
    PerJobUserTimeLimit: int64
    LimitFlags: uint32
    MinimumWorkingSetSize: uint
    MaximumWorkingSetSize: uint
    ActiveProcessLimit: uint32
    Affinity: uint
    PriorityClass: uint32
    SchedulingClass: uint32
struct JOBOBJECT_BASIC_LIMIT_INFORMATION
{
    long PerProcessUserTimeLimit;
    long PerJobUserTimeLimit;
    uint LimitFlags;
    size_t MinimumWorkingSetSize;
    size_t MaximumWorkingSetSize;
    uint ActiveProcessLimit;
    size_t Affinity;
    uint PriorityClass;
    uint SchedulingClass;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; JOBOBJECT_BASIC_LIMIT_INFORMATION サイズ: 48 バイト(x86)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; PerProcessUserTimeLimit : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; PerJobUserTimeLimit : LONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; LimitFlags : JOB_OBJECT_LIMIT (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; MinimumWorkingSetSize : UINT_PTR (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; MaximumWorkingSetSize : UINT_PTR (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; ActiveProcessLimit : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; Affinity : UINT_PTR (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; PriorityClass : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; SchedulingClass : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; JOBOBJECT_BASIC_LIMIT_INFORMATION サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; PerProcessUserTimeLimit : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; PerJobUserTimeLimit : LONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; LimitFlags : JOB_OBJECT_LIMIT (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; MinimumWorkingSetSize : UINT_PTR (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; MaximumWorkingSetSize : UINT_PTR (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; ActiveProcessLimit : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; Affinity : UINT_PTR (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; PriorityClass : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; SchedulingClass : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global JOBOBJECT_BASIC_LIMIT_INFORMATION
    #field int64 PerProcessUserTimeLimit
    #field int64 PerJobUserTimeLimit
    #field int LimitFlags
    #field intptr MinimumWorkingSetSize
    #field intptr MaximumWorkingSetSize
    #field int ActiveProcessLimit
    #field intptr Affinity
    #field int PriorityClass
    #field int SchedulingClass
#endstruct

stdim st, JOBOBJECT_BASIC_LIMIT_INFORMATION        ; NSTRUCT 変数を確保
st->PerProcessUserTimeLimit = 100
mes "PerProcessUserTimeLimit=" + st->PerProcessUserTimeLimit