flat assembler
Message board for the users of flat assembler.
Index
> Windows > Extened library,import and export macro defines feature |
Author |
|
Kevin_Zheng 16 Feb 2004, 09:40
Dear Privalov:
The fasm library, import and export macro defines present some of limitation. So I modified the macro defines. Pleasee see the below descrption: 1. "library" macro doesn't define OriginalFirstThunk field, It will use 0 to instead it. In the normal application, the windows will load application OK, But if the application is a WDM driver, because it desn't "OriginalFirstThunk" struct, the driver can't be load. And others, In the pe tutrial of Iczelion, it descript the question about the "OriginalFirstThunk": "If value of OriginalFirstThunk is not zero, follow the RVA in OriginalFirstThunk to the RVA array. If OriginalFirstThunk is zero, use the value in FirstThunk instead. Some linkers generate PE files with 0 in OriginalFirstThunk. This is considered a bug. Just to be on the safe side, we check the value in OriginalFirstThunk first. " And I have found that the complier file can't bind by bind.exe. Bind.exe is suported by Microsoft SDK. If we Modified the library macro as the below, the bind.exe worked ok and driver loaded is ok, also. Code: macro library [name,string] { forward local _label if ~ name#.needed dd RVA name,0,0,RVA _label,RVA name end if common dd 0,0,0,0,0 forward if ~ name#.needed _label db string,0 end if } 2. import and export macros can't support number reference function import and export features. So we can't invoke some undocument APIs on the user32.dll. And others, an owner dll can't export number reference functions. So I modified the import and export macros, It will support number reference function import and export features. I have test it ok . Please see the attached package. Code: IMAGE_ORDINAL_FLAG32 = 80000000h macro import name,[label,string] { common name: forward if used label if string eqtype "" local _label label dd RVA _label else label dd string+IMAGE_ORDINAL_FLAG32 end if end if common if $ > name name#.needed = FALSE dd 0 else name#.needed = TRUE end if forward if used label if string eqtype "" _label dw 0 db string,0 end if end if } ; macroinstruction for making export section macro export dllname,nbase,[label,string] ; strings must be sorted { common local module,addresses,names,ordinal,count_func,count_name count_func = 0 count_name = 0 forward count_func = count_func+1 IF string eqtype "" count_name = count_name+1 END IF common IF nbase eq dd 0,0,0,RVA module,1 ELSE dd 0,0,0,RVA module,nbase END IF dd count_func,count_name,RVA addresses,RVA names,RVA ordinal addresses: forward dd RVA label common names: forward IF string eqtype "" local name dd RVA name END IF common ordinal: count_name = 0 forward IF string eqtype "" dw count_name END IF count_name = count_name+1 common module db dllname,0 forward IF string eqtype "" name db string,0 END IF } 3. And others, the user defined no parameter proc can't be called through stdcall macro. It only called by "call" instruction. Why can't we unit the present parameters and no prarameter procedure? Please see the belowing macros: Code: macro stdcall proc,[arg] ; call procedure { reverse IF ~ arg eq pushd arg END IF common call proc } macro invoke proc,[arg] ; invoke procedure (indirect) { common stdcall [proc],arg } 4. We often call some APIs used string parameter. The string parameter only used one, I have a macro for the edge: Code: macro strcall proc,[arg] { reverse IF arg eq ELSE IF arg eqtype "" call @f DB arg,0 @@: ELSE push arg END IF common call [proc] } strcall LoadCursorFromFile,"dragon.ani" Do you think it? Thank you.
|
|||||||||||
16 Feb 2004, 09:40 |
|
Kevin_Zheng 16 Feb 2004, 09:55
Dear Privalov:
Yes, The strcall macro can have dword parameter and string parameters, For example: strcall MessageBox, [hWnd],'Text','Caption',MB_OK. |
|||
16 Feb 2004, 09:55 |
|
Kevin_Zheng 16 Feb 2004, 10:15
A small change about the "strcall" macro:
Code: macro strcall proc,[arg] { reverse local .@string IF arg eq ELSE IF arg eqtype "" call .@string DB arg,0 .@string: ELSE pushd arg END IF common call [proc] } Last edited by Kevin_Zheng on 17 Feb 2004, 01:18; edited 1 time in total |
|||
16 Feb 2004, 10:15 |
|
JohnFound 16 Feb 2004, 10:47
Kevin_Zheng wrote: Dear Privalov: Well, actually I am not a big fan of this approach. It is good to demonstrate macro power, but it is not very suitable for writing real code. (besides for little examples and demos) Yes in real program, there are a lot of invokes using string parameters, but if macro creates this parameters for you, this strings are too obscure and only one-time usable. This approach may overbloat the code very easy and it will be hidden from the programmer. (especially beginner - but you know beginers will use this feature more that advanced). Why to introduce such bad practices? Of course there is another approach - when the macro check the strings and define the strings only once. But unfortunately it is imposible with today macro system of FASM. I think about some "strings manager" tool in Fresh that to make this dirty work, but it is only project. Regards. |
|||
16 Feb 2004, 10:47 |
|
Kevin_Zheng 16 Feb 2004, 11:12
One using edge:
We often used "LoadLibrary" and "GetProcAddress" for getting address of APIs. I think that "srcall" macro is a solution for it. And others, A beginner should be use the lowest feature to study the assembler. For example: Don't use .if and .whle advanced macro define, the beginner should use pure jxx instruction to implement it. And in the another edge, The beginer will grow on this study period, It will write some big program and have truly understand the black box of Language. I think that some advanced macros will help it. Do you think it? thank you. |
|||
16 Feb 2004, 11:12 |
|
JohnFound 16 Feb 2004, 11:40
Kevin_Zheng wrote: One using edge: Well, it is a matter of personal writing style. For example I almost never use LoadLibrary. I think that the macroses in standard library should be more "common", "clear", not bounded to someones preferences. Of course there should be some "advanced" libraries for every taste, but now we talking about the "root" - standard macro library. One example - normal stdcall (and invoke) macro is very simple: push, push, call. It is absolutely clear for everyone, even from HLL's there is the same approach. "stdcall" macro works this way everytime, there is no exceptions and complex behaviour. On other hand "stdcall" with string parameters works completly different way. It have complex behaviour depending from parameters and there are more than one way to define strings in such macro. This IMHO should be very confusing for beginers and even for advanced user. Quote: And others, A beginner should be use the lowest feature to study the assembler. For example: Don't use .if and .whle advanced macro define, the beginner should use pure jxx instruction to implement it. About "if" and "while" - I think that such macroses doesn't have any advantage in comparison with cmp/Jcc instructions. They are simply slavery to habits from HLL's. They are not objectively more short, clear or readable than simple short sequences of native asm instructions. "stdcall" is another deal, because it may short the sequence of instructions from 10 and more rows to one or two, and to make code really much easy to read/understand. I am follower of the "golden mean" approach for beginers and for advanced users. Not very big, absolutely clear set of standard macroses, especially those that define code. For data definition there may be some more complex macroses, but again without extreams. For example MASM users often write programs using only HLL constructions (if, while, case, etc.) and that is viciously as much as to push manually parameters in the stack for invoke. Regards |
|||
16 Feb 2004, 11:40 |
|
pelaillo 16 Feb 2004, 13:32
Kevin_Zheng,
Thanks for the macros ! I'm going to use them all but the strcall macro because I agree with JohnFound: JohnFound wrote: This approach may overbloat the code very easy and it will be hidden from the programmer. I fully agree with this. Using string args difficults the debugging process and embedding strings within code forces the cache to flush avoiding processor when tries to optimize jumps.[/code] |
|||
16 Feb 2004, 13:32 |
|
comrade 16 Feb 2004, 15:27
Why not use local label instead of @@? If programmer has some @@ he uses and stdcall inside it, it will destroy it.
|
|||
16 Feb 2004, 15:27 |
|
Kevin_Zheng 17 Feb 2004, 01:28
Please see the above reply. I have changed it. Thank your advice.
|
|||
17 Feb 2004, 01:28 |
|
< Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2024, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.