EuroAssembler Index Manual Download Source Macros


Sitemap Links Forum Tests Projects

Test t9475: DLL proxy library for 32bit Windows forwards exports to other DLL library


Description
Functions Write.W32, Beep.W32, Exit.W32 exported from the main (proxy) library t9475.dll are in fact forwarded to an auxilliary library t9475_fwd.dll.
Point characters . in forwarded identifiers were replaced with underscore _ because Windows loader does not like points in the name of forwarded DLL and its functions.
Source & expected listing t9475.htm.lst
| | EUROASM AUTOSEGMENT=ON,CPU=386,DUMPWIDTH=25 |7439343735 |%test %SET t9475 | |;; | |;; Create auxilliary DLL library. | |%test[]_fwd PROGRAM FORMAT=DLL,MODEL=FLAT,WIDTH=32,ICONFILE= |[.text] ::::Section changed. |00000000: |Write_fwd_W32:: PROC ; Display ASCIIZ string pointed to by ESI using Windows. | | IMPORT GetStdHandle:,WriteFile: ; Declare imported Windows kernel functions. |00000000:6AF5 | PUSH -11 ; %1 Identifier of standard output STD_OUTPUT_HANDLE. |00000002:E8(00000000) | CALL GetStdHandle: ; Stdcall the imported Windows function with 1 argument. |00000007:89C3 | MOV EBX,EAX ; Save the returned StdOutput handle to EBX. |00000009:89F7 | MOV EDI,ESI ; Use EDI to find the end of input string. |0000000B:31C9 | XOR ECX,ECX ; Clear ECX to keep the size of input string. |0000000D:31C0 | XOR EAX,EAX ; Clear AL, the searched NUL character. |0000000F:F7D1 | NOT ECX ; Assume unlimited possible string size. |00000011:F2AE | REPNE SCASB ; Find the zero terminator. |00000013:F7D1 | NOT ECX ; Get string size to ECX. |00000015:52 | PUSH EDX ; Alloc temporary DWORD memory variable on stack. |00000016:89E2 | MOV EDX,ESP ; Get address of this DWORD to EDX. |00000018:50 | PUSH EAX ; %5 No overlap of WriteFile. |00000019:52 | PUSH EDX ; %4 Memory variable for number of bytes. |0000001A:51 | PUSH ECX ; %3 String size. |0000001B:56 | PUSH ESI ; %2 String address. |0000001C:53 | PUSH EBX ; %1 Standard output file handle. |0000001D:E8(00000000) | CALL WriteFile: ; Stdcall the imported function with 5 arguments. |00000022:5A | POP EDX ; Free and discard the temporary DWORD on stack. |00000023:C3 | RET ; Return to caller. |00000024: | ENDPROC Write_fwd_W32: | |;; |00000024: |Beep_fwd_W32:: PROC ; Play a sound in 32bit Windows. |00000024:BE[00000000] | MOV ESI,=B"Beeping..." ; Define a literal string in [.rodata]. |00000029:E8D2FFFFFF | CALL Write_fwd_W32:: ; Display the notification "Beeping...". | | IMPORT Beep: ; Declare imported Windows kernel function. |0000002E:68C8000000 | PUSH 200 ; %2 Sound duration [ms]. |00000033:68B8010000 | PUSH 440 ; %1 Sound frequency [Hz]. |00000038:E8(00000000) | CALL Beep: ; Stdcall the imported function with 2 arguments. |0000003D:6890010000 | PUSH 400 ; %2 Sound duration [ms]. |00000042:684B020000 | PUSH 587 ; %1 Sound frequency [Hz]. |00000047:E8(00000000) | CALL Beep: ; Stdcall the imported function with 2 arguments. |0000004C:C3 | RET ; Return to caller. |0000004D: | ENDPROC Beep_fwd_W32: | |;; |0000004D: |Exit_fwd_W32:: PROC ; Display the message "End" and terminate the program. |0000004D:BE[00000000] | MOV ESI,.M: ; Address in segment [.bss] for the message. |00000052:C706456E6400 | MOVD [ESI+0],"End" ; Dynamically define the message "End". |00000058:C746030D0A0000| MOVD [ESI+3],0x0A0D ; CR+LF. |0000005F:E89CFFFFFF | CALL Write_fwd_W32:: ; Display the notification "End". | | IMPORT ExitProcess: ; Use imported Windows kernel function. |00000064:6A00 | PUSH 0 ; %1 Terminate with errorlevel 0. |00000066:E9(00000000) | JMP ExitProcess: ; Use imported function with 1 argument. |[.bss] ::::Section changed. |00000000:..............|.M: DB 7*BYTE ; Reserve space for ASCIIZ string "End" in segment [.bss]. |[.text] ::::Section changed. |0000006B: | ENDPROC Exit_fwd_W32: | |;; | | EXPORT Write_fwd_W32,Beep_fwd_W32,Exit_fwd_W32 |[@LT1] ====ListLiterals in section [@LT1]. |00000000:42656570696E~~=B"Beeping..." | |ENDPROGRAM %test[]_fwd | **** ListMap "t9475_fwd.dll",model=FLAT,groups=0,segments=6,entry=,stack= | [.text],FA=00000400h,VA=10001000h,size=0000006Bh=107,width=32,align=0010h,purpose=CODE | [.rodata],FA=00000600h,VA=10002000h,size=0000000Bh=11,width=32,align=0010h,purpose=RODATA+LITERAL | [.bss],FA=00000800h,VA=10003000h,size=00000007h=7,width=32,align=0010h,purpose=BSS | [.idata],FA=00000800h,VA=10004000h,size=000000ABh=171,width=32,align=8,purpose=IMPORT+IAT | [.edata],FA=00000A00h,VA=10005000h,size=0000007Ch=124,width=0,align=8,purpose=EXPORT | [.reloc],FA=00000C00h,VA=10006000h,size=0000001Ch=28,width=32,align=4,purpose=BASERELOC | **** ListGlobals "t9475_fwd.dll",Global=0,Public=0,Extern=0,eXport=3,Import=4 | Beep,[.idata]:0000009Dh,VA=1000409Dh,scope='I',lib="kernel32.dll" | Beep_fwd_W32,[.text]:00000024h,VA=10001024h,scope='X' | ExitProcess,[.idata]:000000A4h,VA=100040A4h,scope='I',lib="kernel32.dll" | Exit_fwd_W32,[.text]:0000004Dh,VA=1000104Dh,scope='X' | GetStdHandle,[.idata]:0000008Fh,VA=1000408Fh,scope='I',lib="kernel32.dll" | WriteFile,[.idata]:00000096h,VA=10004096h,scope='I',lib="kernel32.dll" | Write_fwd_W32,[.text]:00000000h,VA=10001000h,scope='X' | |;; | |;; Create the main DLL proxy library. | |%test PROGRAM FORMAT=DLL,MODEL=FLAT,WIDTH=32,ICONFILE= | | EXPORT Write.W32, LIB=%test[]_fwd.dll, FWD=Write_fwd_W32 | | EXPORT Beep.W32, LIB=%test[]_fwd.dll, FWD=Beep_fwd_W32 | | EXPORT Exit.W32, LIB=%test[]_fwd.dll, FWD=Exit_fwd_W32 | |ENDPROGRAM %test | **** ListMap "t9475.dll",model=FLAT,groups=0,segments=1,entry=,stack= | [.edata],FA=00000200h,VA=10001000h,size=000000B2h=178,width=0,align=8,purpose=EXPORT | **** ListGlobals "t9475.dll",Global=0,Public=0,Extern=0,eXport=3,Import=0 | Beep.W32,scope='X',lib="t9475_fwd.dll",fwd=Beep_fwd_W32 | Exit.W32,scope='X',lib="t9475_fwd.dll",fwd=Exit_fwd_W32 | Write.W32,scope='X',lib="t9475_fwd.dll",fwd=Write_fwd_W32
Expected messages t9475.out
I0180 Assembling source file "t9475.htm". I0270 Assembling source "t9475". I0310 Assembling source pass 1. I0330 Assembling source pass 2 - final. I0470 Assembling program "t9475_fwd". "t9475.htm"{51} I0510 Assembling program pass 1. "t9475.htm"{51} I0510 Assembling program pass 2. "t9475.htm"{51} I0530 Assembling program pass 3 - final. "t9475.htm"{51} I0660 32bit FLAT DLL file "t9475_fwd.dll" created, size=3100. "t9475.htm"{105} I0650 Program "t9475_fwd" assembled in 3 passes with errorlevel 0. "t9475.htm"{105} I0470 Assembling program "t9475". "t9475.htm"{123} I0510 Assembling program pass 1. "t9475.htm"{123} I0510 Assembling program pass 2. "t9475.htm"{123} I0530 Assembling program pass 3 - final. "t9475.htm"{123} I0660 32bit FLAT DLL file "t9475.dll" created, size=690. "t9475.htm"{127} I0650 Program "t9475" assembled in 3 passes with errorlevel 0. "t9475.htm"{127} I0750 Source "t9475" (206 lines) assembled in 2 passes with errorlevel 0. I0860 Listing file "t9475.htm.lst" created, size=6790. I0990 EuroAssembler terminated with errorlevel 0.
Expected output file t9475. dll
0000: 4D 5A 89 00 01 00 00 00 04 00 21 00 FF FF 05 00  MZ¤°·°°°·°!°¤¤·°
0010: 00 02 BF A2 00 00 00 00 40 00 00 00 00 00 00 00  °·¤¤°°°°@°°°°°°°
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
0030: 00 00 00 00 00 00 00 00 00 00 00 00 90 00 00 00  °°°°°°°°°°°°¤°°°
0040: 0E 1F BA 0E 00 B4 09 CD 21 B8 08 4C CD 21 54 68  ··¤·°¤·¤!¤·L¤!Th
0050: 69 73 20 70 72 6F 67 72 61 6D 20 77 61 73 20 6C  is¯program¯was¯l
0060: 61 75 6E 63 68 65 64 20 69 6E 20 44 4F 53 20 62  aunched¯in¯DOS¯b
0070: 75 74 20 69 74 20 72 65 71 75 69 72 65 73 20 57  ut¯it¯requires¯W
0080: 69 6E 64 6F 77 73 2E 24 00 00 00 00 00 00 00 00  indows.$°°°°°°°°
0090: 50 45 00 00 4C 01 01 00 00 00 00 00 00 00 00 00  PE°°L··°°°°°°°°°
00A0: 00 00 00 00 E0 00 02 21 0B 01 01 00 00 00 00 00  °°°°¤°·!···°°°°°
00B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
00C0: 00 00 00 00 00 00 00 10 00 10 00 00 00 02 00 00  °°°°°°°·°·°°°·°°
00D0: 04 00 00 00 01 00 00 00 04 00 00 00 00 00 00 00  ·°°°·°°°·°°°°°°°
00E0: 00 20 00 00 B0 01 00 00 00 00 00 00 03 00 0F 00  °¯°°¤·°°°°°°·°·°
00F0: 00 00 10 00 00 20 00 00 00 00 00 01 00 00 10 00  °°·°°¯°°°°°·°°·°
0100: 00 00 00 00 10 00 00 00 00 10 00 00 B2 00 00 00  °°°°·°°°°·°°¤°°°
0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
0180: 00 00 00 00 00 00 00 00 2E 65 64 61 74 61 00 00  °°°°°°°°.edata°°
0190: 00 10 00 00 00 10 00 00 B2 00 00 00 00 02 00 00  °·°°°·°°¤°°°°·°°
01A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 40  °°°°°°°°°°°°°°@@
01B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
01C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
01D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
01E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
01F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  °°°°°°°°°°°°°°°°
0200: 00 00 00 00 00 00 00 00 01 00 00 00 46 10 00 00  °°°°°°°°·°°°F·°°
0210: 01 00 00 00 03 00 00 00 03 00 00 00 28 10 00 00  ·°°°·°°°·°°°(·°°
0220: 34 10 00 00 40 10 00 00 6C 10 00 00 83 10 00 00  4·°°@·°°l·°°¤·°°
0230: 9A 10 00 00 50 10 00 00 59 10 00 00 62 10 00 00  ¤·°°P·°°Y·°°b·°°
0240: 00 00 01 00 02 00 74 39 34 37 35 2E 64 6C 6C 00  °°·°·°t9475.dll°
0250: 42 65 65 70 2E 57 33 32 00 45 78 69 74 2E 57 33  Beep.W32°Exit.W3
0260: 32 00 57 72 69 74 65 2E 57 33 32 00 74 39 34 37  2°Write.W32°t947
0270: 35 5F 66 77 64 2E 42 65 65 70 5F 66 77 64 5F 57  5_fwd.Beep_fwd_W
0280: 33 32 00 74 39 34 37 35 5F 66 77 64 2E 45 78 69  32°t9475_fwd.Exi
0290: 74 5F 66 77 64 5F 57 33 32 00 74 39 34 37 35 5F  t_fwd_W32°t9475_
02A0: 66 77 64 2E 57 72 69 74 65 5F 66 77 64 5F 57 33  fwd.Write_fwd_W3
02B0: 32 00                                            2°

▲Back to the top▲