I always thought the internet was "invented" by the american military in the 80's..I think I was wrong :)
http://www.boutell.com/newfaq/history/inventednet.html
Happy readin' :)
I really don't think it's 100 times more code in ASM...
I just found a sample that even has a gui to search for every file on a given folder(I supplied c:\ as a folder and it found every file on the primary partition...
Here's the code:
;-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 <sizeof INITCOMMONCONTROLSEX, ICC_LISTVIEW_CLASSES>
;-------------------------------- 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
At least I have starting point now..
Cheers