lynxx
Lt. Junior Grade
- Registriert
- Feb. 2005
- Beiträge
- 447
Hier eine SetAffinity in C# (braucht NET 2.0).
Beispiel Benutzung:
Ausserdem wird die Affinity als ErrorLevel zurückgegeben, so das man in einem Batch z.B Abfragen kann ob die gewünschte Affinty schon zugewiesen ist:
Edit: Die erste Version setzte nur bis zu 8 Kernen als Default, diese nimmt die tatsächliche Anzahl des Systems und Ausgabe der aktiven Kerne verbessert ..
2nd Edit: Es kann jetzt
Affinitymaske jetzt in long, danke @cloudman, damit sollte es auch auf 64 Kern-Systemen ohne Probleme laufen und Kern-Ausgabe war vorher bei Systemen mit mehr als 32 Kernen falsch ..
3rd Edit: Die Affinitätsmaske kann jetzt auch mit % als Binärmaske übergeben werden. Wenn die Affinitätsmaske größer als die im System vorhandenen Kerne ist wird sie auf die vorhandenen Kerne beschränkt. Danke an @iamunknown
Virustotal-Scan für die Exe: 1/72
Beispiel Benutzung:
Code:
C:\Temp>SetAffinity.exe
Usage: SetAffinity <partof>processname <affinity/read>
Done by Holger 'Lynxx' Hippenstiel in March.2020
C:\Temp>SetAffinity.exe explo 3
Process: explorer ID: 4836 Affinity: 3 (Cores: 2 Core0,Core1) Old: 255 (Cores: 8 All Cores)
C:\Temp>SetAffinity.exe explo %110
Process: explorer ID: 4836 Affinity: 6 (Cores: 2 Core1,Core2) Old: 3 (Cores: 2 Core0,Core1)
C:\Temp>SetAffinity.exe explo read
Process: explorer ID: 4836 Affinity: 6 (Cores: 2 Core1,Core2)
C:\Temp>SetAffinity.exe explo
Process: explorer ID: 4836 Affinity: 255 (Cores: 8 All Cores) Old: 3 (Cores: 2 Core0,Core1)
C:\Temp>SetAffinity.exe fxplo
No Process found which contains 'fxplo'
Ausserdem wird die Affinity als ErrorLevel zurückgegeben, so das man in einem Batch z.B Abfragen kann ob die gewünschte Affinty schon zugewiesen ist:
Code:
SetAffinity.exe >NUL explo read
IF %ERRORLEVEL% NEQ 3 (
SetAffinity.exe >NUL explo 3
)
Code:
using System;
using System.Diagnostics;
namespace SetAffinity {
class Program {
static int Main(string[] args) {
long maxAffinity = (long)(Math.Pow(2, Environment.ProcessorCount) - 1);
int returnVal = 0;
if (args == null || args.Length == 0) {
Console.WriteLine("Usage: SetAffinity <partof>processname <affinity/read>");
Console.WriteLine("Done by Holger 'Lynxx' Hippenstiel in March.2020");
}
else {
long newAffinity = 0;
bool bAffinityGiven = false, bReadAffinity = false;
if (args.Length > 1) {
if (args[1].StartsWith("%")) {
String strBits = args[1].Substring(1);
int j = strBits.Length - 1;
bAffinityGiven = true;
for (int i = 0; i < strBits.Length; i++, j--) {
if (strBits[i] == '1')
newAffinity += (long)Math.Pow(2, j);
else if (strBits[i] != '0') {
Console.WriteLine("SetAffinity-ERROR: Only 0 & 1 allowed in Bitmask !");
bAffinityGiven = false;
break;
}
}
}
else
bAffinityGiven = Int64.TryParse(args[1], out newAffinity);
if (!bAffinityGiven && args[1].ToLower().Equals("read"))
bReadAffinity = true;
}
if (!bAffinityGiven)
newAffinity = maxAffinity;
if (newAffinity > maxAffinity) {
newAffinity &= maxAffinity;
Console.WriteLine("SetAffinity-ERROR: To large Affinity-Mask used, reduced to {0}/{1}", newAffinity, maxAffinity);
}
String strProcessName = args[0].ToLower();
bool bAllProcesses = args[0] == "_ALL_";
bool bProcessFound = false;
foreach (Process oneProcess in Process.GetProcesses()) {
try {
if (oneProcess.ProcessName.ToLower().Contains(strProcessName) || bAllProcesses) {
bProcessFound = true;
long oldAffinity = (long)oneProcess.ProcessorAffinity;
returnVal = (int)oldAffinity;
if (oldAffinity == newAffinity || bReadAffinity)
Console.WriteLine("Process: {0} ID: {1} Affinity: {2} ({3})", oneProcess.ProcessName, oneProcess.Id, oldAffinity, getCores(oldAffinity));
else {
oneProcess.ProcessorAffinity = (IntPtr)newAffinity;
Console.WriteLine("Process: {0} ID: {1} Affinity: {2} ({3}) Old: {4} ({5})", oneProcess.ProcessName, oneProcess.Id, newAffinity, getCores(newAffinity), oldAffinity, getCores(oldAffinity));
}
}
}
catch (Exception) {
Console.WriteLine("SetAffinity-ERROR: Failed to set Affinity for Process: {0} ID: {1}", oneProcess.ProcessName, oneProcess.Id);
}
}
if (!bProcessFound)
Console.WriteLine("No Process found which contains '{0}'", strProcessName);
}
return returnVal;
}
static String getCores(long affinityMask) {
String strReturn = "";
bool bAllCores = true;
int countCores = 0;
for (int i = 0; i < Environment.ProcessorCount; i++) {
if ((affinityMask & (long)Math.Pow(2, i)) != 0) {
strReturn += "Core" + i + ",";
countCores++;
}
else
bAllCores = false;
}
if (bAllCores)
strReturn = "Cores: " + Environment.ProcessorCount + " All Cores";
else {
if (strReturn.EndsWith(","))
strReturn = strReturn.Substring(0, strReturn.Length - 1);
strReturn = "Cores: " + countCores + " " + strReturn;
}
return strReturn;
}
}
}
Edit: Die erste Version setzte nur bis zu 8 Kernen als Default, diese nimmt die tatsächliche Anzahl des Systems und Ausgabe der aktiven Kerne verbessert ..
2nd Edit: Es kann jetzt
_ALL_
als Name angeben werden, dann wird bei allen Prozessen die Affinität eingestellt.Affinitymaske jetzt in long, danke @cloudman, damit sollte es auch auf 64 Kern-Systemen ohne Probleme laufen und Kern-Ausgabe war vorher bei Systemen mit mehr als 32 Kernen falsch ..
3rd Edit: Die Affinitätsmaske kann jetzt auch mit % als Binärmaske übergeben werden. Wenn die Affinitätsmaske größer als die im System vorhandenen Kerne ist wird sie auf die vorhandenen Kerne beschränkt. Danke an @iamunknown
Virustotal-Scan für die Exe: 1/72
Anhänge
Zuletzt bearbeitet: