.386
.model flat, stdcall
option casemap:none
;include \masm32\include\windows.inc ; Windows Constants (required)
include ..\K32B.INC ; Macros and Procedures used in simplification.
.data
K32BASE DD 0 ; Handle to Kernel32.DLL in memory
U32BASE DD 0 ; Handle to User32.DLL returned from LoadLibrary
USER32DLL DB "USER32.DLL", 0 ; String to be passed to LoadLibrary
DEFINE_API LoadLibrary, "LoadLibraryA" ; Setup the LoadLibrary data
DEFINE_API FreeLibrary, "FreeLibrary" ; Setup the FreeLibrary data
DEFINE_API ExitProcess, "ExitProcess" ; Setup the ExitProcess data
DEFINE_API MessageBox, "MessageBoxA" ; Setup the MessageBox data
MyTitle DB "No Imports!", 0 ; The title of our MessageBox
MyMessage DB "Hello World in 1.50KBs!", 0 ; The contents of our MessageBox
.code
start: K32B K32BASE ; Get Kernel32.DLL base address and store it
LdAPI K32BASE, LoadLibrary ; Obtain LoadLibrary from Kernel32.DLL
LdAPI K32BASE, FreeLibrary ; Obtain FreeLibrary from Kernel32.DLL
LdAPI K32BASE, ExitProcess ; Obtain ExitProcess from Kernel32.DLL
ACall LoadLibrary, OFFSET USER32DLL ; Load User32.DLL into memory
MOV U32BASE, EAX ; And store the handle in U32BASE
LdAPI U32BASE, MessageBox ; Obtain MessageBox from User32.DLL
; Display our MessageBox
ACall MessageBox, NULL, OFFSET MyMessage, OFFSET MyTitle, MB_OK + MB_ICONINFORMATION
ACall FreeLibrary, U32BASE ; Free User32.DLL since we are done with it
ACall ExitProcess, NULL ; Exit our application
end start ; Easy, huh?