;-mem.asm-------------------------------------------------------------------- ; x86 - Dos & Win32 - Assembly Language Programming ; ; ; ; Written by: John A Lyons ; ; Email : sysop@megablast.8k.com ; ; Page : http://www.asmsource.8k.com/ ; ; Compiler : Masm32 v6.13 Microsoft Macro Assembler ; ; Date : 12-Feb-2001 ; ; Purpose : Program the displays information about memory. User a timer ; ; interrupt to update, and a dialog box as the main window. Also; ; Changes the window text so that load is updated in taskbar ; ; ; ; Thanks to 'RAZOR'X and his program mem-info ; ; ; ;---------------------------------------------------------------------------- .386 .MODEL FLAT , STDCALL option casemap:none include windows.inc include user32.inc include kernel32.inc include shell32.inc include gdi32.inc includelib user32.lib includelib kernel32.lib includelib shell32.lib includelib gdi32.lib ; external procedure EXTRN wsprintfA:PROC ; procedures declared later WinMain proto :DWORD,:DWORD,:DWORD,:DWORD update proto :DWORD DlgProc proto hWnd:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM .data ClassName db "DLGCLASS",0 MenuName db "MyMenu",0 DlgName db "MainDialog",0 AppName db "Memory Info",0 AbtName db "AboutDialog",0 num2 db "%lu",0 hInstance HINSTANCE ? CommandLine LPSTR ? mem1 db "Load %" buff db 256 dup(?) menuhand DWORD ? count DWORD ? ;about data hwnd HWND ? hover BOOL ? hFinger dd ? orgStatic dd ? hwndDlg dd ? szOpen db "open",0 .const ;buttons IDC_EXIT equ 3002 ;timer ID_TIMER equ 400 ;menu IDM_FAST equ 32000 IDM_SLOW equ 32001 IDM_EXIT equ 32003 IDM_ABOUT equ 32002 ;dialog IDD_TPYHS equ 501 IDD_APYHS equ 502 IDD_APAGE equ 504 IDD_TPAGE equ 503 IDD_AVIRT equ 505 IDD_TVIRT equ 506 IDD_LOAD equ 507 IDI_ICON1 equ 5 IDC_URL equ 9 IDI_CUR1 equ 101 .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine 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 hDlg: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,DLGWINDOWEXTRA push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszMenuName,OFFSET MenuName mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon, hInstance, IDI_ICON1 mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateDialogParam,hInstance,ADDR DlgName,NULL,NULL,NULL mov hDlg,eax INVOKE ShowWindow, hDlg,SW_SHOWNORMAL INVOKE UpdateWindow, hDlg .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke IsDialogMessage, hDlg, ADDR msg .if eax==FALSE INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .endif .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .if uMsg==WM_GETMINMAXINFO ; 24 invoke GetMenu,hWnd mov menuhand,eax invoke SetTimer, hWnd, ID_TIMER, 60000, 0 invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ELSEIF uMsg==WM_ACTIVATE invoke update,hWnd ret .ELSEIF uMsg==WM_DESTROY invoke KillTimer,hWnd,ID_TIMER invoke PostQuitMessage,NULL ret .ELSEIF uMsg==WM_TIMER invoke update,hWnd invoke SetWindowText,hWnd,ADDR mem1 ret .ELSEIF uMsg==WM_COMMAND mov eax,wParam .IF lParam==0 .IF ax==IDM_EXIT invoke DestroyWindow,hWnd ret .ELSEIF ax==IDM_SLOW invoke CheckMenuItem,menuhand,IDM_SLOW,MF_CHECKED invoke CheckMenuItem,menuhand,IDM_FAST,MF_UNCHECKED invoke KillTimer,hWnd,ID_TIMER invoke SetTimer, hWnd, ID_TIMER, 60000, 0 .ELSEIF ax==IDM_FAST invoke CheckMenuItem,menuhand,IDM_SLOW,MF_UNCHECKED invoke CheckMenuItem,menuhand,IDM_FAST,MF_CHECKED invoke KillTimer,hWnd,ID_TIMER invoke SetTimer, hWnd, ID_TIMER, 5000, 0 .ELSEIF ax==IDM_ABOUT invoke CreateDialogParam,hInstance, addr AbtName,hWnd,OFFSET DlgProc,NULL mov hwndDlg,eax .ENDIF .ELSE .IF ax==IDC_EXIT invoke SendMessage,hWnd,WM_COMMAND,IDM_EXIT,0 ret .ENDIF .ENDIF .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp update proc hWnd:HWND LOCAL mst:MEMORYSTATUS ;typedef struct _MEMORYSTATUS { // mst ; ; DWORD dwLength; // sizeof(MEMORYSTATUS) ; DWORD dwMemoryLoad; // percent of memory in use ; DWORD dwTotalPhys; // bytes of physical memory ; DWORD dwAvailPhys; // free physical memory bytes ; DWORD dwTotalPageFile; // bytes of paging file ; DWORD dwAvailPageFile; // free bytes of paging file ; DWORD dwTotalVirtual; // user bytes of address space ; DWORD dwAvailVirtual; // free user bytes ;} MEMORYSTATUS, *LPMEMORYSTATUS; invoke GlobalMemoryStatus,ADDR mst mov eax,mst.dwTotalPhys push eax push offset num2 push offset buff call wsprintfA add esp,0ch invoke SendDlgItemMessage, hWnd, IDD_TPYHS, WM_SETTEXT, 0,ADDR buff mov eax,mst.dwAvailPhys push eax push offset num2 push offset buff call wsprintfA add esp,0ch invoke SendDlgItemMessage, hWnd, IDD_APYHS, WM_SETTEXT, 0,ADDR buff mov eax,mst.dwTotalPageFile push eax push offset num2 push offset buff call wsprintfA add esp,0ch invoke SendDlgItemMessage, hWnd, IDD_TPAGE, WM_SETTEXT, 0,ADDR buff mov eax,mst.dwAvailPageFile push eax push offset num2 push offset buff call wsprintfA add esp,0ch invoke SendDlgItemMessage, hWnd, IDD_APAGE, WM_SETTEXT, 0,ADDR buff mov eax,mst.dwTotalVirtual push eax push offset num2 push offset buff call wsprintfA add esp,0ch invoke SendDlgItemMessage, hWnd, IDD_TVIRT, WM_SETTEXT, 0,ADDR buff mov eax,mst.dwAvailVirtual push eax push offset num2 push offset buff call wsprintfA add esp,0ch invoke SendDlgItemMessage, hWnd, IDD_AVIRT, WM_SETTEXT, 0,ADDR buff mov eax,mst.dwMemoryLoad push eax push offset num2 push offset buff call wsprintfA add esp,0ch invoke SendDlgItemMessage, hWnd, IDD_LOAD, WM_SETTEXT, 0,ADDR buff ret update endp ;----------------------------------------------------ABOUT procedure HyperLinkWndProc PROC uses ebx, hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD LOCAL tmpFont :LOGFONT LOCAL rect:RECT LOCAL pt:POINT .IF uMsg==WM_NCHITTEST mov eax, 1 ret .ELSEIF uMsg==WM_MOUSEMOVE invoke GetParent,hWnd push ebx mov ebx,eax invoke GetActiveWindow .if eax == ebx invoke GetCursorPos,addr pt invoke GetWindowRect,hWnd,addr rect invoke PtInRect,addr rect,pt.x,pt.y .if eax invoke GetCapture .if !eax invoke SetCapture,hWnd mov hover,TRUE invoke InvalidateRect,hWnd,FALSE,FALSE invoke SetCursor,hFinger .endif .else invoke GetCapture .if eax invoke ReleaseCapture mov hover,FALSE invoke InvalidateRect,hWnd,FALSE,FALSE .endif .endif .endif pop ebx xor eax,eax ret .ELSEIF uMsg==WM_LBUTTONDOWN invoke GetWindowText,hWnd,offset buff,sizeof buff ;change this for using a preset url invoke ShellExecute, NULL, offset szOpen, offset buff, NULL, NULL, SW_MAXIMIZE ;change this to represent your preset url mov hover,FALSE invoke InvalidateRect,hWnd,FALSE,FALSE xor eax,eax ret .ENDIF invoke CallWindowProc, orgStatic, hWnd, uMsg, wParam, lParam ret HyperLinkWndProc endp DlgProc PROC hWnd:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM .if iMsg==WM_INITDIALOG invoke GetDlgItem,hWnd,IDC_EXIT invoke SetFocus,eax invoke GetDlgItem, hWnd, IDC_URL invoke SetWindowLong, eax, GWL_WNDPROC, ADDR HyperLinkWndProc mov orgStatic,eax invoke LoadCursor,hInstance,IDI_CUR1 mov hFinger,eax xor eax,eax ret .elseif iMsg==WM_CLOSE invoke EndDialog,hWnd,NULL mov hwndDlg,0 .elseif iMsg==WM_COMMAND mov eax,wParam mov edx,eax shr edx,16 ;.if dx==BN_CLICKED .if eax==IDC_EXIT invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL invoke EndDialog,hWnd,NULL mov hwndDlg,0 .endif ;.endif .else mov eax,FALSE ret .endif mov eax,TRUE ret DlgProc endp end start