Func _WinAPI_GetParentProcessPIDAndName($PID = 0) If Not $PID Then $PID = @AutoItPID EndIf Local $oDict = ObjCreate('Scripting.Dictionary') Local $hSnapshot = DllCall('kernel32.dll', 'ptr', 'CreateToolhelp32Snapshot', 'dword', 0x00000002, 'dword', 0) If (@error) Or (Not $hSnapshot[0]) Then Return SetError(1, 0, 0) EndIf Local $tPROCESSENTRY32 = DllStructCreate('dword Size;dword Usage;dword ProcessID;ulong_ptr DefaultHeapID;dword ModuleID;dword Threads;dword ParentProcessID;long PriClassBase;dword Flags;wchar ExeFile[260]') Local $pPROCESSENTRY32 = DllStructGetPtr($tPROCESSENTRY32) Local $Ret, $aResult[2], $iTmp $hSnapshot = $hSnapshot[0] DllStructSetData($tPROCESSENTRY32, 'Size', DllStructGetSize($tPROCESSENTRY32)) $Ret = DllCall('kernel32.dll', 'int', 'Process32FirstW', 'ptr', $hSnapshot, 'ptr', $pPROCESSENTRY32) While (Not @error) And ($Ret[0]) $iTmp = DllStructGetData($tPROCESSENTRY32, 'ProcessID') If $iTmp = $PID Then $aResult[0] = DllStructGetData($tPROCESSENTRY32, 'ParentProcessID') EndIf If $iTmp <> 0 Then $oDict.Add($iTmp, DllStructGetData($tPROCESSENTRY32, 'ExeFile')) $Ret = DllCall('kernel32.dll', 'int', 'Process32NextW', 'ptr', $hSnapshot, 'ptr', $pPROCESSENTRY32) WEnd _WinAPI_CloseHandle($hSnapshot) $aResult[1] = $oDict.Item($aResult[0]) Return $aResult EndFunc ;==>_WinAPI_GetParentProcessPIDAndName |