Вот код, который я использую:
Код: Выделить всё
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);
}
Есть ли способ его оптимизировать или альтернативный способ получения данных (я использую функцию QueryWorkingSet)?
Я могу использовать Native API, если альтернативы нет.
Подробнее здесь: https://stackoverflow.com/questions/793 ... -a-process