Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Неверный результат работы функции   Найти похожие ветки 

 
Андрей Жук ©   (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 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.055 c
14-1122140424
X9
2005-07-23 21:40
2005.08.14
2 компа + 2 сет.платы + витая пара = troubles


1-1122023678
DimaBr
2005-07-22 13:14
2005.08.14
Handle окна компонента


1-1122536697
Kolan
2005-07-28 11:44
2005.08.14
Как правильно прекратить работу потока?


1-1122113340
Al_jus
2005-07-23 14:09
2005.08.14
Проблема с ДЛЛ


14-1122138039
xroot
2005-07-23 21:00
2005.08.14
!!! Где тут модеры!!!