Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Подскажите API-функции


Автор: vzf 20.10.2006, 20:20
Здравствуйте. Подскажите, кто знает, функции дл определения следующих вещей:

- определение адреса, по которому загружен текущий процесс
- определение максимального и минимального адресов виртуальной памяти системы
- определение dll-модулей "подгружаемых" текущим процессом и адресов, по которым они загружены
- определение адресов, по которым текущий процесс не может производить запись

Буду очень признателен.

Автор: BUGOR 21.10.2006, 07:13
Цитата

- определение адреса, по которому загружен текущий процесс


GetModuleHandle(0);

Это даст смещение образа файла отображённого на память(ну или ImageBase данного процесса, думаю ты именно это имел ввиду), а каждый процесс имеет своё адресное пространство, которое начинается с 0x1000.

Цитата

- определение максимального и минимального адресов виртуальной памяти системы


Что это значит? Каждый процесс имеет своё собственное адресное пространство с адреса 0x1000 до 0x7FFFFFFF и общее пространство(которое доступно только на уровне ядра) начиная с 0x80000000 и до 0xFFFFFFFFF, это собственно  ты хотел узнать? Или самый высокий адресс памяти который используется? Тогда начиная со смещения 0x1000 вызывай:

Код

DWORD VirtualQuery(

    LPCVOID lpAddress,    // address of region 
    PMEMORY_BASIC_INFORMATION lpBuffer,    // address of information buffer  
    DWORD dwLength    // size of buffer 
   );


Пока она возвращает валидную структуру регионы памяти есть(шаг описка определяется MEMORY_BASIC_INFORMATION.RegionSize)

Цитата

- определение dll-модулей "подгружаемых" текущим процессом и адресов, по которым они загружены


Это легко делается с помощью CreateToolhelp32Snapshot с флагом TH32CS_SNAPMODULE, приводить пример не вижу смысла, их хватает и на этом форуме и в сети.

Цитата

- определение адресов, по которым текущий процесс не может производить запись


Опять же вызов VirtualQuery, которая в возвращаемой структуре MEMORY_BASIC_INFORMATION имеет поле AllocationProtect, проверяй его на аттрибут PAGE_READWRITE, PAGE_WRITECOPY, PAGE_EXECUTE_READWRITE и PAGE_EXECUTE_WRITECOPY.

Автор: vzf 21.10.2006, 21:33
Благодарю.

Автор: ЫукпШ 22.10.2006, 16:46
Цитата(vzf @ 20.10.2006,  20:20)
- определение адреса, по которому загружен текущий процесс

..WinMain (HINSTANCE hThisInst...

 hThisInst это и есть ImageBase.

 Для любого окна (контрола) приложения его можно определить:
Код

    hInstance  = (HINSTANCE)::GetWindowLong (hWnd,(int)GWL_HINSTANCE);

Автор: Damarus 22.10.2006, 16:56
Цитата(ЫукпШ @  22.10.2006,  17:46 Найти цитируемый пост)
..WinMain (HINSTANCE hThisInst... hThisInst это и есть ImageBase.

А если нет WinMain smile 

Автор: ЫукпШ 22.10.2006, 18:01
Цитата(Damarus @ 22.10.2006,  16:56)
А если нет WinMain smile


 У DLL это будет:
 .... DllMain (HANDLE hinstDLL..

 Кроме указанного выше способа - GetModuleHandle(0); - существуют и другие.  smile 
Например:
1. порыцца в PE заголовке конкретного модуля. smile 
2. сделать CreateProcess для PE-TOOLS и считать нужную
информацию из его окошка.  smile  


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)