Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2013, 14:52   #1
Rik_ekb
Новичок
Джуниор
 
Регистрация: 29.04.2013
Сообщений: 2
По умолчанию Переписать программу с ассемблера на С++

Здравствуйте! Помогите пожалуйста.
Задание: написать программу для определения текущего состояния памяти процесса на ассемблере и С++ с функциями win32Api.
среды разработки: ассемблер в 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
Результат работы программы на ассемблере во вложении
Вложения
Тип файла: zip mbi.zip (4.7 Кб, 7 просмотров)
Rik_ekb вне форума Ответить с цитированием
Старый 04.05.2013, 10:23   #2
Rik_ekb
Новичок
Джуниор
 
Регистрация: 29.04.2013
Сообщений: 2
По умолчанию

up
вот мой код на С++, то что я смог осилить.
Прога пока только создает основное и дочернее окно, ну и закрывается по клику мыши.
если ориентироваться по асм коду, то осталось в 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);
}
Rik_ekb вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Используя инструкции обработки строк написать программу на языке ассемблера IA-32 StarMoon Помощь студентам 0 02.05.2012 17:16
переписать программу геннадий522 Visual C++ 2 18.12.2011 14:46
переписать программу d0nDi Общие вопросы Delphi 1 06.08.2011 22:55