usage:
D:\MinGW\lib>nm -g libuser32.a > C:\nmlibuser32.txt
For ANSI
C:\>cscript.exe /nologo nm2extrn.vbs C:\nmlibuser32.txt > libuser32a.inc
For UNICODE
C:\>cscript.exe /nologo nm2extrn.vbs C:\nmlibuser32.txt 1 > libuser32w.inc
copy and save the below code as nm2extrn.vbs
Update - 2012 06 18 | 12:42 AM
maybe you need to separate those extrn files into xp, vista & 7 because some API is not available in xp, if you ld it and execute the application, you will get error like
The procedure entry point GetTouchInputInfo could not be located in the dynamic link library USER32.dll.
The procedure entry point GetTouchInputInfo could not be located in the dynamic link library USER32.dll.
Update - 2012 06 18 | 09:59 PM
now support api that without @
eg.
00000000 I __imp__iupdrvWarpPointer
use this fasm macro to auto extrn match API that we use in asm source
eg.
00000000 I __imp__iupdrvWarpPointer
use this fasm macro to auto extrn match API that we use in asm source
macro extrn stuff {
match text =as name:type,stuff \{
if used name
extrn text as name:type
end if
\}
}
special thanks to revolution![code]
Dim funcname ' lstrcatW
Dim functype ' A or W or etc
Dim funcextrn ' __imp__wvsprintfW / __imp__iupdrvWarpPointer
Dim funcextrn1 ' @12
Dim funcextrnjoin ' __imp__wvsprintfW@12
Dim unicode
Dim nmcontent ' content read from nm generated file
Dim nmarray ' split into array by vbCrLf
Dim i
unicode = 0
Function ReadFile( fname )
Dim fso
Const ForReading = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set fnm = fso.OpenTextFile(fname, ForReading)
ReadFile = fnm.ReadAll
fnm.Close
End Function
Function SplitSpaceISpace( fcontent )
Dim breaki, breakimp, breaka
If InStr( fcontent, " I " ) Then
breaki = Split( fcontent, " I " )
'0 = 00000000 I
'1 = __imp__iupdrvWarpPointer
'1 = __imp__wvsprintfW@12
funcname = ""
functype = ""
funcextrn = ""
funcextrn1 = ""
funcextrnjoin = ""
If InStr( breaki(1), "@" ) Then
breaka = Split( breaki(1), "@" )
funcextrn = breaka(0) ' __imp__wvsprintfW
funcextrn1 = breaka(1) ' 12
Else
funcextrn = breaki(1)
End If
If InStr( funcextrn, "__imp__" ) Then
breakimp = Split( funcextrn, "__imp__" )
funcname = breakimp(1)
' funcname = iupdrvWarpPointer
' funcname = wvsprintfW
End If
functype = Right( funcname, 1 ) ' A or W or etc
' join those extrn
If funcextrn1 = "" Then
funcextrnjoin = funcextrn
Else
funcextrnjoin = funcextrn + "@" + funcextrn1
End If
If unicode = 1 Then
If functype <> "A" Then
WScript.Echo( "extrn '" + funcextrnjoin + "' as " + funcname + ":dword")
End If
Else
If functype <> "W" Then
WScript.Echo( "extrn '" + funcextrnjoin + "' as " + funcname + ":dword")
End If
End If
End If
End Function
If ( WScript.Arguments.Count() = 2 ) Then
unicode = 1
End If
nmcontent = ReadFile( WScript.Arguments.Item(0) )
nmarray = Split( nmcontent, vbCrLf)
For i = 0 to UBound(nmarray)
SplitSpaceISpace( nmarray(i) )
Next
[/code]Labels: fasm, programming, vbscript




Post a Comment