win32汇编系统函数简单小示例图解
1 打開 計算器 窗口,最小化 計算器 窗口
從 Console Build All 菜單構建;?
?代碼;
.386 .model flat, stdcall option casemap :noneinclude S:\masm32\include\windows.inc include S:\masm32\include\user32.inc include S:\masm32\include\kernel32.inc include S:\masm32\include\gdi32.inc includelib S:\masm32\lib\user32.lib includelib S:\masm32\lib\kernel32.lib includelib S:\masm32\lib\gdi32.lib.dataFindName db "計算器",0heName db "calc",0hhandle dd ?.code start:invoke FindWindow,NULL,addr FindNamemov handle,eax.if(handle != 0) ; 找到則最小化窗口invoke ShowWindow,handle,SW_SHOWMINIMIZED.else ; 沒有找到則打開進程invoke WinExec, addr eName ,SW_SHOW.endifinvoke ExitProcess,NULL end start? ? 運行;第一次運行c3.exe,如果沒有打開 計算器,則會打開計算器;第二次運行c3.exe,則會最小化 計算器 窗口;
窗口顯示方式的定義如下;
ShowWindow 函數顯示方式(第二個參數)的定義:
預定義值?? ?等 效 值
?SW_HIDE?? ? 隱藏窗口,大小不變,激活狀態不變
?SW_MAXIMIZE?? ? 最大化窗口,顯示狀態不變,激活狀態不變
?SW_MINIMIZE?? ? 最小化窗口,顯示狀態不變,激活狀態不變
?SW_RESTORE?? ? 從最大化或最小化恢復正常大小,顯示狀態不變,激活狀態不變
?SW_SHOW?? ? 顯示并激活窗口,大小狀態不變
?SW_SHOWMAXIMIZED?? ? 顯示并激活窗口,以最大化顯示
?SW_SHOWMINIMIZED?? ? 顯示并激活窗口,以最小化顯示
?SW_SHOWMINNOACTIVE?? ? 顯示窗口并最小化,激活狀態不變
?SW_SHOWNA?? ? 顯示窗口,大小狀態不變,激活狀態不變
?SW_SHOWNOACTIVATE?? ? 顯示并從最大化或最小化恢復正常大小,激活狀態不變
?SW_SHOWNORMAL?? ? 顯示并激活窗口,恢復正常大小(初始化時用這個參數)
2 獲取當前目錄?
運行情況如下;
代碼;
.386 .model flat, stdcall option casemap :noneinclude S:\masm32\include\windows.inc include S:\masm32\include\user32.inc include S:\masm32\include\kernel32.inc include S:\masm32\include\gdi32.inc includelib S:\masm32\lib\user32.lib includelib S:\masm32\lib\kernel32.lib includelib S:\masm32\lib\gdi32.lib.datastStartUp STARTUPINFO <?> .constszCaption db '當前目錄',0.code start:invoke GetStartupInfo,addr stStartUp;mov eax,stStartUp.lpDesktop;mov eax,stStartUp.lpTitle ; 當前軟件目錄invoke MessageBox, NULL, stStartUp.lpTitle, addr szCaption, MB_OKinvoke ExitProcess,NULL end start3 獲取當前時間
代碼如下;
.386 .model flat, stdcall option casemap :noneinclude S:\masm32\include\windows.inc include S:\masm32\include\user32.inc include S:\masm32\include\kernel32.inc include S:\masm32\include\gdi32.inc includelib S:\masm32\lib\user32.lib includelib S:\masm32\lib\kernel32.lib includelib S:\masm32\lib\gdi32.lib.datasystime SYSTEMTIME <?> .constszCaption db '當前時間',0.code start:invoke GetLocalTime,addr systime ; 獲取當前時間;mov ax,systime.wYear;mov bx,systime.wMonth;mov cx,systime.wDay;invoke SetLocalTime,addr systime ; 設置當前時間invoke MessageBox, NULL, systime.wMonth, addr szCaption, MB_OKinvoke ExitProcess,NULL end start如前構建,構建成功;但是運行,不會顯示消息框;為什么?
看一下結構體的定義;
typedef struct _STARTUPINFO?
{?
? ? ?DWORD cb;
? ? ?PSTR lpReserved;
? ? ?PSTR lpDesktop;
? ? ?PSTR lpTitle;
? ? ?DWORD dwX;?
? ? ?DWORD dwY;
? ? ?DWORD dwXSize;
? ? ?DWORD dwYSize;
? ? ?DWORD dwXCountChars;
? ? ?DWORD dwYCountChars;?
? ? ?DWORD dwFillAttribute;?
? ? ?DWORD dwFlags;
? ? ?WORD wShowWindow;?
? ? ?WORD cbReserved2;
? ? ?PBYTE lpReserved2;
? ? ?HANDLE hStdInput;
? ? ?HANDLE hStdOutput;?
? ? ?HANDLE hStdError;?
} STARTUPINFO, *LPSTARTUPINFO;
typedef struct _SYSTEMTIME {?
? ? WORD wYear;?
? ? WORD wMonth;?
? ? WORD wDayOfWeek;?
? ? WORD wDay;?
? ? WORD wHour;?
? ? WORD wMinute;?
? ? WORD wSecond;?
? ? WORD wMilliseconds;?
} SYSTEMTIME, *PSYSTEMTIME;?
程序2獲取了以后可以MessageBox出來,因為使用的結構體的字段lpTitle的類型是PSTR,程序3獲取了以后,wMonth字段是WORD類型;下回再處理此問題;
4 獲取操作系統和系統版本信息
.386 .model flat, stdcall option casemap :noneinclude S:\masm32\include\windows.inc include S:\masm32\include\user32.inc include S:\masm32\include\kernel32.inc include S:\masm32\include\gdi32.inc includelib S:\masm32\lib\user32.lib includelib S:\masm32\lib\kernel32.lib includelib S:\masm32\lib\gdi32.lib.dataversion OSVERSIONINFO <?>lpsystem SYSTEM_INFO <?> .constszCaption db '系統信息',0.code start:invoke GetSystemInfo,addr lpsystem;mov ax,lpsystem.wProcessorArchitectureinvoke MessageBox, NULL, lpsystem.wProcessorArchitecture, addr szCaption, MB_OKinvoke GetVersionEx,addr version;mov eax,version.dwBuildNumberinvoke MessageBox, NULL, version.dwBuildNumber, addr szCaption, MB_OKinvoke ExitProcess,NULL end start問題和程序3一樣,不會顯示消息框;
如果把
invoke?? ?MessageBox, NULL, lpsystem.wProcessorArchitecture, addr szCaption, MB_OK
改為
invoke?? ?MessageBox, NULL, addr lpsystem.wProcessorArchitecture, addr szCaption, MB_OK
則顯示如下;
下回再處理此問題;
5 獲取所有驅動器
看一下代碼,addr lpDrives+4,?加4后顯示下一個;
.386 .model flat, stdcall option casemap :noneinclude S:\masm32\include\windows.inc include S:\masm32\include\user32.inc include S:\masm32\include\kernel32.inc include S:\masm32\include\gdi32.inc includelib S:\masm32\lib\user32.lib includelib S:\masm32\lib\kernel32.lib includelib S:\masm32\lib\gdi32.lib.datalpLength BYTE ?lpDrives DWORD 0 dup(1024) .constszCaption db '磁盤信息',0.code start:invoke GetLogicalDrives ; 獲取卷標invoke GetLogicalDriveStrings,addr lpLength,addr lpDrives ; 同上;lea esi,[lpDrives] ; 顯示C盤;lea esi,[lpDrives+4] ; 顯示D盤invoke MessageBox, NULL, addr lpDrives, addr szCaption, MB_OKinvoke MessageBox, NULL, addr lpDrives+4, addr szCaption, MB_OKinvoke ExitProcess,NULL end start?
總結
以上是生活随笔為你收集整理的win32汇编系统函数简单小示例图解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win32汇编使用win32 api实现
- 下一篇: 超图使用服务管理页面发布服务图解