Я пытаюсь создать класс C#, который способен вернуть все системы системы процесса, данного его идентификатором процесса. После некоторых исследований в основном незарегистрированных вызовах функций и необходимых возвращаемых значений я столкнулся с следующей проблемой. < /P>
Handlecount приблизительно соответствует количеству грандиозного счета, сообщаемого Manager Task Manager (на 5%-меньше?). Однако всякий раз, когда я пытаюсь получить значение указателя ProcessID: < /p>
Marshal.ReadInt64(handle.POwnerPID) // in GetHandles()
< /code>
Я получаю исключение по нарушению доступа -> либо память защищена, либо повреждена. Тем не менее, программа и отладчик работают как администратор. Я предполагаю, что мои структуры не верны? Я искал несколько источников, которые указывают на один и тот же размер структуры. PrettyPrint-Override ">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 используется, а не базовая функция (база поддерживает только PIDS вверх к размеру размер): < /p>
Почему не может получить идентификатор процесса, который более 65535 по 'ntquerysysteminformation' in win7 64bit? < /p>
Используемая документация: < /p>
https://www.geoffchappell.com/studies/w ... m?ts=0,219
текущая реализация:
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();
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 + (2*IntPtr.Size) + (i * structSize)); //EDIT1: Array of handles starts after two pointer sizes in struct, see comments for more info.
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 ... tem-handle
Нарушение доступа с использованием ntquerysysteminformation для обработки системы итерации системы Windows и фильтрации ⇐ C#
Место общения программистов C#
1738863958
Anonymous
Я пытаюсь создать класс C#, который способен вернуть все системы системы процесса, данного его идентификатором процесса. После некоторых исследований в основном незарегистрированных вызовах функций и необходимых возвращаемых значений я столкнулся с следующей проблемой. < /P>
Handlecount приблизительно соответствует количеству грандиозного счета, сообщаемого Manager Task Manager (на 5%-меньше?). Однако всякий раз, когда я пытаюсь получить значение указателя ProcessID: < /p>
Marshal.ReadInt64(handle.POwnerPID) // in GetHandles()
< /code>
Я получаю исключение по нарушению доступа -> либо память защищена, либо повреждена. Тем не менее, программа и отладчик работают как администратор. Я предполагаю, что мои структуры не верны? Я искал несколько источников, которые указывают на один и тот же размер структуры. PrettyPrint-Override ">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
[b] sidenotes: [/b]
Почему system_handle_table_entry_info_ex используется, а не базовая функция (база поддерживает только PIDS вверх к размеру размер): < /p>
Почему не может получить идентификатор процесса, который более 65535 по 'ntquerysysteminformation' in win7 64bit? < /p>
Используемая документация: < /p>
https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/ex/sysinfo/handle_table_entry_ex.htm?ts=0,219
[b] текущая реализация: [/b]
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();
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 + (2*IntPtr.Size) + (i * structSize)); //EDIT1: Array of handles starts after two pointer sizes in struct, see comments for more info.
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79418239/access-violation-using-ntquerysysteminformation-to-iterate-windows-system-handle[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия