Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
ВнизНеверный результат работы функции Найти похожие ветки
← →
Андрей Жук © (2005-06-10 15:01) [0]В продолжение...
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
← →
Digitman © (2005-06-10 15:20) [1]
> получаем всегда 0
здесь 2 вызова ф-ций.
какая из них возвращает 0 и что говорит GetLasterror() ?
← →
Digitman © (2005-06-10 15:24) [2]или ты о том что ProcessMemory.BaseAddress = 0 ?
так это вполне нормально !
адрес самого первого региона в АП процесса как раз и равен 0.
← →
Андрей Жук © (2005-06-10 15:25) [3]ну если более полно то так
BASE_ADDRESS[16];
HMODULE hMods[1024];
MEMORY_BASIC_INFORMATION ProcessMemory;
HANDLE Process = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,false,PID);
if (Process!= INVALID_HANDLE_VALUE)
{
VirtualQueryEx(Process,NULL,&ProcessMemory,sizeof(ProcessMemory));
if(EnumProcessModules(Process, hMods, sizeof(hMods), &cbNeeded))
for (int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )
GetModuleFileNameEx(Process,hMods[i], szModName, sizeof(szModName)); wsprintf(BASE_ADDRESS,"%u",(DWORD)ProcessMemory.BaseAddress);
MessageBoxEx(hWindow,BASE_ADDRESS,"",MB_OK,419);
}
так что обе функции работают верно (вывод модулей работает)
← →
Андрей Жук © (2005-06-10 15:26) [4]
> адрес самого первого региона в АП процесса как раз и
> равен 0.
так смысл тогда этого параметра?
← →
Игорь Шевченко © (2005-06-10 15:27) [5]Рихтера читать
← →
Суслик © (2005-06-10 15:28) [6]
> Рихтера читать
я ему уже советовал
← →
Андрей Жук © (2005-06-10 15:28) [7]скажите мне смысл этого параметра, если он всегда равен нулю?
← →
Андрей Жук © (2005-06-10 15:29) [8]Ну нету у меня Рихтера. Есть только по .Net
← →
Суслик © (2005-06-10 15:29) [9]
> [8] Андрей Жук © (10.06.05 15:29)
скачай с сайта Подгорецкого эл. вариант :)
← →
Digitman © (2005-06-10 15:38) [10]
> так смысл тогда этого параметра?
а это не параметр, это - результат.
параметр - это
LPCVOID lpAddress, // address of region
ты передаешь в ф-цию некий адрес, а ф-ция возвращает тебе инф-цию о регионе, которому этот адрес принадлежит
к Imagebase модулей процесса эта инф-ция не имеет непосред.отношения.
Некий модуль может существовать или не существовать в АП процесса, а регионы там существуют всегда.
← →
Digitman © (2005-06-10 15:45) [11]
> вывод модулей работает
тебе просто модули нужно перечислить - имена + базовые адреса ?
а зачем тогда понадобилась VirtualQueryEx ?
← →
Андрей Жук © (2005-06-10 15:49) [12]А как базовый адресс получить иначе?
← →
Игорь Шевченко © (2005-06-10 16:04) [13]Андрей Жук © (10.06.05 15:49) [12]
В соседней ветке код выложен. Читай и воздастся тебе
← →
alpet © (2005-06-10 16:12) [14]Начинай с 0, и прибавляй размер региона.
← →
Андрей Жук © (2005-06-10 16:14) [15]Кстати, в том исходнике есть ошибка (возможна, для D6)
cbProcesses.Items.AddObject(FProcessesInfo[I].ProcessName,
не компилируется
компилируется еслиcbProcesses.Items.AddObject(FProcessesInfo[I].Info.ProcessName.Buffer
← →
Игорь Шевченко © (2005-06-10 16:49) [16]Андрей Жук © (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:52) [17]Ничего я не искал. Я его просто компилил.
NtProcessInfo из твоей же проги QuerySystemInformation, что на сайте лежит
← →
Андрей Жук © (2005-06-10 17:07) [18]т.е.
Address = DWORD(mbi.BaseAddress) + mbi.RegionSize;
?
← →
Игорь Шевченко © (2005-06-10 17:13) [19]Андрей Жук © (10.06.05 16:52) [17]
> Ничего я не искал. Я его просто компилил.
Зря. Я выкладываю код не для компиляции, а для показа, как можно реализовать ту или иную идею. Все, что для компиляции лежит на сайте все.
← →
Андрей Жук © (2005-06-10 17:17) [20]Значит на сайте в QuerySystemInformation более старый класс лежит.
← →
Игорь Шевченко © (2005-06-10 17:22) [21]Андрей Жук © (10.06.05 17:17) [20]
Это да. Сайт обновить у меня не получается. Не взыщи :)
← →
Digitman © (2005-06-10 17:22) [22]
> Андрей Жук © (10.06.05 15:49) [12]
> А как базовый адресс получить иначе?
базовый адрес чего ? модуля ?
перечисляй модули любым док.способом (toolhelp, psapi, nativeAPI), любой из них дает инф-цию об ImageBase модулей
VirtualQuery[Ex] же знать ничего не знает ни о каких "модулях", это из иной оперы, минимум одним уровнем ниже ..
← →
Андрей Жук © (2005-06-10 17:43) [23]В МСДН нашел, что ImageBase можно получить из
AUX_MODULE_BASIC_INFO
которая идет с
Windows Auxiliary API library version 1.0 or later
а иначе как?
← →
Digitman © (2005-06-10 17:52) [24]ну чего ты мудришь ?)
берем, к примеру, Маздай (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:55) [25]тю, черт. HMODULE у меня и так есть. Я ж его из EnumProcessModules получаю...
Спасибо.
← →
Digitman © (2005-06-10 17:59) [26]
> Андрей Жук © (10.06.05 17:55) [25]
)
только не забывай, что это актуальный адрес модуля, а не предпочтительный, т.е. тот что указан в заголовке соотв. РЕ-файла.
← →
alpet © (2005-06-10 19:52) [27]VirtualQuery(Ex) используется для создания более подробной карты памяти. Например в Artmoney7 показывается информация не только о модулях, но и некоторых других смапленных файлах (например .nls). Интересно можно ли без драйвера (и API-перехвата) узнать и имя файла проекции, если известен ее адрес
← →
Игорь Шевченко © (2005-06-10 21:55) [28]alpet © (10.06.05 19:52) [27]
GetMappedFileName
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.012 c