win32汇编系统函数简单小示例图解

    科技2022-08-02  115

    1 打开 计算器 窗口,最小化 计算器 窗口

    从 Console Build All 菜单构建; 

     代码;

    .386 .model flat, stdcall option casemap :none include 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 .data FindName db "计算器",0h eName db "calc",0h handle dd ? .code start: invoke FindWindow,NULL,addr FindName mov handle,eax .if(handle != 0) ; 找到则最小化窗口 invoke ShowWindow,handle,SW_SHOWMINIMIZED .else ; 没有找到则打开进程 invoke WinExec, addr eName ,SW_SHOW .endif invoke 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 :none include 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 .data stStartUp STARTUPINFO <?> .const szCaption db '当前目录',0 .code start: invoke GetStartupInfo,addr stStartUp ;mov eax,stStartUp.lpDesktop ;mov eax,stStartUp.lpTitle ; 当前软件目录 invoke MessageBox, NULL, stStartUp.lpTitle, addr szCaption, MB_OK invoke ExitProcess,NULL end start

    3 获取当前时间

    代码如下;

    .386 .model flat, stdcall option casemap :none include 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 .data systime SYSTEMTIME <?> .const szCaption 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_OK invoke 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 :none include 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 .data version OSVERSIONINFO <?> lpsystem SYSTEM_INFO <?> .const szCaption db '系统信息',0 .code start: invoke GetSystemInfo,addr lpsystem ;mov ax,lpsystem.wProcessorArchitecture invoke MessageBox, NULL, lpsystem.wProcessorArchitecture, addr szCaption, MB_OK invoke GetVersionEx,addr version ;mov eax,version.dwBuildNumber invoke MessageBox, NULL, version.dwBuildNumber, addr szCaption, MB_OK invoke 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 :none include 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 .data lpLength BYTE ? lpDrives DWORD 0 dup(1024) .const szCaption 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_OK invoke MessageBox, NULL, addr lpDrives+4, addr szCaption, MB_OK invoke ExitProcess,NULL end start

     

    Processed: 0.010, SQL: 8