diff --git a/process/process_windows.go b/process/process_windows.go index 9a1f548..e410a0e 100644 --- a/process/process_windows.go +++ b/process/process_windows.go @@ -12,6 +12,7 @@ import ( "reflect" "strings" "syscall" + "time" "unicode/utf16" "unsafe" @@ -720,24 +721,38 @@ func (p *Process) OpenFilesWithContext(ctx context.Context) ([]OpenFilesStat, er continue } - var buf [syscall.MAX_LONG_PATH]uint16 - n, err := windows.GetFinalPathNameByHandle(windows.Handle(file), &buf[0], syscall.MAX_LONG_PATH, 0) - if err != nil { - continue - } + var fileName string + ch := make(chan struct{}) + + go func() { + var buf [syscall.MAX_LONG_PATH]uint16 + n, err := windows.GetFinalPathNameByHandle(windows.Handle(file), &buf[0], syscall.MAX_LONG_PATH, 0) + if err != nil { + return + } + + fileName = string(utf16.Decode(buf[:n])) + ch <- struct{}{} + }() - fileName := string(utf16.Decode(buf[:n])) - fileInfo, _ := os.Stat(fileName) - if fileInfo.IsDir() { + select { + case <-time.NewTimer(100 * time.Millisecond).C: continue - } + case <-ch: + fileInfo, _ := os.Stat(fileName) + if fileInfo.IsDir() { + continue + } - if _, exists := fileExists[fileName]; !exists { - files = append(files, OpenFilesStat{ - Path: fileName, - Fd: uint64(file), - }) - fileExists[fileName] = true + if _, exists := fileExists[fileName]; !exists { + files = append(files, OpenFilesStat{ + Path: fileName, + Fd: uint64(file), + }) + fileExists[fileName] = true + } + case <-ctx.Done(): + return files, ctx.Err() } } diff --git a/v3/process/process_windows.go b/v3/process/process_windows.go index 2aaedcd..4f004ff 100644 --- a/v3/process/process_windows.go +++ b/v3/process/process_windows.go @@ -12,6 +12,7 @@ import ( "reflect" "strings" "syscall" + "time" "unicode/utf16" "unsafe" @@ -707,24 +708,38 @@ func (p *Process) OpenFilesWithContext(ctx context.Context) ([]OpenFilesStat, er continue } - var buf [syscall.MAX_LONG_PATH]uint16 - n, err := windows.GetFinalPathNameByHandle(windows.Handle(file), &buf[0], syscall.MAX_LONG_PATH, 0) - if err != nil { - continue - } + var fileName string + ch := make(chan struct{}) + + go func() { + var buf [syscall.MAX_LONG_PATH]uint16 + n, err := windows.GetFinalPathNameByHandle(windows.Handle(file), &buf[0], syscall.MAX_LONG_PATH, 0) + if err != nil { + return + } + + fileName = string(utf16.Decode(buf[:n])) + ch <- struct{}{} + }() - fileName := string(utf16.Decode(buf[:n])) - fileInfo, _ := os.Stat(fileName) - if fileInfo.IsDir() { + select { + case <-time.NewTimer(100 * time.Millisecond).C: continue - } + case <-ch: + fileInfo, _ := os.Stat(fileName) + if fileInfo.IsDir() { + continue + } - if _, exists := fileExists[fileName]; !exists { - files = append(files, OpenFilesStat{ - Path: fileName, - Fd: uint64(file), - }) - fileExists[fileName] = true + if _, exists := fileExists[fileName]; !exists { + files = append(files, OpenFilesStat{ + Path: fileName, + Fd: uint64(file), + }) + fileExists[fileName] = true + } + case <-ctx.Done(): + return files, ctx.Err() } }