Dies ist der Code, den ich verwende:
< pre class="lang-cs Prettyprint-override">
Code: Select all
internal static unsafe WorkingSetInfo? GetWorkingSetInfo(SafeProcessHandle processHandle)
{
Settings.Log.Info("Called method: GetWorkingSetInfo");
uint size = 16;
void* pointer = Alloc(size);
int error;
Settings.Log.Debug("Retrieving info on working set...");
bool result = QueryWorkingSet(processHandle, pointer, size);
while (!result)
{
error = GetLastPInvokeError();
if (error is ERROR_BAD_LENGTH)
{
size *= 2;
pointer = Realloc(pointer, size);
result = QueryWorkingSet(processHandle, pointer, size);
}
else
{
Settings.Log.DebugFormat("Failed to retrieve info on working set: {0} ({1})", GetLastPInvokeErrorMessage(), error);
Free(pointer);
return null;
}
}
PSAPI_WORKING_SET_INFORMATION info = new();
ulong* dataPointer = (ulong*)pointer;
info.NumberOfEntries = new(*dataPointer);
dataPointer += 1;
info.WorkingSetInfo = new nuint[info.NumberOfEntries];
for (var i = 0; i < info.NumberOfEntries.ToUInt32(); i++)
{
info.WorkingSetInfo[i] = new(*dataPointer);
dataPointer += 1;
}
Free(pointer);
uint pageSize = GetMemoryPageSize();
return new(info, pageSize);
}
Gibt es eine Möglichkeit, es zu optimieren, oder eine Alternative? Wie erhalte ich die Daten (ich verwende die Funktion QueryWorkingSet)?
Ich kann die native API verwenden, wenn es keine Alternative gibt.