示例#1
0
        private static bool GetLogicalProcessorInformationExWrapper(_LOGICAL_PROCESSOR_RELATIONSHIP _LOGICAL_PROCESSOR_RELATIONSHIP, _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P[] oDummy, ref uint returnLength)
        {
            bool ret = true;

            #if false // DEBUG
            const int PKG_COUNT = 2;
            const int CORES_PER_PKG = 18;
            const int THREADS_PER_CORE = 2;
            switch (_LOGICAL_PROCESSOR_RELATIONSHIP)
            {
                case ProcessorQueryAndControl._LOGICAL_PROCESSOR_RELATIONSHIP.RelationProcessorPackage:
                    {
                        Func<ushort, ulong, _PROCESSOR_RELATIONSHIP> CreateProcessor = (group, mask) =>
                            {
                                _PROCESSOR_RELATIONSHIP p = new _PROCESSOR_RELATIONSHIP();
                                p.Flags = 0;
                                p.GroupCount = 1;
                                p.GroupMask = new _GROUP_AFFINITY[1];
                                p.GroupMask[0].Mask = new UIntPtr(mask);
                                p.GroupMask[0].Group = group;
                                return p;
                            };

                        if (oDummy != null && oDummy.Length >= PKG_COUNT)
                        {
                            oDummy[0].Relationship = _LOGICAL_PROCESSOR_RELATIONSHIP;
                            //oDummy[0].Processor = CreateProcessor(0, 0xFFFF);
                            oDummy[0].Processor = CreateProcessor(0, 0xFFFFFFFFF);
                            oDummy[0].Size = (uint)Marshal.SizeOf(typeof(_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P));

                            oDummy[1].Relationship = _LOGICAL_PROCESSOR_RELATIONSHIP;
                            //oDummy[1].Processor = CreateProcessor(0, 0xFFFF0000);
                            oDummy[1].Processor = CreateProcessor(1, 0xFFFFFFFFF);
                            oDummy[1].Size = (uint)Marshal.SizeOf(typeof(_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P));

                            /*
                            oDummy[2].Relationship = _LOGICAL_PROCESSOR_RELATIONSHIP;
                            //oDummy[2].Processor = CreateProcessor(0, 0xFFFF00000000);
                            oDummy[2].Processor = CreateProcessor(1, 0x3FFFFFFF);
                            oDummy[2].Size = (uint)Marshal.SizeOf(typeof(_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P));

                            oDummy[3].Relationship = _LOGICAL_PROCESSOR_RELATIONSHIP;
                            //oDummy[3].Processor = CreateProcessor(0, 0xFFFF000000000000);
                            oDummy[3].Processor = CreateProcessor(1, 0xFFFFFFFC00000000);
                            oDummy[3].Size = (uint)Marshal.SizeOf(typeof(_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P));
                            */
                            returnLength = (uint)(oDummy.Length * Marshal.SizeOf(typeof(_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P)));
                            ret = true;
                        }
                        else
                        {
                            returnLength = (uint)(PKG_COUNT * Marshal.SizeOf(typeof(_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P)));
                            ret = false;
                        }
                    }
                    break;
                case ProcessorQueryAndControl._LOGICAL_PROCESSOR_RELATIONSHIP.RelationProcessorCore:
                    {
                        //oDummy = new _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P[PKG_COUNT * CORES_PER_PKG];

                        Func<ushort, ulong, _PROCESSOR_RELATIONSHIP> CreateCore = (group, mask) =>
                        {
                            _PROCESSOR_RELATIONSHIP p = new _PROCESSOR_RELATIONSHIP();
                            p.Flags = 1;
                            p.GroupCount = 1;
                            p.GroupMask = new _GROUP_AFFINITY[1];
                            p.GroupMask[0].Mask = new UIntPtr(mask);
                            p.GroupMask[0].Group = group;
                            return p;
                        };

                        if (oDummy != null && oDummy.Length >= (PKG_COUNT * CORES_PER_PKG))
                        {
                            for (int i = 0; i < (2 * CORES_PER_PKG); i++)
                            {
                                oDummy[i].Relationship = _LOGICAL_PROCESSOR_RELATIONSHIP;
                                oDummy[i].Processor = CreateCore((ushort)((i * 2) / 64), (0x3UL << ((i * 2) % 64)));
                                oDummy[i].Size = (uint)Marshal.SizeOf(typeof(_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P));
                            }

                            for (int i = 0; i < (2 * CORES_PER_PKG); i++)
                            {
                                oDummy[35 - i].Relationship = _LOGICAL_PROCESSOR_RELATIONSHIP;
                                oDummy[35 - i].Processor = CreateCore((ushort)((i * 2) / 64), (0xC000000000000000UL >> ((i * 2) % 64)));
                                oDummy[35 - i].Size = (uint)Marshal.SizeOf(typeof(_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P));
                            }

                            returnLength = (uint)(oDummy.Length * Marshal.SizeOf(typeof(_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P)));
                            ret = true;
                        }
                        else
                        {
                            returnLength = (uint)(PKG_COUNT * CORES_PER_PKG * Marshal.SizeOf(typeof(_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P)));
                            ret = false;
                        }
                    }
                    break;
                default:
                    throw new ArgumentException();
            }

            #else
            ret = GetLogicalProcessorInformationEx(_LOGICAL_PROCESSOR_RELATIONSHIP, oDummy, ref returnLength);
            #endif
            try
            {
                if (oDummy != null)
                {
                    int index = 0;
                    foreach (_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P s in oDummy)
                    {
                        ErrorLog.WriteLine(_LOGICAL_PROCESSOR_RELATIONSHIP.ToString() + " - " + index++ + ": ");
                        _PROCESSOR_RELATIONSHIP pr = s.Processor;
                        _LOGICAL_PROCESSOR_RELATIONSHIP lpr = s.Relationship;
                        ErrorLog.WriteLine("  Size: " + s.Size);
                        ErrorLog.WriteLine("  Flags: " + pr.Flags);
                        ErrorLog.WriteLine("  GroupCount: " + pr.GroupCount);
                        foreach (_GROUP_AFFINITY ga in pr.GroupMask)
                        {
                            ErrorLog.WriteLine("  GroupMask: ");
                            ErrorLog.WriteLine("    Group: " + ga.Group.ToString("X2"));
                            ErrorLog.WriteLine("    Mask: " + ((ulong)ga.Mask).ToString("X2"));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return ret;
        }
示例#2
0
 private static _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P[] GetProcessorDataArray(_LOGICAL_PROCESSOR_RELATIONSHIP aType)
 {
     //----------------------------------------------
     // Intel Corporation
     // Copyright © 2009/2010 - All Rights Reserved
     // Department : SST/NTE
     // Written by : Bill Hines - [email protected]
     // Modified by : N/A
     // Date : 12/4/2009
     //----------------------------------------------
     // Get Number of Elements that Exist
     //----------------------------------------------
     uint returnLength = 0;
     _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P[] oDummy = null;
     bool bResult = GetLogicalProcessorInformationExWrapper(
     aType, oDummy, ref returnLength);
     if (bResult) return null;
     //----------------------------------------------
     // Making sure that the error code that we
     // got back isn't that there is insufficient
     // space in the buffer.
     //----------------------------------------------
     int iError = Marshal.GetLastWin32Error();
     if (iError != ERROR_INSUFFICIENT_BUFFER)
         return null;
     //----------------------------------------------
     // Now that we know how much space we should
     // reserve, we're going to reserve it and call
     // GetLogicalProcessorInformationEx again.
     //----------------------------------------------
     uint iBaseSize = (uint)Marshal.SizeOf(
     typeof(_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P));
     uint iNumberOfElements = returnLength / iBaseSize;
     _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P[] oData =
     new _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX_P[iNumberOfElements];
     uint iAllocatedSize = iNumberOfElements * iBaseSize;
     //----------------------------------------------
     // Get The Requested Data
     //----------------------------------------------
     if (!GetLogicalProcessorInformationExWrapper(
     aType, oData, ref iAllocatedSize))
         return null;
     else
         return oData;
 }