Система Windows Обработка итерация и фильтрация с помощью ProcessID - ntquerysysteminformation winapi windowsC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Система Windows Обработка итерация и фильтрация с помощью ProcessID - ntquerysysteminformation winapi windows

Сообщение Anonymous »

Я пытаюсь создать класс C#, который способен вернуть все системы системного процесса, данного его ProcessID. После некоторых исследований в основном незарегистрированных вызовах функций и необходимых возвращаемых значений я столкнулся с следующей задачей. Однако всякий раз, когда я пытаюсь получить значение Processids Pointers < /p>
Marshal.ReadInt64(handle.POwnerPID) // in GetHandles()
< /code>
Я получаю расширение нарушения доступа -> либо память защищена, либо повреждена. Однако программа и отладчик запускаются как администратор. Я думаю, что мои структуры не верны? Я искал несколько источников, которые указывают на один и тот же размер структуры. < /P>
Пример ручки из списка: < /p>
AccessMask 0 uint
CreatorBackTraceIndex 0 ushort
HandleFlags 3503129008 uint
ObjectType 0 ushort
PHandleValue 0x002c00000012007f System.IntPtr
PObject 0x0000000000000004 System.IntPtr
POwnerPID 0x00000000000007f8 System.IntPtr
Reserve 4294956941 uint

sidenotes:
Почему используется system_handle_table_entry_info_ex, а не базовая функция (база поддерживает только PID до Ushort Size) :
Почему не может получить идентификатор процесса, который более 65535 по 'ntquerysysteminformation' in win7 64bit? < /p>
Используемая документация: < /p>
https : //www.geOffChappell.com/studies/windows/k ... try_ex.htm? ts = 0,219
Текущая реализация: < /p>
private enum NTSTATUS : uint
{
STATUS_SUCCESS = 0x00000000,
STATUS_INFO_LENGTH_MISMATCH = 0xC0000004
}

[Flags]
private enum SYSTEM_INFORMATION_CLASS : uint
{
SystemHandleInformation = 16,
SYSTEM_EXTENDED_HANDLE_INFORMATION = 64,

}

[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX
{
public IntPtr PObject; //
public IntPtr POwnerPID;
public IntPtr PHandleValue;
public uint AccessMask;
public ushort CreatorBackTraceIndex;
public ushort ObjectType;
public uint HandleFlags;
public uint Reserve;
}

static List GetAllHandles()
{
int bufferSize = 0x10000;
IntPtr buffer = Marshal.AllocHGlobal(bufferSize);
int requiredSize;

NTSTATUS status = NtQuerySystemInformation(
SYSTEM_INFORMATION_CLASS.SYSTEM_EXTENDED_HANDLE_INFORMATION,
buffer,
bufferSize,
out requiredSize
);

while (status == NTSTATUS.STATUS_INFO_LENGTH_MISMATCH)
{
Marshal.FreeHGlobal(buffer);
bufferSize = requiredSize;
buffer = Marshal.AllocHGlobal(bufferSize);
status = NtQuerySystemInformation(
SYSTEM_INFORMATION_CLASS.SYSTEM_EXTENDED_HANDLE_INFORMATION,
buffer,
bufferSize,
out requiredSize
);
}

if (status != NTSTATUS.STATUS_SUCCESS)
{
Marshal.FreeHGlobal(buffer);
return new List();
}

List handles = new List();
long baseAddress = buffer.ToInt64() +0x10;
long handleCount = Marshal.ReadInt64(buffer);
int structSize = Marshal.SizeOf(typeof(SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX));

for (long i = 0; i < handleCount; i++)
{
IntPtr current = new IntPtr(baseAddress + IntPtr.Size + (i * structSize));
SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX handleInfo = Marshal.PtrToStructure(current);
handles.Add(handleInfo);
}

Marshal.FreeHGlobal(buffer);
return handles;
}

public static List GetHandles(Process targetProcess, List handles)
{
List processHandles = new List();

foreach (var handle in handles)
{
long proid = Marshal.ReadInt64(handle.POwnerPID);
if (Marshal.ReadInt32(handle.POwnerPID) == targetProcess.Id)
{
processHandles.Add(handle);
}
}

return processHandles;
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... steminform
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»