mirror of
https://github.com/golang/sys.git
synced 2026-02-08 19:56:04 +03:00
windows: add SetInformationJobObject functions
This CL also adds some struct for the function. https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_jobobject_extended_limit_information https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_jobobject_basic_limit_information https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_jobobject_basic_ui_restrictions https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-io_counters Change-Id: Ie3b7570fc344a25ad2a39129b74434b8baa1eed9 Reviewed-on: https://go-review.googlesource.com/c/sys/+/179039 Reviewed-by: Alex Brainman <alex.brainman@gmail.com> Run-TryBot: Alex Brainman <alex.brainman@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
committed by
Alex Brainman
parent
854af27f14
commit
cc920278c2
@@ -260,6 +260,7 @@ func NewCallbackCDecl(fn interface{}) uintptr {
|
||||
//sys ResumeThread(thread Handle) (ret uint32, err error) [failretval==0xffffffff] = kernel32.ResumeThread
|
||||
//sys SetPriorityClass(process Handle, priorityClass uint32) (err error) = kernel32.SetPriorityClass
|
||||
//sys GetPriorityClass(process Handle) (ret uint32, err error) = kernel32.GetPriorityClass
|
||||
//sys SetInformationJobObject(job Handle, JobObjectInformationClass uint32, JobObjectInformation uintptr, JobObjectInformationLength uint32) (ret int, err error)
|
||||
|
||||
// Volume Management Functions
|
||||
//sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW
|
||||
|
||||
@@ -1508,3 +1508,85 @@ type ConsoleScreenBufferInfo struct {
|
||||
}
|
||||
|
||||
const UNIX_PATH_MAX = 108 // defined in afunix.h
|
||||
|
||||
const (
|
||||
// flags for JOBOBJECT_BASIC_LIMIT_INFORMATION.LimitFlags
|
||||
JOB_OBJECT_LIMIT_ACTIVE_PROCESS = 0x00000008
|
||||
JOB_OBJECT_LIMIT_AFFINITY = 0x00000010
|
||||
JOB_OBJECT_LIMIT_BREAKAWAY_OK = 0x00000800
|
||||
JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x00000400
|
||||
JOB_OBJECT_LIMIT_JOB_MEMORY = 0x00000200
|
||||
JOB_OBJECT_LIMIT_JOB_TIME = 0x00000004
|
||||
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x00002000
|
||||
JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME = 0x00000040
|
||||
JOB_OBJECT_LIMIT_PRIORITY_CLASS = 0x00000020
|
||||
JOB_OBJECT_LIMIT_PROCESS_MEMORY = 0x00000100
|
||||
JOB_OBJECT_LIMIT_PROCESS_TIME = 0x00000002
|
||||
JOB_OBJECT_LIMIT_SCHEDULING_CLASS = 0x00000080
|
||||
JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK = 0x00001000
|
||||
JOB_OBJECT_LIMIT_SUBSET_AFFINITY = 0x00004000
|
||||
JOB_OBJECT_LIMIT_WORKINGSET = 0x00000001
|
||||
)
|
||||
|
||||
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 IO_COUNTERS struct {
|
||||
ReadOperationCount uint64
|
||||
WriteOperationCount uint64
|
||||
OtherOperationCount uint64
|
||||
ReadTransferCount uint64
|
||||
WriteTransferCount uint64
|
||||
OtherTransferCount uint64
|
||||
}
|
||||
|
||||
type JOBOBJECT_EXTENDED_LIMIT_INFORMATION struct {
|
||||
BasicLimitInformation JOBOBJECT_BASIC_LIMIT_INFORMATION
|
||||
IoInfo IO_COUNTERS
|
||||
ProcessMemoryLimit uintptr
|
||||
JobMemoryLimit uintptr
|
||||
PeakProcessMemoryUsed uintptr
|
||||
PeakJobMemoryUsed uintptr
|
||||
}
|
||||
|
||||
const (
|
||||
// UIRestrictionsClass
|
||||
JOB_OBJECT_UILIMIT_DESKTOP = 0x00000040
|
||||
JOB_OBJECT_UILIMIT_DISPLAYSETTINGS = 0x00000010
|
||||
JOB_OBJECT_UILIMIT_EXITWINDOWS = 0x00000080
|
||||
JOB_OBJECT_UILIMIT_GLOBALATOMS = 0x00000020
|
||||
JOB_OBJECT_UILIMIT_HANDLES = 0x00000001
|
||||
JOB_OBJECT_UILIMIT_READCLIPBOARD = 0x00000002
|
||||
JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS = 0x00000008
|
||||
JOB_OBJECT_UILIMIT_WRITECLIPBOARD = 0x00000004
|
||||
)
|
||||
|
||||
type JOBOBJECT_BASIC_UI_RESTRICTIONS struct {
|
||||
UIRestrictionsClass uint32
|
||||
}
|
||||
|
||||
const (
|
||||
// JobObjectInformationClass
|
||||
JobObjectAssociateCompletionPortInformation = 7
|
||||
JobObjectBasicLimitInformation = 2
|
||||
JobObjectBasicUIRestrictions = 4
|
||||
JobObjectCpuRateControlInformation = 15
|
||||
JobObjectEndOfJobTimeInformation = 6
|
||||
JobObjectExtendedLimitInformation = 9
|
||||
JobObjectGroupInformation = 11
|
||||
JobObjectGroupInformationEx = 14
|
||||
JobObjectLimitViolationInformation2 = 35
|
||||
JobObjectNetRateControlInformation = 32
|
||||
JobObjectNotificationLimitInformation = 12
|
||||
JobObjectNotificationLimitInformation2 = 34
|
||||
JobObjectSecurityLimitInformation = 5
|
||||
)
|
||||
|
||||
@@ -198,6 +198,7 @@ var (
|
||||
procResumeThread = modkernel32.NewProc("ResumeThread")
|
||||
procSetPriorityClass = modkernel32.NewProc("SetPriorityClass")
|
||||
procGetPriorityClass = modkernel32.NewProc("GetPriorityClass")
|
||||
procSetInformationJobObject = modkernel32.NewProc("SetInformationJobObject")
|
||||
procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW")
|
||||
procDeleteVolumeMountPointW = modkernel32.NewProc("DeleteVolumeMountPointW")
|
||||
procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW")
|
||||
@@ -2132,6 +2133,19 @@ func GetPriorityClass(process Handle) (ret uint32, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func SetInformationJobObject(job Handle, JobObjectInformationClass uint32, JobObjectInformation uintptr, JobObjectInformationLength uint32) (ret int, err error) {
|
||||
r0, _, e1 := syscall.Syscall6(procSetInformationJobObject.Addr(), 4, uintptr(job), uintptr(JobObjectInformationClass), uintptr(JobObjectInformation), uintptr(JobObjectInformationLength), 0, 0)
|
||||
ret = int(r0)
|
||||
if ret == 0 {
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
} else {
|
||||
err = syscall.EINVAL
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) {
|
||||
r1, _, e1 := syscall.Syscall(procDefineDosDeviceW.Addr(), 3, uintptr(flags), uintptr(unsafe.Pointer(deviceName)), uintptr(unsafe.Pointer(targetPath)))
|
||||
if r1 == 0 {
|
||||
|
||||
Reference in New Issue
Block a user