; @RCHER system-dependent and other stuff ; Written in pure assembler by Ivushkin Andrey aka Willow OpenFile: mov [outp],output mov esi,area and [Finfo.block],0 if SYS eq win invoke CreateFile, filename, GENERIC_READ, FILE_SHARE_READ, NULL, \ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL inc eax test eax,eax jz .ex dec eax mov [hnd],eax invoke GetFileSize,eax,NULL .ex: mov ebx,eax mov [filesize],eax else mcall 58,Finfo mov [filesize],ebx end if ret ResetFile: and [file_count],0 mov eax,[arc_base] xor ebx,ebx mov esi,area call FileSeek ret FileSeek: ; eax - offset ; esi - current pointer (in memory!) ; ebx - translation method: 0 - beginning, 1 - current, 2 - end push eax ecx edx mov edx,[Finfo.block] imul edx,BSIZE sub esi,BUFPTR add esi,edx cmp ebx,1 je .cur jb .begin mov esi,[filesize] not eax .cur: add eax,esi .begin: mov ecx,BSIZE xor edx,edx div ecx lea esi,[BUFPTR+edx] mov [Finfo.block],eax if SYS eq win mul ecx invoke SetFilePointer,[hnd],eax,NULL,FILE_BEGIN invoke ReadFile,[hnd],area,INBUF, os_work, NULL ; add [byte_count],area else ; pregs ; wait mov [Finfo.count],BUFSIZE*2 mcall 58,Finfo ; mov [byte_count],area+INBUF end if pop edx ecx eax ret macro QueryFile { local ex if SYS eq win invoke GetOpenFileName,ofstruc else opendialog draw_window,QFok,QFcanc,filename QFok: xor eax,eax jmp ex ret QFcanc: mov eax,1 end if ex: } RunViewer: test [Flags],PNG_MODE jz .ex if SYS eq win mov eax,[PNG_info.Width] call int2str invoke WritePrivateProfileString,ini_sec,ini_rwidth,os_work,ini_file mov eax,[PNG_info.Height] call int2str invoke WritePrivateProfileString,ini_sec,ini_rheight,os_work,ini_file invoke CreateProcess,NULL,iview_cmd,NULL,NULL,TRUE,\ NORMAL_PRIORITY_CLASS,NULL,NULL,suinfo,pinfo invoke WaitForInputIdle,dword[pinfo],0xFFFFFFFF invoke FindWindowEx, NULL,NULL,NULL,rawwnd_txt invoke FindWindowEx, eax,NULL,NULL,ok_txt invoke SendMessage,eax,BM_CLICK,NULL,NULL else test [Flags],THREAD_YES jnz .ex mcall 51,1,thread,MEMORY mov [child],eax end if .ex: ret if SYS eq win int2str: ; in: eax - number ; out: formatted string -> os_work invoke wsprintf,os_work,fmt_str,eax add esp,12 ret rawwnd_txt db 'Set RAW open parameters',0 ok_txt db 'OK',0 ini_sec db 'RAW',0 ini_rwidth db 'RWidth',0 ini_rheight db 'RHeight',0 ini_file db "C:\Program Files\IrfanView\i_view32.ini",0 fmt_str db "%d",0 iview_cmd db '"C:\Program Files\IrfanView\i_view32.exe"' db ' "D:\Ivushkin\projects\zip\output.raw"',0 filt_str: db 'Pictures (*.png)',0,'*.png',0 db 'Archives (*.zip;*.*gz)',0,'*.zip;*.*gz',0 db 'All files (*.*)',0,'*.*',0,0 suinfo STARTUPINFO pinfo PROCESS_INFORMATION cpstruc: ofstruc: dd ofstruc_end-ofstruc dd NULL dd NULL dd filt_str dd NULL dd NULL dd 0 dd filename dd 256 dd NULL dd 0 dd NULL dd NULL dd NULL dw NULL dw NULL dd NULL dd NULL dd NULL dd NULL dd NULL dd NULL dd NULL ofstruc_end: else mov ebx,-1 mov ecx,ebx mov edx,[PNG_info.Width] add edx,10 mov esi,[PNG_info.Width] add esi,30 mcall 67 mcall 7,outfile,[outfile.size],10 shl 16+15 .ex: ret MIN_WIDTH equ 300 thread: .red: mcall 12,1 mov ebx,[PNG_info.Width] cmp ebx,MIN_WIDTH jae .more mov ebx,MIN_WIDTH .more: add ebx,20 mov ecx,[PNG_info.Height] add ecx,30 mcall 0,,,0x3808080 mcall 4,<5,7>,0x10f0f0f0,filename,255 mov ecx,[PNG_info.Width] shl ecx,16 add ecx,[PNG_info.Height] mcall 7,png_image,,10 shl 16+25 mcall 12,2 .still: mcall 10 cmp eax,1 je .red cmp eax,2 jne .nokey mcall 2 cmp ah,27 ; Esc - close je .close jmp .still .nokey: cmp eax,3 jne .still .close: and [child],0 mcall -1 KillViewer: pusha mov edi,[child] test edi,edi jz .noth mcall 9,os_work,-1 mov ecx,eax .fchild: push ecx mcall 9,os_work cmp edi,[ebx+30] jne .lp mov ecx,[esp] mcall 18,2 pop ecx jmp .noth .lp: pop ecx loop .fchild .noth: popa ret macro CmdLine { mov esi,PARAM_PTR .parse: lodsb test al,al jnz .noend or [Flags],STAY_MODE jmp red .noend: cmp al,' ' je .stay cmp al,'/' jne .yespar mov ecx,255 dec esi mov edi,filename xor al,al rep stosb mov ecx,255 mov edi,filename rep movsb jmp again .yespar: cmp al,'N' jne .nonum call get_6ASCII_num .fnum: mov [FileNum],eax jmp .parse .nonum: cmp al,'n' jne .nonum2 lodsd jmp .fnum .nonum2: cmp al,'s' jne .nostay .stay: or [Flags],STAY_MODE jmp .parse .nostay: cmp al,'i' jne .noclPID lodsd mov [clientPID],eax or [Flags],IPC_MODE jmp .parse .noclPID: cmp al,'R' jne .noraw or [Flags],RAW_MODE jmp .parse .noraw: cmp al,'q' jne .noofs lodsd .fofs: mov [arc_base],eax jmp .parse .noofs: cmp al,'Q' jne .noofs2 call get_6ASCII_num jmp .fofs .noofs2: jmp .parse get_6ASCII_num: ; in: esi - str ptr, out: eax - num xor edx,edx mov ebx,10 mov ecx,6 .lp: xor eax,eax lodsb sub al,'0' imul edx,ebx add edx,eax loop .lp mov eax,edx ret } StartPad: mcall 19,editorcmd,dumpfile ret editorcmd db 'TINYPAD ' end if