السلام عليكم ورحمة الله
لدي مجموعة اسئلة على كود تكوين نافذة في الاسمبلي 32
اسمحو لي ان اضع اولا الكود كاملا كما مأخوذ من المصدر
.386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc includelib \masm32\lib\user32.lib ; calls to functions in user32.lib and kernel32.lib include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD .DATA ; initialized data ClassName db "SimpleWinClass",0 ; the name of our window class AppName db "Our First Window",0 ; the name of our window .DATA? ; Uninitialized data hInstance HINSTANCE ? ; Instance handle of our program CommandLine LPSTR ? .CODE ; Here begins our code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess, eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc ; register our window class invoke CreateWindowEx,NULL,\ ADDR ClassName,\ ADDR AppName,\ WS_OVERLAPPEDWINDOW,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ NULL,\ hInst,\ NULL mov hwnd,eax invoke ShowWindow, hwnd,CmdShow ; display our window on desktop invoke UpdateWindow, hwnd ; refresh the client area .WHILE TRUE ; Enter message loop invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ; return exit code in eax ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_DESTROY ; if the user closes our window invoke PostQuitMessage,NULL ; quit our application .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Default message processing ret .ENDIF xor eax,eax ret WndProc endp end start
اولا
هذه الخطوة ،
mov wc.lpfnWndProc, OFFSET WndProc
الا يجب ان يعرف ال WndProc مسبقا لكي يتم التعرف عليها ، كما فعل مع WinMain ؟؟
وما معنى OFFSET ؟؟
ثانيا ،
هنا
push hInstance pop wc.hInstance
لماذا لم يستخدم mov ،
الا يصح هكذا ، مباشرة ، أي بدون استخدام hInstance
invoke GetModuleHandle, NULL mov wc.hInstance , eax
ثالثا ،
mov wc.lpszClassName,OFFSET ClassName
انا قرأت كم مثال يستخدم addr لماذا هنا استخدم OFFSET ؟؟
رابعا ،
هذا الجزء
.WHILE TRUE ; Enter message loop invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW
لم افهمه بصراحة ،
ما فرق ADDR عن addr ؟
في ال سي مثلا كنا نعمل
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}هنا ما فائدة هذا السطر وماذا يعني
.BREAK .IF (!eax)
طبعا هنا احب ان اسأل ،
اين اجد اساسيات هذه اللغة ،
يعني ماهي الكلمات المحجوزة ، وكيفية كتابة الجمل الشرطية وما الى ذلك ؟؟؟
طبعا انا قرأت درس الاخ Xacker بهذا الخصوص
هذا الجزء كان كالآتي في الملف المرفق مع درسه ،
.while TRUE invoke GetMessage,addr msg,0,0,0 .break .if (!eax) invoke DispatchMessage,addr msg .endw
هنا استخدم ، addr يعني هل معنى هذا انها لا تفرق عن ال ADDR
،
ولماذا تم حذف هذا السطر ،
invoke TranslateMessage, ADDR msg
؟؟؟
واخيرا ،
في ال WndProc استخدم ال IF،
هل من الممكن استخدام ال switch – case
،،،،،،
،،،،
بصراحة بعد لدي اسئلة واستفسارات .. بس خليها شوي شوي ،،
(طبعا اذا وجدت من يجيبني .. )
------------------
استفسار من مشرفي القسم والمتمكنين من هذه اللغة ،
انا على ابواب مشروع في الكلية ،
المشروع على الاكثر سيكون بمجال ال API hook ،
انا قررت ان استخدم هذه اللغة ،
لأن هنا لدينا لم يعمل احد عليها بعد ،، يعني راح يكون شيء جديد ..
سؤالي هل هذا ممكن ؟؟
يعني هل تمكني هذه اللغة من عمل ما اريد مثل لغة سي ،
طبعا انا اعلم ان ال API hook به ايعازات اسمبلي ،
لكن هل من الممكن عمل مشروع متكامل بهذه اللغة ؟؟
جزاكم الله كل خير ...