вызов PNtQuerySystemInformation из dll на 64-битном компьютере

Следующая программа для получения всей информации о процессе с моего компьютера. То же самое приложение, когда оно вызывается через dll, не может получить информацию о системном процессе.

// TestSysInternals.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"#include <windows.h>
#include "ntdll.h"
#include <Winternl.h>

#define VISTA_FILETYPE  25
#define XP_FILETYPE 28static PNtQuerySystemInformation NtQuerySystemInformation_dynamic = NULL;
static DWORD curPid = 0;
static int nFileHandleType;
#define STATUS_INFO_LENGTH_MISMATCH 0xC0000004
int _tmain(int argc, _TCHAR* argv[])
{

NtQuerySystemInformation_dynamic = (PNtQuerySystemInformation)GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), ("NtQuerySystemInformation"));
//                                   (PNtQuerySystemInformation)GetProcAddress(GetModuleHandle(_T("ntdll.dll")),     _("NtQuerySystemInformation"));
nFileHandleType = XP_FILETYPE;
NTSTATUS status;
DWORD size = sizeof(SYSTEM_HANDLE_INFORMATION);
PSYSTEM_HANDLE_INFORMATION pSysHandleInformation = (PSYSTEM_HANDLE_INFORMATION)malloc(size);
DWORD needed = 0;
int nfound = 0;
while (!NT_SUCCESS(status = NtQuerySystemInformation_dynamic(SystemHandleInformation, pSysHandleInformation, size, &needed)))
{
if (status != STATUS_INFO_LENGTH_MISMATCH
|| needed == 0)
{
//DBGLOG("==>Failed Status=%l(%#X) Needed=%lu", status, status, needed);
goto CLEAN;// some other error
}
// The previously supplied buffer wasn't enough.
size = needed + 1024;
pSysHandleInformation = (PSYSTEM_HANDLE_INFORMATION)realloc(pSysHandleInformation, size);
}
DWORD i;
for (i = 0; i < pSysHandleInformation->Count; i++)
{
DWORD handlePid = pSysHandleInformation->Handles[i].ProcessID;

}CLEAN:
free(pSysHandleInformation);
return nfound;
return 0;
}

Заголовочный файл

#ifndef NT_DLL_H_INCLUDED
#define NT_DLL_H_INCLUDED
#include <Winternl.h>
#include <Windows.h>

typedef DWORD(WINAPI *PNtQuerySystemInformation)(DWORD, VOID*, DWORD, ULONG*);

typedef struct _SYSTEM_HANDLE
{
DWORD   ProcessID;
BYTE    HandleType;
BYTE    HandleFlags;
WORD    HandleNumber;
DWORD   KernelAddress;
DWORD   Flags;
} SYSTEM_HANDLE, *PSYSTEM_HANDLE;

typedef struct _SYSTEM_HANDLE_INFORMATION
{
DWORD           Count;
SYSTEM_HANDLE   Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

#define NT_SUCCESS_K(Status) ((NTSTATUS)(Status) >= 0)
#define SystemHandleInformation (DWORD)0x10#endif

Когда проверил pSysHandleInformation->HandleС помощью отладочного массива я мог видеть следующую информацию.

введите описание изображения здесь

Согласно рисунку, он дает реальный идентификатор процесса для значения processID. Однако, когда я помещаю один и тот же код в dll, значение processID получает действительно большие значения, которых на моем компьютере действительно не существует, ниже приведен скриншот значений идентификатора процесса, которые я получаю, когда запускаю тот же код через dll. Я понятия не имею, почему приложение ведет себя по-разному, когда один и тот же код запускается через DLL.
Высоко ценю любые мысли об этом проводном поведении.

введите описание изображения здесь

-2

Решение

Эта функция в значительной степени устарела, вы должны использовать GetSystemInfo для чего-то более нового, чем Win2000 \ XP. Трудно пробиться через унаследованный код C (здесь нет ничего от C ++), но можно заметить, что вы используете класс SystemHandleInformation, который не задокументирован, откуда он взялся? Это должно по SystemProcessInformation. Эта информация может быть получена с помощью GetProcessMemoryInfo.

Структура для SystemProcessInformation будет соответственно:

typedef struct _SYSTEM_PROCESS_INFORMATION {
ULONG NextEntryOffset;
BYTE Reserved1[52];
PVOID Reserved2[3];
HANDLE UniqueProcessId;
PVOID Reserved3;
ULONG HandleCount;
BYTE Reserved4[4];
PVOID Reserved5[11];
SIZE_T PeakPagefileUsage;
SIZE_T PrivatePageCount;
LARGE_INTEGER Reserved6[6];
} SYSTEM_PROCESS_INFORMATION;

Чтобы получить число процессов, используйте вместо этого GetProcessHandleCount.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]