@@ -204,6 +204,9 @@ func NewCallbackCDecl(fn interface{}) uintptr
204
204
//sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode
205
205
//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
206
206
//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
207
+ //sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
208
+ //sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW
209
+ //sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW
207
210
208
211
// syscall interface implementation for other packages
209
212
@@ -902,9 +905,37 @@ func FindNextFile(handle Handle, data *Win32finddata) (err error) {
902
905
return
903
906
}
904
907
905
- // TODO(brainman): fix all needed for os
906
- func Getppid () (ppid int ) { return - 1 }
908
+ func getProcessEntry (pid int ) (* ProcessEntry32 , error ) {
909
+ snapshot , err := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS , 0 )
910
+ if err != nil {
911
+ return nil , err
912
+ }
913
+ defer CloseHandle (snapshot )
914
+ var procEntry ProcessEntry32
915
+ procEntry .Size = uint32 (unsafe .Sizeof (procEntry ))
916
+ if err = Process32First (snapshot , & procEntry ); err != nil {
917
+ return nil , err
918
+ }
919
+ for {
920
+ if procEntry .ProcessID == uint32 (pid ) {
921
+ return & procEntry , nil
922
+ }
923
+ err = Process32Next (snapshot , & procEntry )
924
+ if err != nil {
925
+ return nil , err
926
+ }
927
+ }
928
+ }
929
+
930
+ func Getppid () (ppid int ) {
931
+ pe , err := getProcessEntry (Getpid ())
932
+ if err != nil {
933
+ return - 1
934
+ }
935
+ return int (pe .ParentProcessID )
936
+ }
907
937
938
+ // TODO(brainman): fix all needed for os
908
939
func Fchdir (fd Handle ) (err error ) { return EWINDOWS }
909
940
func Link (oldpath , newpath string ) (err error ) { return EWINDOWS }
910
941
func Symlink (path , link string ) (err error ) { return EWINDOWS }
0 commit comments