Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Текущее состояние памяти процесса 
:(
    Опции темы
Riq
Дата 6.5.2013, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 6.5.2013
Где: Екб

Репутация: нет
Всего: нет



Здравствуйте! Помогите пожалуйста разобраться.
Мне было нужно написать программу для определения текущего состояния памяти процесса на ассемблере и С++ с функциями winApi.
среды разработки: ассемблер в tasm5, С++ в Borland C++ Builder.
На ассемблере я  смог написать, а вот с С++ у меня проблемы. Буду рад любой помощи.
Вот мой код на ассемблере
Код

.386
model flat,STDCALL
include win32.inc
extrn    BeginPaint:PROC
extrn    CreateWindowExA:PROC
extrn    DefWindowProcA:PROC
extrn    DispatchMessageA:PROC
extrn    EndPaint:PROC
extrn    ExitProcess:PROC
extrn    GetMessageA:PROC
extrn    GetModuleHandleA:PROC
extrn    LoadCursorA:PROC
extrn    LoadIconA:PROC
extrn    MessageBoxA:PROC
extrn    PostQuitMessage:PROC
extrn    RegisterClassA:PROC
extrn    ShowWindow:PROC
extrn    UpdateWindow:PROC
extrn    SendMessageA:proc
extrn    SetFocus:proc
extrn    GetClientRect:proc
extrn    VirtualQuery:PROC
extrn    VirtualQueryEx:PROC
extrn    _wsprintfA:PROC
extrn            TextOutA:PROC
.data
hed    dd 0
newhwnd    dd 0
lppaint PAINTSTRUCT <?>
msg    MSGSTRUCT <?>
wc    WNDCLASS <?>
mbi     MEMORY_BASIC_INFORMATION <?>
vbm    dd 400000h
rct    RECT <?>
hInst    dd 0
szTitleName db'Карта адресного пространства процесса',0
szClassName db'ASMCLASS32',0
szClassName1 db'edit',0
lpfor    db'Базовый адрес: %#X,Тип: %#X, Состояние: %#X, Размер: %#X, Атриб_защиты: %#X',0
lpstr    db    128    dup    (0)
Buffer    db    4096    dup    (0)
.code
start: 
call GetModuleHandleA,0
mov    [hInst], eax
reg_class:
mov    [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
mov    [wc.clsLpfnWndProc], offset WndProc
mov    [wc.clsCbClsExtra], 0
mov    [wc.clsCbWndExtra], 0
mov    eax, [hInst]
mov    [wc.clsHInstance], eax
call    LoadIconA,0,IDI_APPLICATION
mov    [wc.clsHIcon], eax
call    LoadCursorA,0,IDC_ARROW
mov    [wc.clsHCursor], eax
mov    [wc.clsHbrBackground],COLOR_WINDOW + 1
mov    dword ptr [wc.clsLpszMenuName],0
mov    dword ptr [wc.clsLpszClassName],offset szClassName
call    RegisterClassA,offset wc
call    CreateWindowExA,0,offset szClassName,offset szTitleName,WS_OVERLAPPEDWINDOW+WS_MAXIMIZE,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,[hInst],0
mov    [newhwnd], eax
call    ShowWindow,[newhwnd],SW_SHOWNORMAL
call    UpdateWindow,[newhwnd]
msg_loop:
call    GetMessageA,offset msg,0,0,0
cmp    ax, 0
je end_loop
call    DispatchMessageA,offset msg
jmp msg_loop
end_loop:
push    [msg.msWPARAM]
call    ExitProcess
WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
 LOCAL hDC:DWORD
cmp    [wmsg], WM_DESTROY
je    wmdestroy
cmp    [wmsg], WM_SIZE
je    wmsize
cmp    [wmsg], WM_CREATE
je    wmcreate
cmp    [wmsg], WM_LBUTTONDOWN
je    wmlbuttondown
cmp    [wmsg], WM_PAINT
je    wmpaint
jmp    defwndproc
wmpaint:
mov    eax, 0
jmp    finish
wmcreate:
call    GetClientRect,[hwnd],offset rct
sub    [rct.rcRight],20
sub    [rct.rcBottom],20
call    CreateWindowExA,WS_EX_CLIENTEDGE,offset szClassName1,0,WS_VISIBLE or WS_CHILD or ES_LEFT OR ES_MULTILINE or ES_AUTOHSCROLL or ES_AUTOVSCROLL,0,0,[rct.rcRight],[rct.rcBottom],[hwnd],0,[hInst],0
mov    [hed],eax
mov    edi,offset Buffer
cld
qq4:    mov esi,offset lpstr
call    VirtualQuery,[vbm],offset mbi,size mbi
call    _wsprintfA,offset lpstr,offset lpfor,[mbi.BaseAddress],[mbi.lType],[mbi.State],[mbi.RegionSize],[mbi.AllocationProtect]
mov    ecx,eax
rep    movsb
mov    [edi],byte ptr 13
inc    edi
mov    [edi],byte ptr 10
inc    edi
mov    ebx,[mbi.RegionSize]
add    [vbm],ebx
cmp    [vbm],7ffff00h
jb qq4
mov    [edi],byte ptr 0
call    SendMessageA,[hed],WM_SETTEXT,0,offset Buffer
call    SetFocus,[hed]
mov    eax, 0
jmp    finish
defwndproc:
call    DefWindowProcA,[hwnd],[wmsg],[wparam],[lparam]
jmp    finish
wmdestroy:
call    PostQuitMessage, 0
mov    eax, 0
jmp    finish
wmlbuttondown:
call    SendMessageA,[newhwnd],WM_DESTROY,0,0
mov    eax, 0
jmp    finish
wmsize:
mov    eax, 0
finish:
ret
WndProc endp
public WndProc
 end start

вот мой код на С++, все что смог осилить. 
Прога пока только создает основное и дочернее окно, ну и закрывается по клику мыши. 
если ориентироваться по асм коду, то осталось в WM_CREATE правильно написать пару функций и должно все работать, но у меня не получается осилить.
Код

#include <windows.h>
#include <stdio.h>
DWORD qq;
char szClassName1[]="edit";
HINSTANCE    hInstance;
HWND hEdit;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
hInstance=GetModuleHandle(0);
WNDCLASS WndClass;
MSG Msg;
char szClassName[]="MenuWindow";
WndClass.style=CS_HREDRAW|CS_VREDRAW|CS_GLOBALCLASS;
WndClass.lpfnWndProc=WndProc;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hInstance=hInstance;
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hbrBackground=(HBRUSH) COLOR_WINDOW;
WndClass.lpszMenuName=NULL;
WndClass.lpszClassName=szClassName;
if (!RegisterClass(&WndClass))
{
MessageBox(NULL,"Cannot register class","Error",MB_OK);
return 0;
}
hWnd=CreateWindowEx(0,szClassName,"Карта адресного пространства процесса",
WS_OVERLAPPEDWINDOW|WS_MAXIMIZE,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
if(!hWnd)
{
MessageBox(NULL,"Cannot create window","Error",MB_OK);
return 0;
}
ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);

while(GetMessage(&Msg,NULL,0,0))
{

DispatchMessage(&Msg);
}
return Msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT Message,
UINT wParam,LONG lParam)
{
RECT rect;
MEMORY_BASIC_INFORMATION mbi;
switch(Message)
{
case WM_CREATE:
GetClientRect (hWnd,&rect);
rect.right-=20;
rect.bottom-=20;
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,szClassName1,0,
WS_VISIBLE|WS_CHILD|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,
0,0,rect.right,rect.bottom,hWnd,(HMENU)0,hInstance,NULL);
VirtualQuery ((void *)400000, &mbi, sizeof(mbi));
/* начало затруднений. не могу осилить

qq = wsprintf ((char *)40,
(char *)"Базовый адрес: %#X,Тип: %#X, Состояние: %#X, Размер: %#X, Атриб_защиты: %#X",
(char *)mbi.BaseAddress,mbi.Type,mbi.State,mbi.RegionSize,mbi.AllocationProtect);

//SendMessage(hEdit,WM_SETTEXT,0,(long)4096);
// конец затруднений */

SetFocus(hEdit);
return 0;
case WM_LBUTTONDOWN:
 SendMessage(hWnd, WM_DESTROY,0,0);
 return 0;
case WM_DESTROY:
    PostQuitMessage(0);
   return 0;
}
return DefWindowProc(hWnd,Message,wParam,lParam);
}

Результат работы программы, написанной на ассемблере, во вложении.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  mbi.zip 4,69 Kb
PM MAIL   Вверх
volatile
Дата 7.5.2013, 00:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(Riq @  6.5.2013,  22:05 Найти цитируемый пост)
/* начало затруднений. не могу осилить

qq = wsprintf ((char *)40,
(char *)"Базовый адрес: %#X,Тип: %#X, Состояние: %#X, Размер: %#X, Атриб_защиты: %#X",
(char *)mbi.BaseAddress,mbi.Type,mbi.State,mbi.RegionSize,mbi.AllocationProtect);

//SendMessage(hEdit,WM_SETTEXT,0,(long)4096);
// конец затруднений */

Вы пишете строку в системную область, (адрес 40 десятич.) 
Затем вы отправляете "текст" находящийся в системной области (но уже по адресу 4096) в окно.
Хотелось бы знать, какую траву курил тот, кто писал это...  smile 
PM MAIL   Вверх
Riq
Дата 7.5.2013, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 6.5.2013
Где: Екб

Репутация: нет
Всего: нет



Цитата(volatile @ 7.5.2013,  00:04)
Цитата(Riq @  6.5.2013,  22:05 Найти цитируемый пост)
/* начало затруднений. не могу осилить

qq = wsprintf ((char *)40,
(char *)"Базовый адрес: %#X,Тип: %#X, Состояние: %#X, Размер: %#X, Атриб_защиты: %#X",
(char *)mbi.BaseAddress,mbi.Type,mbi.State,mbi.RegionSize,mbi.AllocationProtect);

//SendMessage(hEdit,WM_SETTEXT,0,(long)4096);
// конец затруднений */

Вы пишете строку в системную область, (адрес 40 десятич.) 
Затем вы отправляете "текст" находящийся в системной области (но уже по адресу 4096) в окно.
Хотелось бы знать, какую траву курил тот, кто писал это...  smile

Да видимо травка была  не подходящая smile.
Ну а  по делу,  я   с программированием  знаком не так давно,  но на ассемблере немного легче идет прогресс, чем  на С++. 
Весь код на С++ делал смотря код асма. Хотя да ошибочка, на ассемблере вместо 40 написано 128, но сути это не меняет.  На ассемблере в вм_крейте  создается цикл, сравнения, копирование байта, всё это и является для меня трудностью в С++. 
Если не сложно помогите разобраться пожалуйста.
PM MAIL   Вверх
volatile
Дата 7.5.2013, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(Riq @  6.5.2013,  22:05 Найти цитируемый пост)
lpstr    db    128    dup    (0)

Цитата(Riq @  7.5.2013,  17:22 Найти цитируемый пост)
на ассемблере вместо 40 написано 128, но сути это не меняет.

Как это не меняет?
У вас на асме буфер, размером 128, находицца в сегменте данных программы.
А на С у вас никакого буфера нет.
Вы просто пишете фиг знает куда, по адресу 40.
Вы что, не понимате разницы между адресом и размером?

Riq, вам нужно создать буфер (например на стеке), и писать в него.
и пересылать в окно, тоже из этого буфера.




Это сообщение отредактировал(а) volatile - 7.5.2013, 23:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.