Пытаюсь получить структуру PROCESS_BASIC_INFORMATION. Код упростил до нельзя. Помогите понять почему не работает Код (Text): HANDLE hProcess = GetCurrentProcess(); ULONG mSize = 0x8000; PVOID mPtr = HeapAlloc(hHeap, 0, mSize); ULONG ReturnLength; NTSTATUS status; status = ZwQueryInformationProcess(hProcess, 0, mPtr, mSize, &ReturnLength); Ситуация после выполнения ZwQueryInformationProcess следующая. status = STATUS_INFO_LENGTH_MISMATCH. ReturnLength = 3435973836
Это сделали, возможно, чтобы лишний раз не обращаться к ядру за объектом, который и так из текущего процесса полностью доступен, но об этом знает только WinAPI. Native не в курсе.
если хочешь hCurrentProcess hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, GetCurrentProcessId()); и будет тебе hProcess
max7C4 Ерунда. Native API прекрасно работают с псевдохэндлами. P.S. Где-то ещё тут видел мнение, что WriteProcessMemory нельзя с -1 использовать. Тоже ерунда.
Спасибо. Handle действительно был не верный. Я переписал код: Код (Text): HANDLE hProcess; ULONG mSize = 0x8000; PVOID mPtr = HeapAlloc(hHeap, 0, mSize); ULONG ReturnLength; NTSTATUS status; hProcess = OpenProcess(PROCESS_ALL_ACCESS, true, GetCurrentProcessId()); if (hProcess != NULL){ status = ZwQueryInformationProcess(hProcess, 0, mPtr, mSize, &ReturnLength); } хэндл процесса корректный а функция работает так же: status = STATUS_INFO_LENGTH_MISMATCH. ReturnLength = CCCCCCCCh
Можете показать как это сделать? Мне нужно получить PEB другого процессы, чтобы вытащить список загруженных модулей
Код (Text): LPVOID GetProcInfo(IN HANDLE hProcess, IN PROCESSINFOCLASS tInfo) { NTSTATUS ntStatus; LPVOID lpData = NULL; DWORD dwSize = sizeof(PROCESS_BASIC_INFORMATION); do { lpData = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE); if (lpData == NULL) { break; } ntStatus = NtQueryInformationProcess(hProcess, tInfo, lpData, dwSize, NULL); if (NT_SUCCESS(ntStatus) == TRUE) { break; } VirtualFree(lpData, 0, MEM_RELEASE); lpData = NULL; dwSize <<= 1; } while (ntStatus == STATUS_INFO_LENGTH_MISMATCH); return lpData; } HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()); if (hProcess != INVALID_HANDLE_VALUE) { LPVOID lpRet = GetProcInfo(hProcess, ProcessBasicInformation); if (lpRet != NULL) { DbgPrintf("PROCESS INFO ADDRESS: 0x%08X", lpRet); VirtualFree(lpRet, 0, MEM_RELEASE); } CloseHandle(hProcess); } ExitProcess(0);
sizeof(PROCESS_BASIC_INFORMATION) == 00000018h - это ключевой момент, если задать 0x1000, то выйдет ошибка.