[v2][process][windows] fix Kill causes DuplicateHandle error

pull/1145/head
shirou 4 years ago
parent b96339ab43
commit 703175c3fb

@ -116,51 +116,51 @@ type processBasicInformation64 struct {
} }
type processEnvironmentBlock32 struct { type processEnvironmentBlock32 struct {
Reserved1 [2]uint8 Reserved1 [2]uint8
BeingDebugged uint8 BeingDebugged uint8
Reserved2 uint8 Reserved2 uint8
Reserved3 [2]uint32 Reserved3 [2]uint32
Ldr uint32 Ldr uint32
ProcessParameters uint32 ProcessParameters uint32
// More fields which we don't use so far // More fields which we don't use so far
} }
type processEnvironmentBlock64 struct { type processEnvironmentBlock64 struct {
Reserved1 [2]uint8 Reserved1 [2]uint8
BeingDebugged uint8 BeingDebugged uint8
Reserved2 uint8 Reserved2 uint8
_ [4]uint8 // padding, since we are 64 bit, the next pointer is 64 bit aligned (when compiling for 32 bit, this is not the case without manual padding) _ [4]uint8 // padding, since we are 64 bit, the next pointer is 64 bit aligned (when compiling for 32 bit, this is not the case without manual padding)
Reserved3 [2]uint64 Reserved3 [2]uint64
Ldr uint64 Ldr uint64
ProcessParameters uint64 ProcessParameters uint64
// More fields which we don't use so far // More fields which we don't use so far
} }
type rtlUserProcessParameters32 struct { type rtlUserProcessParameters32 struct {
Reserved1 [16]uint8 Reserved1 [16]uint8
Reserved2 [10]uint32 Reserved2 [10]uint32
ImagePathNameLength uint16 ImagePathNameLength uint16
_ uint16 _ uint16
ImagePathAddress uint32 ImagePathAddress uint32
CommandLineLength uint16 CommandLineLength uint16
_ uint16 _ uint16
CommandLineAddress uint32 CommandLineAddress uint32
EnvironmentAddress uint32 EnvironmentAddress uint32
// More fields which we don't use so far // More fields which we don't use so far
} }
type rtlUserProcessParameters64 struct { type rtlUserProcessParameters64 struct {
Reserved1 [16]uint8 Reserved1 [16]uint8
Reserved2 [10]uint64 Reserved2 [10]uint64
ImagePathNameLength uint16 ImagePathNameLength uint16
_ uint16 // Max Length _ uint16 // Max Length
_ uint32 // Padding _ uint32 // Padding
ImagePathAddress uint64 ImagePathAddress uint64
CommandLineLength uint16 CommandLineLength uint16
_ uint16 // Max Length _ uint16 // Max Length
_ uint32 // Padding _ uint32 // Padding
CommandLineAddress uint64 CommandLineAddress uint64
EnvironmentAddress uint64 EnvironmentAddress uint64
// More fields which we don't use so far // More fields which we don't use so far
} }
@ -669,7 +669,10 @@ func (p *Process) TerminateWithContext(ctx context.Context) error {
} }
func (p *Process) KillWithContext(ctx context.Context) error { func (p *Process) KillWithContext(ctx context.Context) error {
process := os.Process{Pid: int(p.Pid)} process, err := os.FindProcess(int(p.Pid))
if err != nil {
return err
}
return process.Kill() return process.Kill()
} }
@ -928,14 +931,14 @@ func getProcessEnvironmentVariables(pid int32, ctx context.Context) ([]string, e
is32BitProcess: procIs32Bits, is32BitProcess: procIs32Bits,
offset: processParameterBlockAddress, offset: processParameterBlockAddress,
}) })
envvarScanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error){ envvarScanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
if atEOF && len(data) == 0 { if atEOF && len(data) == 0 {
return 0, nil, nil return 0, nil, nil
} }
// Check for UTF-16 zero character // Check for UTF-16 zero character
for i := 0; i < len(data) - 1; i+=2 { for i := 0; i < len(data)-1; i += 2 {
if data[i] == 0 && data[i+1] == 0 { if data[i] == 0 && data[i+1] == 0 {
return i+2, data[0:i], nil return i + 2, data[0:i], nil
} }
} }
if atEOF { if atEOF {
@ -965,9 +968,9 @@ func getProcessEnvironmentVariables(pid int32, ctx context.Context) ([]string, e
} }
type processReader struct { type processReader struct {
processHandle windows.Handle processHandle windows.Handle
is32BitProcess bool is32BitProcess bool
offset uint64 offset uint64
} }
func (p *processReader) Read(buf []byte) (int, error) { func (p *processReader) Read(buf []byte) (int, error) {

Loading…
Cancel
Save