Esempio n. 1
0
 public static extern UInt32 PdhExpandWildCardPathW(
     string szdataSource,
     string szWildCardPath,
     IntPtr mszExpandedPathList,
     ref long pcchPathListLength,
     PdhExpansionFlags dwFlags);
Esempio n. 2
0
        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);
        }