Новичок
Профиль
Группа: Участник
Сообщений: 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
|