public static extern UInt32 PdhExpandWildCardPathW( string szdataSource, string szWildCardPath, IntPtr mszExpandedPathList, ref long pcchPathListLength, PdhExpansionFlags dwFlags);
private List <string> ExpandCounterPath(string searchPattern, PdhExpansionFlags flags) { long cchPathListLength = 0; uint result = 0; byte[] buffer = null; // // Do - while, the buffer can grow after being told the necessary size do { IntPtr mszExpandedPathList = IntPtr.Zero; if (cchPathListLength > 0) { // // If we received a buffer size allocate one // Unicode size is 2 bytes mszExpandedPathList = Marshal.AllocHGlobal(2 * (int)cchPathListLength); } try { result = Pdh.PdhExpandWildCardPathW(null, searchPattern, mszExpandedPathList, ref cchPathListLength, flags); if (result == Pdh.PDH_MORE_DATA) { continue; } if (result == Pdh.PDH_CSTATUS_NO_OBJECT || result == Pdh.PDH_CSTATUS_NO_INSTANCE) { return(new List <string>()); } if (result != 0 && result != Pdh.PDH_MORE_DATA) { throw new Win32Exception((int)result); } buffer = new byte[cchPathListLength * 2]; Marshal.Copy(mszExpandedPathList, buffer, 0, buffer.Length); } finally { // // Always clean up allocated buffer if (mszExpandedPathList != IntPtr.Zero) { Marshal.FreeHGlobal(mszExpandedPathList); } } } while (result == Pdh.PDH_MORE_DATA); if (buffer == null) { throw new Win32Exception((int)result); } // // Parse paths from filled buffer List <string> strings = new List <string>(); int start = 0; int end = 0; var chars = Encoding.Unicode.GetChars(buffer); do { do { end++; }while (end < chars.Length && chars[end] != 0); strings.Add(new string(chars, start, end - start)); start = end; } while (start < chars.Length - 1 && chars[start + 1] != 0); return(strings); }