Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.351 c
14-1122109559
lookin
2005-07-23 13:05
2005.08.14
Что вы получите? Маленький тест.


14-1122276040
ArchValentin
2005-07-25 11:20
2005.08.14
Создание отчётов


4-1118655501
ATarget
2005-06-13 13:38
2005.08.14
остановить драйвер


14-1122308065
Agent13
2005-07-25 20:14
2005.08.14
Spamers must die!


3-1120746705
Pil
2005-07-07 18:31
2005.08.14
получение данных из БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский