func()

in helpers/windows/pdh/pdh_query_windows.go [234:277]


func (q *Query) ExpandWildCardPath(wildCardPath string) ([]string, error) {
	if wildCardPath == "" {
		return nil, errors.New("no query path given")
	}
	utfPath, err := syscall.UTF16PtrFromString(wildCardPath)
	if err != nil {
		return nil, err
	}
	var expdPaths []uint16

	// PdhExpandWildCardPath will not return the counter paths for windows 32 bit systems but PdhExpandCounterPath will.
	if runtime.GOARCH == "386" {
		if expdPaths, err = PdhExpandCounterPath(utfPath); err != nil {
			return nil, err
		}
		if expdPaths == nil {
			return nil, errors.New("no counter paths found")
		}
		return UTF16ToStringArray(expdPaths), nil
	} else {
		if expdPaths, err = PdhExpandWildCardPath(utfPath); err != nil {
			if err == PDH_MORE_DATA {
				if expdPaths, err = PdhExpandWildCardPath(utfPath); err != nil {
					return nil, err
				}
			} else {
				return nil, err
			}
		}
		paths := UTF16ToStringArray(expdPaths)
		// in several cases ExpandWildCardPath win32 api seems to return initial wildcard without any errors, adding some waiting time between the 2 ExpandWildCardPath api calls seems to be succesfull but that will delay data retrieval
		// A call is triggered again
		if len(paths) == 1 && strings.Contains(paths[0], "*") && paths[0] == wildCardPath {
			expdPaths, err = PdhExpandWildCardPath(utfPath)
			if err == nil {
				return paths, err
			}
		} else {
			return paths, err
		}
	}

	return nil, PdhErrno(syscall.ERROR_NOT_FOUND)
}