;-tree32.asm-v0.1------------------------------------------------------------ ; 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 : 9-Jan-2001 ; ; Purpose : This program displays the tree at the current directory level ; ; This is very similar to a program i wrote for dos, but at the ; ; moment this doesnt quite do as much. ; ; ; ;---------------------------------------------------------------------------- ; Compile with nmake .386 .MODEL FLAT , STDCALL include windows.inc include user32.inc include kernel32.inc include gdi32.inc includelib user32.lib includelib kernel32.lib includelib gdi32.lib EXTRN wsprintfA:PROC .data ClassName db "SimpleWinClass",0 AppName db "Tree v0.1",0 TestString db "*.*",0 fileno db "Dirs %lu ",0 num db " num=%lu ",0 dirback db "..",0 nomem db "Cant Allocate Memory",0 hInstance HINSTANCE ? CommandLine LPSTR ? hwnd HWND ? hdc HDC ? counter DWORD ? ypos DWORD 0 xpos DWORD 0 depth db 0 fmem DWORD 0 dirnum DWORD 0 mem HGLOBAL 0 tmem2 DWORD 0 total dword 0 flags dword 0 buff db 200 dup(0) .code WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:SDWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG 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,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,0 invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, 300,300, ;size NULL,NULL,\ hInst,NULL mov hwnd,eax INVOKE ShowWindow, hwnd,SW_SHOWNORMAL INVOKE UpdateWindow, hwnd .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL ps:PAINTSTRUCT mov eax,uMsg .IF eax==WM_DESTROY invoke GlobalUnlock,mem invoke GlobalFree,mem invoke PostQuitMessage,NULL .ELSEIF eax==WM_CREATE call readtree .ELSEIF eax==WM_PAINT invoke BeginPaint,hWnd, ADDR ps mov hdc,eax ; invoke TextOut,hdc,0,0,ADDR AppName,20 push dirnum push offset fileno push offset buff call wsprintfA lea esi,buff call count invoke TextOut,hdc,0,0,esi,counter call display invoke EndPaint,hWnd, ADDR ps .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp text proc push eax push edi lea edi,buff-1 xor eax,eax got1: inc eax inc edi cmp [edi],byte ptr 0 jne got1 dec eax invoke TextOut,hdc,0,esi,ADDR buff,eax pop edi pop eax ret text endp readtree proc LOCAL fd:WIN32_FIND_DATA LOCAL search:HANDLE LOCAL amem:LPVOID invoke GlobalAlloc,GMEM_MOVEABLE + GMEM_ZEROINIT,100000 cmp eax,NULL je nolock mov mem,eax invoke GlobalLock,mem cmp eax,NULL je nolock xor [flags],1 mov amem,eax mov fmem,eax ; mov eax,100000 ; xor edx,edx ; mov ebx,200 ; div ebx ; mov [total],eax call dofind mov eax,amem mov fmem,eax nolock: ret readtree endp count proc push esi mov eax,0 noc2: cmp [esi],byte ptr 0 je noc1 inc esi inc eax jmp noc2 noc1: mov [counter],eax pop esi ret count endp hex proc push ebx push edi push ecx mov ebx,eax mov eax,0 lea edi,buff mov ecx,8 boglo1: push ecx mov ecx,4 mov al,0 rot1: clc rcl ebx,1 rcl eax,1 loop rot1 cmp al,9 jbe gotnum add al,'A'-10 jmp gotok gotnum: add al,'0' gotok: mov [edi],al inc edi pop ecx loop boglo1 mov [edi],byte ptr 0 pop ecx pop edi pop ebx ret hex endp dofind proc 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 push edi push esi mov esi,fmem mov tmem2,esi mov eax,111 mov [esi+50],eax mov [fsize],0 invoke FindFirstFile,ADDR TestString,ADDR fd mov [search],eax rego: mov eax,fd.dwFileAttributes test eax,FILE_ATTRIBUTE_DIRECTORY je noout lea esi,fd.cFileName cmp [esi],byte ptr "." je noout2 ; mov edi,xpos ; xor eax,eax ; mov al,[depth] ; shl eax,4 ; mov esi,eax ; ; invoke TextOut,hdc,esi,edi,ADDR fd.cFileName,counter ; add xpos,14 add [fmem],200 mov edi,fmem push edi mov al,[depth] mov [edi],al inc edi look1: mov ah,[esi] mov [edi],ah inc edi inc esi cmp ah,0 jne look1 pop edi mov [edi+50],edi inc [dirnum] invoke SetCurrentDirectory,ADDR fd.cFileName cmp eax,TRUE jne noout inc [depth] push fsize push edi push [tmem2] call dofind pop [tmem2] pop edi pop fsize dec depth invoke SetCurrentDirectory,ADDR dirback jmp noout2 noout: ;--a file mov eax,fd.nFileSizeLow add [fsize],eax noout2: invoke FindNextFile,search,ADDR fd cmp eax,TRUE je rego mov eax,[fsize] mov edi,tmem2 mov [edi+50],eax noshow: pop esi pop edi ret dofind endp display proc test [flags],1 jnz nomem1 invoke TextOut,hdc,0,0,ADDR nomem,(SIZEOF nomem)-1 ret nomem1: push ebp push edi push esi push ecx mov ecx,[dirnum] inc ecx mov edi,14 mov esi,fmem rety1: push ecx ; push esi ; xor eax,eax ; mov al,[esi] ; inc al ; shl eax,3 ; call hex ; lea esi,buff ; call count ; invoke TextOut,hdc,0,edi,esi,counter ; pop esi xor eax,eax mov al,[esi] inc al shl eax,3 ; add eax,70 mov ebp,eax inc esi push ecx call count invoke TextOut,hdc,ebp,edi,esi,counter pop ecx dec esi mov eax,[esi+50] push eax push offset num push offset buff call wsprintfA add esp,0ch push esi lea esi,buff call count invoke TextOut,hdc,150,edi,esi,counter mov eax,esi call hex lea esi,buff call count invoke TextOut,hdc,250,edi,esi,counter pop esi add esi,200 add edi,14 pop ecx dec ecx cmp ecx,0 je ret2 jmp rety1 ret2: pop ecx pop esi pop edi pop ebp ret display endp start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax end start