;-search.asm v0.1------------------------------------------------------------ ; x86 - Dos & Win32 - Assembly Language Programming ; ; ; ; Written by: John A Lyons (megablast) ; ; Email : asm@megablast.8k.com ; ; Page : http://www.asmsource.8k.com/ ; ; Compiler : Masm32 v6.13 Microsoft Macro Assembler ; ; Date : 17-Feb-2001 ; ; Purpose : Program that searches recursively from a particular dir, ; ; for files of a specific type. ; ; ; ; v0.1 : Basic features, including box, buttons and edit boxes ; ; ; ;---------------------------------------------------------------------------- .386 .MODEL FLAT, STDCALL include windows.inc include user32.inc include kernel32.inc include comctl32.inc include gdi32.inc includelib kernel32.lib includelib user32.lib includelib comctl32.lib includelib gdi32.lib include shell32.inc includelib shell32.lib include advapi32.inc includelib advapi32.lib EXTRN wsprintfA:PROC ; ---------- procedures declared later HyperLinkWndProc PROTO :HWND, :DWORD, :DWORD, :DWORD regget proto regstring:DWORD regset proto regstring:DWORD,number:DWORD dofind proto searchstring:DWORD WinMain PROTO hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdShow:SDWORD .CONST IDI_ICON1 equ 5 IDC_TAB1 EQU 1011 ;------------------------- buttons IDC_EXIT equ 3002 ;IDC_HIDE equ 3000 IDC_GO equ 1015 ;------------------------- menu IDM_FAST equ 32000 IDM_SLOW equ 32001 IDM_EXIT equ 32003 IDM_ABOUT equ 32002 ;------------------------- About IDC_URL equ 9 IDI_CUR1 equ 101 IDI_BITMAP equ 102 ;------------------------- Search IDC_EDIT1 equ 1012 IDC_EDIT2 equ 1013 IDC_LIST equ 1014 IDC_UPDATE equ 1016 .DATA wmenu dd ? MainDlgName DB "MAINWINDOW",0 aboutdialog DB "ABOUTDIALOG",0 count dd 0 num1 db "%%" num2 db "%lu",0 hInstance HINSTANCE ? CommandLine LPSTR ? mem1 db "Load %%%lu",0 runcount1 db "RunCount %lu",0 buff db 256 dup(?) menuhand DWORD ? first BOOL FALSE ;------------------------- Options ontop BOOL FALSE windowmove BOOL TRUE ;------------------------- Popup Menu IDM_ONTOP equ 2 IDM_UPDATE equ 3 ;IDM_EXIT equ 1 ;IDM_ABOUT equ 4 pick1 db "Always On Top",0 pick2 db "Update Title",0 about db "About",0 exit db "Exit",0 ;------------------------- About hover BOOL ? ;first BOOL FALSE szOpen db "open",0 hwndDlg dd 0 first2 BOOL FALSE hFinger dd ? orgStatic dd ? tabwin dd ? newload BOOL TRUE memoryload dd ? mainhwnd HANDLE ? ItemStruct TC_ITEM WhichTabChosen DWORD ? ;-------------------------------- Registry regstring2 db "Run Count",0 regstring1 db "xpos",0 regstring3 db "ypos",0 subkeyname db "Software\search",0 xpos dd NULL ypos dd NULL IDB_MAIN equ 102 ;-------------------------------- Search hlistview dd ? szname db "Name",0 szsize db "Size",0 szloc db "Location",0 szadd db "add me",0 icc INITCOMMONCONTROLSEX ;-------------------------------- Search fmem dd ? mem dd ? filetype db "*.*",0 dirback db "..",0 filesize db "%lu bytes",0 searchfor db 100 dup(0) currentdir db 128 dup(0) searchdir db 128 dup(0) .CODE start: INVOKE GetModuleHandle, NULL MOV hInstance,EAX INVOKE WinMain, hInstance,NULL,SW_SHOWDEFAULT INVOKE ExitProcess,EAX WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdShow:SDWORD invoke InitCommonControlsEx, ADDR icc MOV EAX, OFFSET DlgProc INVOKE DialogBoxParam, hInst, OFFSET MainDlgName,NULL,EAX,NULL mov eax,hInst mov hInstance,eax RET WinMain endp AddCol proc hwndListView:DWORD, iColIndex:DWORD, iColMask:DWORD, iColFormat:DWORD, iColImage:DWORD, iColWidth:DWORD, pszColText:DWORD LOCAL lcNew:LVCOLUMN mov eax,[iColMask] mov [lcNew.imask],eax mov eax,[iColImage] mov [lcNew.iImage],eax mov eax,[iColFormat] mov [lcNew.fmt],eax mov eax,[iColWidth] mov [lcNew.lx],eax mov eax,[iColIndex] mov [lcNew.iSubItem],eax mov eax, [pszColText] mov [lcNew.pszText], eax invoke lstrlen, eax mov [lcNew.cchTextMax], eax and [lcNew.iOrder], 0 invoke SendMessage, [hwndListView], LVM_INSERTCOLUMN, [iColIndex], ADDR lcNew ret AddCol endp AddItem proc hwndListView:DWORD, iItemIndex:DWORD, iSubItemIndex:DWORD, iItemMask:DWORD, iItemImage:DWORD, iItemIndent:DWORD, lParam:DWORD, pszItemText:DWORD, lenItemText:DWORD, bAction:BYTE LOCAL liNew:LV_ITEM ; typedef struct _LV_ITEM { ; UINT mask; ; int iItem; ; int iSubItem; ; UINT state; ; UINT stateMask; ; LPTSTR pszText; ; int cchTextMax; ; int iImage; // index of the list view item's icon ; LPARAM lParam; // 32-bit value to associate with item ; } LV_ITEM; mov eax, [iItemMask] mov [liNew.imask],eax mov eax,[iItemIndex] mov [liNew.iItem],eax mov eax, [iSubItemIndex] mov [liNew.iSubItem],eax mov eax, [iItemImage] mov [liNew.iImage],eax mov eax,[lParam] ; mov [liNew.lParam],eax mov [liNew.lParam],eax mov edx, [pszItemText] mov [liNew.pszText], edx mov eax, [lenItemText] mov [liNew.cchTextMax], eax .if !eax invoke lstrlen, edx mov [liNew.cchTextMax], eax .endif and [liNew.state], 0 and [liNew.stateMask], 0 .if ![bAction] invoke SendMessage, [hwndListView], LVM_INSERTITEM, 0, ADDR liNew .else invoke SendMessage, [hwndListView], LVM_SETITEM, 0, ADDR liNew .endif ret AddItem endp DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:DWORD LOCAL rect:RECT LOCAL Disp :DWORD LOCAL pKey :DWORD LOCAL Temp :DWORD mov eax,uMsg .if ax==WM_CLOSE bigclose: ; invoke KillTimer,hWnd,ID_TIMER invoke GetWindowRect,hWnd,ADDR rect mov eax,rect.top mov eax,rect.left mov eax,[count] inc eax invoke regset,ADDR regstring2,eax mov eax,xpos invoke regset,ADDR regstring1,eax mov eax,ypos invoke regset,ADDR regstring3,eax INVOKE ExitProcess,0 RET .ELSEIF ax==WM_MOVE call updatepos ; .ELSEIF eax == WM_CTLCOLORSTATIC ;invoke SetWindowText,mainhwnd,ADDR num2 ;invoke SendMessage,lParam,uMsg,wParam,lParam ; ret .elseif ax==WM_INITDIALOG invoke LoadIcon, hInstance, IDI_ICON1 invoke SendMessage, hWnd, WM_SETICON, 1, eax mov eax,hWnd mov mainhwnd,eax invoke regget,ADDR regstring2 mov [count],eax invoke regget,ADDR regstring1 mov xpos,eax invoke regget,ADDR regstring3 mov ypos,eax invoke SetWindowPos,hWnd,NULL,xpos,ypos,0,0,SWP_NOSIZE+SWP_NOZORDER invoke CreatePopupMenu mov [wmenu],eax mov eax,[count] push eax push offset runcount1 push offset buff call wsprintfA add esp,0ch invoke AppendMenu,wmenu,MF_STRING,-1,ADDR buff invoke AppendMenu,wmenu,MF_STRING,IDM_ONTOP,ADDR pick1 invoke AppendMenu,wmenu,MF_STRING,IDM_UPDATE,ADDR pick2 invoke AppendMenu,wmenu,MF_STRING,IDM_ABOUT,ADDR about invoke AppendMenu,wmenu,MF_STRING,IDM_EXIT,ADDR exit invoke CheckMenuItem,wmenu,IDM_UPDATE,MF_CHECKED call updatepos invoke GetDlgItem, [hWnd],IDC_LIST mov [hlistview], eax ; invoke SendMessage, eax, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT invoke AddCol, [hlistview], 0, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 100, ADDR szname invoke AddCol, [hlistview], 1, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 100, ADDR szsize invoke AddCol, [hlistview], 2, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 300, ADDR szloc invoke GetCurrentDirectory,128,ADDR buff invoke SendDlgItemMessage, mainhwnd, IDC_EDIT2,WM_SETTEXT, 0,ADDR buff invoke SendDlgItemMessage, mainhwnd, IDC_EDIT1,WM_SETTEXT, 0,ADDR filetype RET .ELSEIF ax==WM_COMMAND mov eax,wParam .IF lParam==0 .IF ax==IDM_ONTOP xor ontop,1 cmp ontop,TRUE je setontop invoke SetWindowPos,mainhwnd,HWND_NOTOPMOST,200,200,242,88,SWP_NOMOVE invoke CheckMenuItem,wmenu,IDM_ONTOP,MF_UNCHECKED jmp clearontop setontop: invoke SetWindowPos,mainhwnd,HWND_TOPMOST,200,200,242,88,SWP_NOMOVE invoke CheckMenuItem,wmenu,IDM_ONTOP,MF_CHECKED clearontop: .ELSEIF ax==IDM_UPDATE xor windowmove,1 cmp windowmove,TRUE je setupdate invoke CheckMenuItem,wmenu,IDM_UPDATE,MF_UNCHECKED jmp noupdate1 setupdate: invoke CheckMenuItem,wmenu,IDM_UPDATE,MF_CHECKED noupdate1: .ELSEIF ax==IDM_ABOUT lea eax,AboutDlgProc invoke CreateDialogParam,hInstance,addr aboutdialog,hWnd,eax,NULL mov hwndDlg,eax .ELSEIF ax==IDM_EXIT jmp bigclose .endif .ENDIF mov eax,wParam mov edx,eax shr edx,16 .IF ax==IDC_GO mov eax,hWnd mov [mainhwnd],eax call dosearch .ENDIF .elseif ax==WM_PAINT ;call graph .ELSEIF ax==WM_RBUTTONDOWN mov ebx,lParam mov ecx,ebx and ebx,0ffffh shr ecx,16 add ebx,xpos add ecx,ypos add ecx,20 invoke TrackPopupMenu,wmenu,TPM_CENTERALIGN +TPM_LEFTBUTTON,ebx,ecx,0,hWnd,NULL .endif xor EAX,EAX RET DlgProc endp updatepos proc LOCAL rect:RECT invoke GetWindowRect,mainhwnd,ADDR rect mov eax,rect.top mov ypos,eax mov eax,rect.left mov xpos,eax ret updatepos endp AboutDlgProc PROC hWnd:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM LOCAL hdc:DWORD LOCAL ps:PAINTSTRUCT LOCAL rect:RECT .if iMsg==WM_INITDIALOG invoke GetDlgItem, hWnd, IDC_URL invoke SetWindowLong, eax, GWL_WNDPROC, ADDR HyperLinkWndProc mov orgStatic,eax invoke LoadCursor,hInstance,IDI_CUR1 mov hFinger,eax push count push offset runcount1 push offset buff call wsprintfA add esp,0ch ; invoke SendDlgItemMessage, hWnd, IDD_LOAD, WM_SETTEXT, 0,ADDR buff xor eax,eax ret .ELSEIF eax == WM_CTLCOLORSTATIC invoke SendMessage,lParam,iMsg,wParam,lParam 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 eax==IDC_EXIT invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL invoke EndDialog,hWnd,NULL mov hwndDlg,0 .endif .else mov eax,FALSE ret .endif mov eax,TRUE ret AboutDlgProc endp 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 eax == WM_CTLCOLORSTATIC invoke SendMessage, hWnd, WM_GETFONT, 0, 0 mov edx,eax invoke GetObject, edx, sizeof LOGFONT, addr tmpFont mov tmpFont.lfUnderline, TRUE invoke CreateFontIndirect, addr tmpFont mov ebx,eax invoke SelectObject, wParam, ebx .if hover == FALSE invoke SetTextColor, wParam, Blue .else invoke SetTextColor, wParam,Red .endif invoke GetSysColor, COLOR_MENU invoke SetBkColor, wParam, eax invoke DeleteObject,ebx invoke GetStockObject, HOLLOW_BRUSH ret .ELSEIF uMsg==WM_MOUSEMOVE invoke SetCursor,hFinger .ELSEIF uMsg==WM_LBUTTONDOWN invoke GetWindowText,hWnd,offset buff,sizeof buff invoke ShellExecute, NULL, offset szOpen, offset buff, NULL, NULL, SW_MAXIMIZE ;change this to represent your preset url xor eax,eax ret .ENDIF invoke CallWindowProc, orgStatic, hWnd, uMsg, wParam, lParam ret HyperLinkWndProc endp regget proc regstring:DWORD LOCAL number:DWORD LOCAL Disp :DWORD LOCAL pKey :DWORD LOCAL Temp :DWORD mov Temp,4 invoke RegCreateKeyEx, HKEY_LOCAL_MACHINE,ADDR subkeyname, NULL, NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, NULL,addr pKey, addr Disp cmp eax,ERROR_SUCCESS jne regok1 invoke RegQueryValueEx, pKey, regstring,NULL, ADDR Disp, ADDR number, ADDR Temp invoke RegCloseKey, pKey mov eax,number ret regok1: mov eax,NULL ret regget endp regset proc regstring:DWORD,number:DWORD LOCAL Disp :DWORD LOCAL pKey :DWORD LOCAL Temp :DWORD mov Temp,4 invoke RegCreateKeyEx, HKEY_LOCAL_MACHINE,ADDR subkeyname, NULL, NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, NULL, addr pKey, addr Disp cmp eax,ERROR_SUCCESS jne regok2 invoke RegSetValueEx, pKey, regstring,NULL, REG_DWORD_LITTLE_ENDIAN,ADDR number, Temp invoke RegCloseKey, pKey regok2: ret regset endp dosearch proc invoke GetDlgItemText,mainhwnd,IDC_EDIT2,ADDR searchdir,100 invoke lstrlen,ADDR searchdir cmp eax,1 jbe notvalid2 mov edi,NULL invoke GetCurrentDirectory,128,ADDR currentdir invoke SetCurrentDirectory,ADDR searchdir cmp eax,FALSE je notvalid2 lea edi,searchdir notvalid2: nodir22: push edi invoke GetDlgItemText,mainhwnd,IDC_EDIT1,ADDR searchfor,100 invoke lstrlen,ADDR searchfor cmp eax,1 jbe notvalid lea eax,searchfor jmp isvalid notvalid: lea eax,filetype isvalid: pop edi invoke dofind,eax invoke SetCurrentDirectory,ADDR currentdir ret ;invoke AddItem, [hlistview], 0, 0, LVIF_TEXT OR LVIF_PARAM, 0, 0, [hWnd], ADDR buff, eax, 0 dosearch endp ;--------------------------------------- Find Proc v1 dofind proc searchstring:DWORD LOCAL fd:WIN32_FIND_DATA ;typedef struct _WIN32_FIND_DATA { // wfd ; ; DWORD dwFileAttributes; ; FILETIME ftCreationTime; ; FILETIME ftLastAccessTime; ; FILETIME ftLastWriteTime; ; DWORD nFileSizeHigh; ; DWORD nFileSizeLow; ; DWORD dwReserved0; ; DWORD dwReserved1; ; TCHAR cFileName[ MAX_PATH ]; ; TCHAR cAlternateFileName[ 14 ]; ;} WIN32_FIND_DATA; LOCAL search:HANDLE LOCAL fsize:DWORD LOCAL tmem:DWORD invoke GetCurrentDirectory,128,ADDR searchdir invoke SendDlgItemMessage, mainhwnd, IDC_UPDATE,WM_SETTEXT, 0,ADDR searchdir ; Do search for files first invoke FindFirstFile,searchstring,ADDR fd cmp eax,INVALID_HANDLE_VALUE je noshow mov [search],eax rego: test fd.dwFileAttributes ,FILE_ATTRIBUTE_DIRECTORY jne isnotafile isafile: ;--a file invoke AddItem, [hlistview], 0, 0, LVIF_TEXT OR LVIF_PARAM, 0, 0, [mainhwnd], ADDR fd.cFileName, eax, 0 mov eax,fd.nFileSizeHigh shr eax,16 add eax,fd.nFileSizeLow push eax push offset filesize push offset buff call wsprintfA add esp,0ch invoke lstrlen, ADDR buff invoke AddItem, [hlistview], 0,1, LVIF_TEXT, 0, 0, 0, ADDR buff, eax, 1 invoke lstrlen, ADDR searchdir invoke AddItem, [hlistview], 0,2, LVIF_TEXT, 0, 0, 0, ADDR searchdir, eax, 1 isnotafile: invoke FindNextFile,search,ADDR fd cmp eax,TRUE je rego noshow: ; Lets go into all the dir's invoke FindFirstFile,ADDR filetype,ADDR fd cmp eax,INVALID_HANDLE_VALUE je noshow2 mov [search],eax rego2: mov eax,fd.dwFileAttributes test eax,FILE_ATTRIBUTE_DIRECTORY je isafile2 lea esi,fd.cFileName cmp [esi],byte ptr "." je isafile2 invoke SetCurrentDirectory,ADDR fd.cFileName cmp eax,TRUE jne isafile2 invoke dofind,searchstring invoke SetCurrentDirectory,ADDR dirback isafile2: invoke FindNextFile,search,ADDR fd cmp eax,TRUE je rego2 noshow2: ret dofind endp END start