![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неверный результат работы функции
Андрей Жук © (2005-06-10 15:01:00)В продолжение...
BASE_ADDRESS[16]
MEMORY_BASIC_INFORMATION ProcessMemory;
HANDLE Process = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,false,PID);
VirtualQueryEx(Process,NULL,&ProcessMemory,sizeof(ProcessMemory));
wsprintf(BASE_ADDRESS,"%u",(DWORD)ProcessMemory.BaseAddress);
MessageBoxEx(hWindow,BASE_ADDRESS,"",MB_OK,419);
получаем всегда 0
Игорь Шевченко (2005-06-10 21:55:00) [1]alpet © (10.06.05 19:52) [27]
GetMappedFileName
alpet (2005-06-10 19:52:00) [2]VirtualQuery(Ex) используется для создания более подробной карты памяти. Например в Artmoney7 показывается информация не только о модулях, но и некоторых других смапленных файлах (например .nls). Интересно можно ли без драйвера (и API-перехвата) узнать и имя файла проекции, если известен ее адрес
Digitman (2005-06-10 17:59:00) [3]
> Андрей Жук © (10.06.05 17:55) [25]
)
только не забывай, что это актуальныйадрес модуля, а не предпочтительный, т.е. тот что указан в заголовке соотв. РЕ-файла.
Андрей Жук (2005-06-10 17:55:00) [4]тю, черт. HMODULE у меня и так есть. Я ж его из EnumProcessModules получаю...
Спасибо.
Digitman (2005-06-10 17:52:00) [5]ну чего ты мудришь ?)
берем, к примеру, Маздай (Win9x/Me)
для него рекомендуемы ф-ции в составе ToolHelp API, для твоей задачи в частности - Module32First/Next
открываем справку, читаем:
Retrieves information about the first/next module associated with a process.
BOOL WINAPI Module32First(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
Parameters
hSnapshot
Handle of the snapshot returned from a previous call to the CreateToolhelp32Snapshot function.
lpme
Address of a buffer containing a MODULEENTRY32 structure.
открываем описание структуры MODULEENTRY32, видим там :
typedef struct tagMODULEENTRY32 {
DWORD dwSize;
DWORD th32ModuleID;
DWORD th32ProcessID;
DWORD GlblcntUsage;
DWORD ProccntUsage;
BYTE * modBaseAddr;
DWORD modBaseSize;
HMODULE hModule;
char szModule[MAX_MODULE_NAME32 + 1];
char szExePath[MAX_PATH];
} MODULEENTRY32;
выделенное жирным (хэндл модуля) и есть базовый адрес модуля в АП процесса !
в PSAPI и NativeAPI в соотв.структурах ты тоже встретишь хэндл модуля, и это будет тот же самый базовый адрес модуля в АП процесса.
Андрей Жук (2005-06-10 17:43:00) [6]В МСДН нашел, что ImageBase можно получить из
AUX_MODULE_BASIC_INFO
которая идет с
Windows Auxiliary API library version 1.0 or later
а иначе как?
Digitman (2005-06-10 17:22:00) [7]
> Андрей Жук © (10.06.05 15:49) [12]
> А как базовый адресс получить иначе?
базовый адрес чего? модуля ?
перечисляй модули любым док.способом (toolhelp, psapi, nativeAPI), любой из них дает инф-цию об ImageBase модулей
VirtualQuery[Ex] же знать ничего не знает ни о каких "модулях", это из иной оперы, минимум одним уровнем ниже ..
Игорь Шевченко (2005-06-10 17:22:00) [8]Андрей Жук © (10.06.05 17:17) [20]
Это да. Сайт обновить у меня не получается. Не взыщи :)
Андрей Жук (2005-06-10 17:17:00) [9]Значит на сайте в QuerySystemInformation более старый класс лежит.
Игорь Шевченко (2005-06-10 17:13:00) [10]Андрей Жук © (10.06.05 16:52) [17]
> Ничего я не искал. Я его просто компилил.
Зря. Я выкладываю код не для компиляции, а для показа, как можно реализовать ту или иную идею. Все, что для компиляции лежит на сайте все.
Андрей Жук (2005-06-10 17:07:00) [11]т.е.
Address = DWORD(mbi.BaseAddress) + mbi.RegionSize;
?
Андрей Жук (2005-06-10 16:52:00) [12]Ничего я не искал. Я его просто компилил.
NtProcessInfo из твоей же проги QuerySystemInformation, что на сайте лежит
Игорь Шевченко (2005-06-10 16:49:00) [13]Андрей Жук © (10.06.05 16:14) [15]
Вот как ? Ты, если не секрет, поделись, откуда взял NtProcessInfo, а то в моей версии
THSNtProcessInfo = class
private
function GetProcessName: string;
function GetUserName: string;
public
Info: SYSTEM_PROCESSES_NT2000;
Threads: THSNtThreadInfoList;
constructor Create (const AInfo: SYSTEM_PROCESSES_NT2000);
constructor CreateNt4 (const AInfo: SYSTEM_PROCESSES_NT4);
destructor Destroy; override;
property ProcessName: string read GetProcessName;
property UserName: string read GetUserName;
end;
....
function THSNtProcessInfo.GetProcessName: string;
begin
Result := HSUnicodeStringToAnsiString(Info.ProcessName);
end;
И эта...ошибки не надо у меня искать. Я обычно выкладываю код, скомпилированный без ошибок.
Андрей Жук (2005-06-10 16:14:00) [14]Кстати, в том исходнике есть ошибка (возможна, для D6)
cbProcesses.Items.AddObject(FProcessesInfo[I].ProcessName,
не компилируется
компилируется если
cbProcesses.Items.AddObject(FProcessesInfo[I].Info.ProcessName.Buffer
alpet (2005-06-10 16:12:00) [15]Начинай с 0, и прибавляй размер региона.
Игорь Шевченко (2005-06-10 16:04:00) [16]Андрей Жук © (10.06.05 15:49) [12]
В соседней ветке код выложен. Читай и воздастся тебе
Андрей Жук (2005-06-10 15:49:00) [17]А как базовый адресс получить иначе?
Digitman (2005-06-10 15:45:00) [18]
> вывод модулей работает
тебе просто модули нужно перечислить - имена + базовые адреса ?
а зачем тогда понадобилась VirtualQueryEx ?
Digitman (2005-06-10 15:38:00) [19]
> так смысл тогда этого параметра?
а это не параметр, это - результат.
параметр - это
LPCVOID lpAddress, // address of region
ты передаешь в ф-цию некий адрес, а ф-ция возвращает тебе инф-цию о регионе, которому этот адрес принадлежит
к Imagebase модулей процесса эта инф-ция не имеет непосред.отношения.
Некий модуль может существовать или не существовать в АП процесса, а регионы там существуют всегда.
Суслик (2005-06-10 15:29:00) [20]
> [8] Андрей Жук © (10.06.05 15:29)
скачай с сайта Подгорецкого эл. вариант :)