Free Web Hosting by Netfirms
Web Hosting by Netfirms | Free Domain Names by Netfirms

;-replace.asm v0.6----------------------------------------------------------- ; x86 - Dos & Win32 - Assembly Language Programming ; ; ; ; Written by: John A Lyons (megablast) ; ; Email : asm@megablast.8k.com ; ; Page : http://asmsource.cjb.com/ ; ; Compiler : Masm32 v6.15 Microsoft Macro Assembler ; ; Tested : Win98SE,Win2000 ; ; Date : 25-Feb-2001 ; ; Purpose : Program that searches recursively from a particular dir, ; ; for files of a specific type, containing a particular phrase. ; ; ; ; v0.1 : Basic features, including box, including a recursive search ; ; (25-Feb01) function stolen from treeview32.asm, and the ability to ; ; search in the files, taken from searchfile32.asm. ; ; v0.2 : Fixed about box information. ; ; (14-Mar01) Added win2k compatability ; ; v0.3 : Fixed some menu problems, with About and Exit function. ; ; Also fixed highlighted link in about box, a common problem ; ; in a number of my programs. ; ; v0.4 : This program is a copy of searchin v0.3. Have added the ; ; (1-Jan02) ability to replace the text. ; ; Improved box order, so that tab makes more sense. ; ; Fixed open problem. ; ; Fixed major memory error, trying to read past allowed memory ; ; due to problem not decreasing ECX counter. ; ; v0.5 : Added sorting routine, ripped from winview.exe. ; ; (2-Jan02) Added Menu options for sorting routine. ; ; ; ; v0.6 : Fixed up about box. ; ; (2Jan02) Added sizes to search and replace phrase boxes. ; ; Menu names actuall match column names in sorting option. I ; ; thought that this might make more sense. ; ; Saves sorting direction and type, for the next time. ; ; Performs sort on each search. ; ; Changed >this< line in replace.asm, now makes sense!! ; ; ; ; ; ; Much thanks to Iczelion's Tutorial number 31, detailing how to do sorting ; ; in listviews. Extensively used this for my sorting routine. ; ; ; ; ; ;---------------------------------------------------------------------------- .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 ; ---------- 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 openit proto filename:DWORD .CONST IDI_ICON1 equ 5 IDC_TAB1 EQU 1011 ;------------------------- buttons IDC_EXIT equ 3002 ;IDC_HIDE equ 3000 IDC_GO equ 1015 LVM_SETEXTENDEDLISTVIEWSTYLE equ LVM_FIRST+54 LVS_EX_FULLROWSELECT equ 20h LVS_EX_GRIDLINES equ 1h ;------------------------- About IDC_URL equ 9 IDI_CUR1 equ 101 IDI_BITMAP equ 102 ;------------------------- Search IDC_EDIT1 equ 1012 IDC_EDIT2 equ 1013 IDC_EDIT3 equ 1020 IDC_LIST equ 1014 IDC_UPDATE equ 1016 IDC_UPDATE2 equ 1019 IDD_LOAD equ 507 IDC_REPLACE equ 1021 .DATA wmenu dd ? MainDlgName DB "MAINWINDOW",0 aboutdialog DB "ABOUTDIALOG",0 MenuName db "TheMenu",0 searchcount dd 0 num1 db "%%" num2 db "%lu",0 hInstance HINSTANCE ? CommandLine LPSTR ? mem1 db "Load %%%lu",0 runcount1 db "Searches %lu",0 linenumber db "Line Number",0 buff db 256 dup(?) menuhand DWORD ? first BOOL FALSE ;------------------------- Options ontop BOOL FALSE windowmove BOOL TRUE ;------------------------- Popup Menu IDM_CLEAR equ 2 IDM_CLEARRESULTS equ 6 IDM_RUN equ 3 IDM_EXIT equ 1 IDM_ABOUT equ 4 IDM_SEARCH equ 5 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 "ReplaceCount",0 regstring1 db "xpos",0 regstring3 db "ypos",0 subkeyname db "Software\Replace",0 sortflags db "sortflags",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 szline db "Line",0 szlineno db "Line No",0 szchange db "Alt",0 szadd db "add me",0 szyes db "Yes",0 szno db "No",0 icc INITCOMMONCONTROLSEX ;-------------------------------- Search listcount dd 0 filetype db "*.*",0 dirback db "..",0 filesize db "%lu bytes",0 filecount db "%lu files",0 searchfor db 100 dup(0) currentdir db 128 dup(0) searchdir db 128 dup(0) searchphrase db 128 dup(0) replace db 128 dup(0) nophrase BOOL FALSE noreplace BOOL FALSE phrasesize dd ? searchit db "invoke",0 numerror db "Search and Replace phrase must be same size." ;----- Sorting sortdir db 1 sortcol dd 0 mmenu dd ? .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 GetItem proc hwndListView:DWORD, iItemIndex:DWORD, iSubItemIndex:DWORD, iItemMask:DWORD, pItemImage:DWORD, pItemIndent:DWORD, lpParam:DWORD, pszItemText:DWORD, lenItemText:DWORD LOCAL liNew:LV_ITEM push [iItemMask] pop [liNew.imask] push [iItemIndex] pop [liNew.iItem] push [iSubItemIndex] pop [liNew.iSubItem] push [pszItemText] pop [liNew.pszText] push [lenItemText] pop [liNew.cchTextMax] invoke SendMessage, [hwndListView], LVM_GETITEM, 0, ADDR liNew ret GetItem 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 push ebx push esi push ebp 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,[searchcount] invoke regset,ADDR regstring2,eax mov eax,xpos invoke regset,ADDR regstring1,eax mov eax,ypos invoke regset,ADDR regstring3,eax xor eax,eax mov al,[sortdir] shl eax,8 add eax,[sortcol] invoke regset,ADDR sortflags,eax INVOKE ExitProcess,0 .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 LoadMenu,hInstance,OFFSET MenuName ;600 mov [mmenu],eax invoke SetMenu,hWnd,eax invoke regget,ADDR regstring2 mov [searchcount],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 regget,ADDR sortflags push eax and eax,0ffh mov [sortcol],eax add eax,20 invoke CheckMenuItem,[mmenu],eax,MF_UNCHECKED pop eax shr eax,8 mov [sortdir],al ;xor [sortdir],1 call changedir invoke CreatePopupMenu mov [wmenu],eax mov eax,[searchcount] push eax push offset runcount1 push offset buff call wsprintfA add esp,0ch invoke AppendMenu,wmenu,MF_STRING,IDM_SEARCH,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_SEPARATOR,0,0 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 SendMessage, eax, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT + LVS_EX_GRIDLINES 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, 50, ADDR szlineno invoke AddCol, [hlistview], 2, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 257, ADDR szline invoke AddCol, [hlistview], 3, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 200, ADDR szloc invoke AddCol, [hlistview], 4, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 30, ADDR szchange 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 .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: .IF ax==IDM_ABOUT lea eax,AboutDlgProc invoke CreateDialogParam,hInstance,addr aboutdialog,hWnd,eax,NULL mov hwndDlg,eax .ELSEIF ax==IDM_CLEAR mov [buff],byte ptr 0 invoke SendDlgItemMessage, mainhwnd, IDC_EDIT3,WM_SETTEXT, 0,ADDR buff invoke SendDlgItemMessage, mainhwnd, IDC_REPLACE,WM_SETTEXT, 0,ADDR buff xor eax,eax ret .ELSEIF ax==IDM_CLEARRESULTS invoke SendMessage, [hlistview], LVM_DELETEALLITEMS, 0, 0 .ELSEIF ax==IDM_RUN jmp gogo .ELSEIF ax==40 mov [sortdir],1 changedir3: call changedir mov eax,[sortcol] add eax,20 call gosortit ret .ELSEIF ax==41 mov [sortdir],0 jmp changedir3 .ELSEIF ax==IDM_EXIT jmp bigclose .elseif eax==IDC_EDIT3 invoke GetDlgItemText,mainhwnd,IDC_EDIT3,ADDR buff,200 invoke SetDlgItemText,mainhwnd,1050,ADDR buff xor eax,eax ret .endif .ENDIF mov eax,[wParam] .IF eax==IDC_GO gogo: mov eax,hWnd mov [mainhwnd],eax call dosearch xor eax,eax ret .elseif ax==IDC_EDIT3 mov esi,3050 mov eax,IDC_EDIT3 dispnum1: invoke GetDlgItemText,mainhwnd,eax,ADDR buff,200 push ecx invoke lstrlen,ADDR buff push eax push offset num2 push offset buff call wsprintfA add esp,0ch pop ecx invoke SetDlgItemText,mainhwnd,esi,ADDR buff xor eax,eax ret .elseif ax==IDC_REPLACE mov esi,3051 mov eax,IDC_REPLACE jmp dispnum1 invoke GetDlgItemText,mainhwnd,IDC_REPLACE,ADDR buff,200 invoke SetDlgItemText,mainhwnd,3051,ADDR buff xor eax,eax .endif cmp eax,20 jb notsort cmp eax,25 ja notsort cmp eax,20 jne nonone ;call gosortit ;jmp refresh ret nonone: sub eax,20 call gosortit notsort: push eax ;push offset runcount1 ;push offset buff ;call wsprintfA ;add esp,0ch ;invoke MessageBox,mainhwnd,addr buff,addr buff,MB_OK ret .elseif ax==WM_NOTIFY mov edi, [lParam] mov eax, (NMHDR ptr [edi]).hwndFrom .if eax==hlistview mov eax, (NMHDR ptr [edi]).code .if eax==LVN_COLUMNCLICK ;call changedir mov esi,[lParam] assume esi:ptr NM_LISTVIEW mov eax,[esi].iSubItem assume esi:nothing ;add eax,21 inc eax call gosortit xor eax,eax ret .endif .endif .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 pop ebp pop esi pop ebx 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 HyperLinkWndProc PROC uses ebx, hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD LOCAL tmpFont :LOGFONT LOCAL rect:RECT LOCAL pt:POINT LOCAL ps:PAINTSTRUCT mov eax,uMsg .IF eax==WM_NCHITTEST mov eax, 1 ;We want to handle the non client hit test so we return true or 1 ret .ELSEIF eax == WM_CTLCOLORSTATIC push ebx push edx 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 pop edx pop ebx ret .ELSEIF eax==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 eax==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 invoke SendMessage, hWnd, WM_GETFONT, 0, 0 ;Get the defualt system font mov edx,eax ;store result invoke GetObject, edx, sizeof LOGFONT, addr tmpFont ;get our font into a logfont structure mov tmpFont.lfUnderline, TRUE ;under line the link invoke CreateFontIndirect, addr tmpFont ;Create the new font mov ebx,eax ;We need the return to free the memory later invoke SelectObject, wParam, ebx ;Select our control invoke SetTextColor, wParam, Blue ;change this to change the color of the link xor eax,eax ret .ENDIF invoke CallWindowProc, orgStatic, hWnd, uMsg, wParam, lParam ret HyperLinkWndProc endp AboutDlgProc PROC hWnd:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM LOCAL hdc:DWORD LOCAL ps:PAINTSTRUCT LOCAL rect:RECT mov eax,iMsg .if eax==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 [searchcount] 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 eax==WM_CLOSE invoke EndDialog,hWnd,NULL mov hwndDlg,0 .elseif eax==WM_COMMAND push edx mov eax,wParam mov edx,eax shr edx,16 .if ax==IDC_EXIT invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL invoke EndDialog,hWnd,NULL mov hwndDlg,0 .endif pop edx .else mov eax,FALSE ret .endif mov eax,TRUE ret AboutDlgProc 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_READ, 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_WRITE, 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 clc ret regok2: stc ret regset endp dosearch proc LOCAL lcnew:LV_ITEM LOCAL lvcol:LV_COLUMN push ebx invoke SendMessage, [hlistview], LVM_DELETEALLITEMS, 0, 0 mov [nophrase],FALSE mov [noreplace],FALSE mov [listcount],0 mov lvcol.imask,LVCF_TEXT invoke GetDlgItemText,mainhwnd,IDC_EDIT3,ADDR searchphrase,100 invoke lstrlen,ADDR searchphrase mov [phrasesize],eax lea ecx,szlineno cmp eax,1 ja phraseok1 mov nophrase,TRUE lea ecx,szsize phraseok1: mov lvcol.pszText,ecx invoke SendMessage,[hlistview],LVM_SETCOLUMN,1,ADDR lvcol invoke GetDlgItemText,mainhwnd,IDC_REPLACE,ADDR replace,100 invoke lstrlen,ADDR replace cmp eax,0 je norep1 mov [noreplace],TRUE cmp eax,[phrasesize] je norep1 invoke SendDlgItemMessage, mainhwnd, IDC_UPDATE2,WM_SETTEXT, 0,ADDR numerror jmp norep4 norep1: invoke SendDlgItemMessage, mainhwnd, IDC_UPDATE2,WM_SETTEXT, 0,ADDR buff mov lcnew.iSubItem,0 mov lcnew.pszText,OFFSET linenumber invoke SendMessage, [hlistview], LVM_SETITEMTEXT, 2, ADDR lcnew 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: 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: invoke dofind,eax invoke SetCurrentDirectory,ADDR currentdir mov eax,[listcount] push eax push offset filecount push offset buff call wsprintfA add esp,0ch invoke SendDlgItemMessage, mainhwnd, IDC_UPDATE2,WM_SETTEXT, 0,ADDR buff lea eax,sortf invoke SendMessage, [hlistview], LVM_SORTITEMS, 0,eax inc [searchcount] mov eax,[searchcount] push eax push offset runcount1 push offset buff call wsprintfA add esp,0ch ; invoke ModifyMenu,wmenu,IDM_SEARCH,MF_BYCOMMAND,MF_STRING,ADDR buff invoke ModifyMenu,wmenu,0,MF_BYPOSITION,MF_STRING,ADDR buff ; invoke AppendMenu,wmenu,MF_STRING,IDM_SEARCH,ADDR buff norep3: call updatelist mov eax,[sortcol] call gosortit norep4: pop ebx 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 cmp nophrase,TRUE je dontsearchit invoke openit,ADDR fd.cFileName jmp isnotafile dontsearchit: invoke AddItem, [hlistview], [listcount], 0, LVIF_TEXT OR LVIF_PARAM, 0, 0, [listcount], ADDR fd.cFileName, eax, 0 mov eax,fd.nFileSizeHigh shr eax,16 add eax,fd.nFileSizeLow push eax push offset num2 push offset buff call wsprintfA add esp,0ch invoke lstrlen, ADDR buff invoke AddItem, [hlistview], [listcount],1, LVIF_TEXT, 0, 0, [listcount], ADDR buff, eax, 1 invoke lstrlen, ADDR searchdir invoke AddItem, [hlistview], [listcount],2, LVIF_TEXT, 0, 0, [listcount], ADDR searchdir, eax, 1 invoke AddItem, [hlistview], [listcount],3, LVIF_TEXT, 0, 0, [listcount], ADDR searchdir, eax, 1 inc [listcount] isnotafile: ; cmp [listcount],1 ; ja noshow2 invoke FindNextFile,search,ADDR fd cmp eax,TRUE je rego invoke FindClose,[search] 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 invoke FindClose,[search] noshow2: mov eax,[listcount] push eax push offset filecount push offset buff call wsprintfA add esp,0ch invoke SendDlgItemMessage, mainhwnd, IDC_UPDATE2,WM_SETTEXT, 0,ADDR buff ret dofind endp sortf proc l1:LPARAM, l2:LPARAM,l3:LPARAM ;invoke SendDlgItemMessage, mainhwnd, IDC_UPDATE,WM_SETTEXT, 0,ADDR l1 mov eax,1 ret sortf endp openit proc filename:DWORD LOCAL filehand:DWORD LOCAL filesizedb:DWORD LOCAL mem:DWORD LOCAL memhand:DWORD LOCAL filebuff:OFSTRUCT LOCAL temp:DWORD LOCAL found:BOOL LOCAL tmem:DWORD invoke CreateFile, filename,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_READ+FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY+FILE_ATTRIBUTE_ARCHIVE+FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM,NULL cmp eax,INVALID_HANDLE_VALUE jne open22 invoke CreateFile, filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY+FILE_ATTRIBUTE_ARCHIVE+FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM,NULL cmp eax,INVALID_HANDLE_VALUE je notopen open22: mov [filehand],eax mov [found],FALSE invoke GetFileSize,filehand,NULL cmp eax,0 je enditall2 cmp eax,-1 je enditall2 mov [filesizedb],eax mov [tmem],eax add eax,100 invoke GlobalAlloc,GMEM_MOVEABLE,eax cmp eax,NULL je enditall2 mov [memhand],eax invoke GlobalLock,eax cmp eax,NULL je enditall mov [mem],eax invoke ReadFile,[filehand],[mem],[filesizedb],addr temp,NULL cmp eax,TRUE jne noread2 mov ecx,[tmem] cmp ecx,[temp] jbe nosetm mov ecx,[temp] nosetm: cmp ecx,0 je noread2 dec ecx ;--------- Search Routine cmp ecx,4 jb enditall mov esi,[mem] lea edi,searchphrase;searchit mov al,[edi] xor ebx,ebx regosearch: mov ah,[esi] cmp ah,al jne notyet internal: inc edi mov al,[edi] or al,al jz gotit inc esi dec ecx or ecx,ecx jz enditall cmp [esi],al jne nicetry loop internal jmp enditall gotit: push edi ;-------- Found. push esi push ecx push ebx mov [found],TRUE invoke lstrlen,filename invoke AddItem, [hlistview], [listcount], 0, LVIF_TEXT OR LVIF_PARAM, 0, 0, [listcount], filename, eax, 0 ;mov ebx,[listcount] ;mov ebx,ecx push ebx push offset num2 push offset buff call wsprintfA add esp,0ch invoke lstrlen,ADDR buff invoke AddItem, [hlistview], [listcount],1, LVIF_TEXT, 0, 0, [listcount], ADDR buff, eax, 1 invoke lstrlen,ADDR searchdir invoke AddItem, [hlistview], [listcount],3, LVIF_TEXT, 0, 0, [listcount], ADDR searchdir, eax, 1 sub esi,[phrasesize] inc esi push esi mov eax,30 invoke AddItem, [hlistview], [listcount],2, LVIF_TEXT, 0, 0, [listcount],esi,eax, 1 pop esi ;mov eax,10 ;invoke AddItem, [hlistview], 0,2, LVIF_TEXT, 0, 0, 0,esi,eax, 1 ;jmp jjj ;sub esi,[phrasesize] ;inc esi cmp [noreplace],TRUE jne norep6 push esi mov ecx,[phrasesize] lea edi,replace dorep: mov al,[edi] mov [esi],al inc esi inc edi loop dorep pop esi norep6: mov ecx,esi sub ecx,[mem] or ecx,ecx jz searchquit cmp ecx,30 jb searchforstart mov ecx,30 searchforstart: dec esi cmp [esi],byte ptr 10 je searchforstart1 loop searchforstart searchforstart1: inc esi searchquit: call printsi invoke AddItem, [hlistview], [listcount],2, LVIF_TEXT, 0, 0,[listcount],ADDR buff,ecx, 1 ;invoke AddItem, [hlistview], [listcount],2, LVIF_TEXT, 0, 0,[listcount],esi,ecx, 1 inc [listcount] pop ebx pop ecx pop esi pop edi nicetry: lea edi,searchphrase;searchit mov al,[edi] jmp notreturn notyet: cmp ah,10 jne notreturn inc ebx notreturn: inc esi dec ecx or ecx,ecx jz enditall jmp regosearch enditall: cmp [found],TRUE jne noread2 cmp [noreplace],TRUE jne noread2 invoke SetFilePointer,[filehand],0,NULL,FILE_BEGIN invoke WriteFile,[filehand],[mem],[filesizedb],addr temp,NULL lea esi,szyes cmp eax,TRUE je writeok lea esi,szno writeok: write1: mov eax,[listcount] dec eax invoke AddItem, [hlistview], eax,4, LVIF_TEXT, 0, 0, eax,esi,1, 1 noread2: notf1: invoke GlobalUnlock,[memhand] invoke GlobalFree,[memhand] enditall2: invoke CloseHandle,[filehand] notopen: ret openit endp printsi proc push esi push edi not0: cmp [esi],byte ptr 0 jne gost1 inc esi jmp not0 gost1: lea edi,buff xor ebx,ebx starts1: mov ah,[esi] or ah,ah jz ends1 cmp ah,0dh je ends1 cmp ah,9 jne nottab mov ecx,4 dotab: mov [edi],byte ptr 32 inc edi loop dotab jmp istab nottab: mov [edi],ah inc edi istab: inc esi inc ebx cmp ebx,70 jb starts1 ends1: mov [edi],byte ptr 0 mov ecx,ebx pop edi pop esi ret printsi endp CompareFunc proc lParam1:DWORD, lParam2:DWORD, SortType:DWORD invoke GetItem, [hlistview], [lParam1], [SortType], LVIF_TEXT OR LVIF_PARAM, 0, 0, [mainhwnd], ADDR buff, 99 invoke GetItem, [hlistview], [lParam2], [SortType], LVIF_TEXT OR LVIF_PARAM, 0, 0, [mainhwnd], ADDR buff+100, 99 ;invoke MessageBox,mainhwnd,ADDR buff,ADDR buff+100,MB_OK lea esi,buff mov ecx,99 cmp [sortdir],0 je sortfor comp1: mov ah,[esi] cmp ah,[esi+100] ja goneg jb gopos inc esi loop comp1 xor eax,eax ret gopos: mov eax,1 ret goneg: mov eax,-1 ret sortfor: comp1a: mov ah,[esi] cmp ah,[esi+100] ja gopos jb goneg inc esi loop comp1a goeven: xor eax,eax ret CompareFunc endp CompareNum proc lParam1:DWORD, lParam2:DWORD, SortType:DWORD invoke GetItem, [hlistview], [lParam1], [SortType], LVIF_TEXT OR LVIF_PARAM, 0, 0, [mainhwnd], ADDR buff, 99 invoke GetItem, [hlistview], [lParam2], [SortType], LVIF_TEXT OR LVIF_PARAM, 0, 0, [mainhwnd], ADDR buff+100, 99 lea esi,buff call getnum push eax lea esi,buff+100 call getnum pop ecx cmp [sortdir],1 je numfor xchg eax,ecx numfor: sub eax,ecx ret CompareNum endp getnum proc push ebx push ecx xor eax,eax xor ecx,ecx mov ebx,10 renum: mov cl,[esi] cmp cl,0 je endnum sub cl,"0" mul ebx add eax,ecx inc esi jmp renum endnum: pop ecx pop ebx ret getnum endp gosortit proc push eax mov eax,[sortcol] add eax,20 invoke CheckMenuItem,[mmenu],eax,MF_UNCHECKED pop eax push eax add eax,20 invoke CheckMenuItem,[mmenu],eax,MF_CHECKED pop eax mov [sortcol],eax or eax,eax jz nonosort4 call changedir dec eax cmp eax,1 je numsort ;cmp eax,6 ;je numsort lea edi,CompareFunc jmp gogosort numsort: lea edi,CompareNum gogosort: invoke SendMessage,[hlistview],LVM_SORTITEMS,eax,edi call updatelist nonosort4: xor eax,eax ret gosortit endp updatelist proc LOCAL lvi:LV_ITEM mov ecx,[listcount] or ecx,ecx jz nolist mov lvi.imask,LVIF_PARAM mov lvi.iSubItem,0 mov lvi.iItem,0 listloop: push ecx push lvi.iItem pop lvi.lParam invoke SendMessage,[hlistview], LVM_SETITEM,0,addr lvi inc lvi.iItem pop ecx loop listloop nolist: ret updatelist endp changedir proc push eax xor eax,eax mov al,[sortdir] add eax,40 invoke CheckMenuItem,[mmenu],eax,MF_UNCHECKED xor [sortdir],1 xor eax,eax mov al,[sortdir] add eax,40 invoke CheckMenuItem,[mmenu],eax,MF_CHECKED pop eax ret changedir endp END start