Leniwe święta

Tak patrzę jak czas przechodzi bezczynnie – święta mijają…

Wpadłem więc na pomysł, że może coś na blogu zamieszczę z mojej pracy. Jak, niektórzy wiedzą współtworzyłem projekt Odin – Win32 dla OS/2. Dawno temu już o tym zapomniałem, ale baaaardzo lubię hacking. Będąc w Kolumbii miałem źródła wcześniejszej wersji całego softu, lecz nie miałem najnowszej wersji. DLLki różniły się exportami, więc potrzebowałem czegoś takiego jak pod OS/2 – DLL -> LIB, żeby można było zlinkować mój kod z nowymi bibliotekami. Nie wiedziałem, że trzeba było troszkę się pomęczyć. Najpierw dumpbin.exe, a następnie lib. Ale pomiędzy tymi dwoma czynnościami należało zrobić plik def… Załączam więc prosty skrypt w vbs, który to robi automatycznie (Copy & Paste).

Używamy: Dll2Lib.vbs kernel32.dll kernel32.lib

PS. Używam Visual Studio 2005, więc jeśli ktoś potrzebuje inne to należy zmienić ścieżki w VC_ENVIRNOMENT.

' Dll2Lib.Vbs
'
' made by dobrawek for his usage
' but if you need it use it on GPL licence
'
' ChangeLog:
' 1.0 17/12/2009 dobrawek - created
'
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")

' Consts defs for files usage
Const ForReading         = 1
Const ForWriting         = 2
Const ForAppending       = 8
Const TristateUseDefault = -2
Const TristateTrue       = -1
Const TristateFalse      = 0 

Dim objArgs
Set objArgs = WScript.Arguments

Dim sIn, sOut

If (objArgs.Count = 1 ) Then
	sIn = UCase(objArgs(0))
        WshShell.Run MakeDumpBinBatch(sIn),0,true

        sOut = Replace(sIn,".DLL",".DEF")

        ConvertDumpFileToDef "FileDump.out",sOut
	WshShell.Run MakeLinkBatch(sOut),0,true
Else
	WScript.Echo "Wrong usage!"
End If

Const VC_ENVIRNOMENT = "call ""C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"" x86"

Const TemporaryFolder = 2

Function MakeDumpBinBatch(sDll)
   Set oOutFile = objFSO.CreateTextFile(objFSO.GetSpecialFolder(TemporaryFolder) & "\FileDump.bat", true)

   oOutFile.WriteLine "@echo off"
   oOutFile.WriteLine VC_ENVIRNOMENT
   oOutFile.WriteLine "dumpbin.exe /EXPORTS " & sDll & " /OUT:FileDump.out"

   oOutFile.Close
   MakeDumpBinBatch = objFSO.GetSpecialFolder(TemporaryFolder) & "\FileDump.bat"
End Function

Function MakeLinkBatch(sDef)
   Set oOutFile = objFSO.CreateTextFile(objFSO.GetSpecialFolder(TemporaryFolder) & "\LinkConv.bat", true)

   oOutFile.WriteLine "@echo off"
   oOutFile.WriteLine VC_ENVIRNOMENT
   oOutFile.WriteLine "lib.exe /DEF:" & sDef & " /OUT:" & Replace(sDef,".DEF",".LIB")

   oOutFile.Close
   MakeLinkBatch = objFSO.GetSpecialFolder(TemporaryFolder) & "\LinkConv.bat"
End Function

Sub ConvertDumpFileToDef(sIn, sOut)

Dim oOutFile ' The object contains output file (.DEF)
Dim oInFile ' The object contains input file (.OUT - generated by dumpbin.exe)

WScript.Echo sIn
WScript.Echo sOut

Dim bHeader

bHeader = true

Set oOutFile = objFSO.CreateTextFile(sOut, true)

   Set oInFile = objFSO.GetFile(sIn) 

   Set oStream = oInFile.OpenAsTextStream(ForReading, TristateUseDefault) 

   Dim pos
   Dim exportArray

   Do While Not oStream.AtEndOfStream 

      sRecord=oStream.ReadLine 

      if (bHeader = true) then
        pos = InStr(sRecord, "Dump of file")
        if ( pos <> 0) then
          oOutFile.WriteLine "LIBRARY " & Mid(sRecord,pos+12) & Chr(13) & Chr(10) & "EXPORTS"
        end if

        pos = InStr(sRecord,"ordinal hint RVA      name")
        if ( pos <> 0) then
	   bHeader = false
        end if

      else

        sRecord = Trim(sRecord)

        do while InStr(sRecord,"  ") <> 0
          sRecord = Replace(sRecord,"  "," ")
        loop

        exportArray = Split(sRecord," ")
        if Ubound(exportArray) > 0 then
          oOutFile.WriteLine exportArray(3) & " @" & exportArray(0) & " NONAME"
        end if

	pos = InStr(sRecord,"Summary")

        if (pos <> 0) then
          exit Do
        end if

      end if

   Loop 

   oStream.Close 

   oOutFile.Close

End Sub