Introduction
In this article, I will talk about the creation of a DLL using Assembly (MASM) and the creation of a program that invokes that sample DLL.
Creation of the DLL
Steps
First of all, you need to do some things. Define the normal things (.386
and the includes), then you will need to declare the main procedure of a DLL (LibMain
), the next will be all the other procedures of the DLL. In this tutorial, I will use only one (PrintMess
), but you can use however many you need.
Here is the code of the sample DLL:
.386
option casemap :none
include \masm32\include\masm32rt.inc
.code
LibMain proc instance:dword,reason:dword,unused:dword
mov eax,1
ret
LibMain endp
PrintMess proc
print "Test", 10
inkey
exit
PrintMess endp
End LibMain
Very Brief Description
In the PrintMess
procedure, I'm using print
to show a message in the screen, that 10 after will move the cursor to a new line for the inkey
function. Now let's go to the program that will use this DLL.
Creation of the Program
Steps
First of all, you need to do some things. Define the normal things (.386
, .model
and the includes), then you will declare some variables (hLib
and hProc
), the next will be the main
program by using the DLL.
Here is the code of the sample program:
.386
.model stdcall,flat
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data
hLib dword ?
hProc dword ?
.data
lib byte "testdll.dll", 0
function byte "PrintMess", 0
.code
start:
push offset lib
call LoadLibrary
mov hLib, eax
push offset function
push hLib
call GetProcAddress
mov hProc, eax
call hProc
push hLib
call FreeLibrary
ret
end start
Brief Description
Now let's explain the code very quickly. I've declared a variable called lib
that will store where the DLL is to open it and another variable called function
that will store what procedure the program will execute (remember that you can create many other variables to other procedures), then the program will load the DLL using LoadLibrary
that is stored in hLib
variable. Next, the GetProcAddress
will get the address of the procedure (PrintMess
). After this, we need to call the function that is in hProc
and to end we need to free the DLL using the FreeLibrary
function.
History
- 4th October, 2009: Initial post
I develop for mobiles since 2005, using J2ME for those old color mobile phones(like the good Nokia ones), after this at 2006 I've started on WIndows Mobile development using VB and some C#, at 2007 I was totally focused on Windows Mobile development, developing things like Calendars, simple games and a fully-featured text editor. Aug 2008 I moved to Symbian S60 3rd development using Python and C++. After that I've started on the platform that I like most: Android. One week ago I bought my first Mac, so I was going to start on iOS development, but I saw that it's so much difficult(Objective-C is the problem)