mirror of
https://github.com/rwinkhart/sys.git
synced 2026-09-03 23:57:32 -04: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 ResumeThread(thread Handle) (ret uint32, err error) [failretval==0xffffffff] = kernel32.ResumeThread
|
||||||
//sys SetPriorityClass(process Handle, priorityClass uint32) (err error) = kernel32.SetPriorityClass
|
//sys SetPriorityClass(process Handle, priorityClass uint32) (err error) = kernel32.SetPriorityClass
|
||||||
//sys GetPriorityClass(process Handle) (ret uint32, err error) = kernel32.GetPriorityClass
|
//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
|
// Volume Management Functions
|
||||||
//sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW
|
//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 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")
|
procResumeThread = modkernel32.NewProc("ResumeThread")
|
||||||
procSetPriorityClass = modkernel32.NewProc("SetPriorityClass")
|
procSetPriorityClass = modkernel32.NewProc("SetPriorityClass")
|
||||||
procGetPriorityClass = modkernel32.NewProc("GetPriorityClass")
|
procGetPriorityClass = modkernel32.NewProc("GetPriorityClass")
|
||||||
|
procSetInformationJobObject = modkernel32.NewProc("SetInformationJobObject")
|
||||||
procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW")
|
procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW")
|
||||||
procDeleteVolumeMountPointW = modkernel32.NewProc("DeleteVolumeMountPointW")
|
procDeleteVolumeMountPointW = modkernel32.NewProc("DeleteVolumeMountPointW")
|
||||||
procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW")
|
procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW")
|
||||||
@@ -2132,6 +2133,19 @@ func GetPriorityClass(process Handle) (ret uint32, err error) {
|
|||||||
return
|
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) {
|
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)))
|
r1, _, e1 := syscall.Syscall(procDefineDosDeviceW.Addr(), 3, uintptr(flags), uintptr(unsafe.Pointer(deviceName)), uintptr(unsafe.Pointer(targetPath)))
|
||||||
if r1 == 0 {
|
if r1 == 0 {
|
||||||
|
|||||||
Reference in New Issue
Block a user