Получить структуру по ее указателю в C++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Получить структуру по ее указателю в C++

Сообщение Anonymous »


Я пытаюсь получить информацию об дескрипторах процесса из функции NtQuerySystemInformation(). У меня есть следующий код:

#include #include #include #include #define SystemHandleInformation 0x10 #define SystemHandleInformationSize 1024 * 1024 * 2 используя fNtQuerySystemInformation = NTSTATUS(WINAPI*)( УЛОНГ СистемнаяИнформацияКласс, Системная информация PVOID, ULONG SystemInformationLength, ПУЛОНГ ВозвратДлина ); структура typedef _DEVICE_OBJECT* PDEVICE_OBJECT; структура typedef _PVPB* PVPB; typedef структура _KEVENT* PKEVENT; структура typedef _IO_COMPLETION_CONTEXT* PIO_COMPLETION_CONTEXT; структура typedef _SYSTEM_HANDLE_TABLE_ENTRY_INFO { USHORT УникальныйИдентификаторПроцесса; USHORT CreatorBackTraceIndex; UCHAR ObjectTypeIndex; UCHAR HandleAttributes; USHORT HandleValue; ПВОИД-объект; УЛОНГ предоставлен доступ; } SYSTEM_HANDLE_TABLE_ENTRY_INFO, * PSYSTEM_HANDLE_TABLE_ENTRY_INFO; структура typedef _SYSTEM_HANDLE_INFORMATION { ULONG NumberOfHandles; SYSTEM_HANDLE_TABLE_ENTRY_INFO Дескрипторы[1]; } SYSTEM_HANDLE_INFORMATION, * PSYSTEM_HANDLE_INFORMATION; структура typedef _SECTION_OBJECT_POINTERS { PVOID DataSectionObject; PVOID SharedCacheMap; PVOID ImageSectionObject; } SECTION_OBJECT_POINTERS, * PSECTION_OBJECT_POINTERS; структура typedef _FILE_OBJECT { КОРОТКИЙ тип; КОРОТКИЙ Размер; PDEVICE_OBJECT DeviceObject; ПВПБ Впб; PVOID FsContext; PVOID FsContext2; PSECTION_OBJECT_POINTERS РазделОбъектПоинтер; PVOID PrivateCacheMap; ДЛИННЫЙ FinalStatus; структура _FILE_OBJECT *RelatedFileObject; UCHAR LockOperation; UCHARDeletePending; UCHAR ReadAccess; UCHAR WriteAccess; УЧАР УдалитьДоступ; UCHAR SharedRead; UCHAR SharedWrite; UCHAR SharedDelete; УЛОНГ Флаги; UNICODE_STRING Имя файла; LARGE_INTEGER CurrentByteOffset; УЛОНГ Официанты; УЛОНГ занят; PVOID LastLock; ПКЕВЕНТ Замок; ПКЕВЕНТ Событие; PIO_COMPLETION_CONTEXT Контекст завершения; УЛОНГ IrpListLock; LIST_ENTRY IrpList; PVOID FileObjectExtension; } FILE_OBJECT, * PFILE_OBJECT; интервал основной() { HANDLE hFile = CreateFileA("C:\\Users\\user\\Documents\\test.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ULONG returnLength = 0; fNtQuerySystemInformation NtQuerySystemInformation = (fNtQuerySystemInformation)GetProcAddress(GetModuleHandle(L"ntdll"), "NtQuerySystemInformation"); PSYSTEM_HANDLE_INFORMATION handleTableInformation = (PSYSTEM_HANDLE_INFORMATION)HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, SystemHandleInformationSize); NtQuerySystemInformation(SystemHandleInformation, handleTableInformation, SystemHandleInformationSize, &returnLenght); интервал PID = _getpid(); for (int i = 0; i NumberOfHandles; i++) { SYSTEM_HANDLE_TABLE_ENTRY_INFO handleInfo = (SYSTEM_HANDLE_TABLE_ENTRY_INFO)handleTableInformation->Handles; if (handleInfo.UniqueProcessId == PID && handleInfo.ObjectTypeIndex == 37) { printf_s("Обработка 0x%x в 0x%p, PID: %x\n", handleInfo.HandleValue, handleInfo.Object, handleInfo.UniqueProcessId); PFILE_OBJECT fileObj = (PFILE_OBJECT)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 1024 * 1024 * 2); memcpy(&fileObj, &handleInfo.Object, sizeof(fileObj)); printf_s("%d\n", fileObj->Type); } } вернуть 0; } В условии IF я проверяю PID handleInfo и то, равен ли тип объекта 37, что означает, что это файловый объект (это правильный индекс в Windows 10. В других ОС может быть иначе). В этом блоке IF мне нужно получить PFILE_OBJECT по его указателю, хранящемуся в handleInfo.Object. Но когда я вызываю функцию memcpy(), чтобы присвоить эту структуру переменной, я получаю ошибку Нарушение доступа к месту чтения.

Что я делаю не так? Как получить доступ к этой структуре? Мне нужно получить его тип, ReadAccess, WriteAccess, FileName и т. д.
Ответить

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

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

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

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

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