--------------------------------------------------------------------------- ----------------------------------------------------------------------- - A L W A Y S U N D E R C O N S T R U C T I O N - $$$$$$$$ $$$$$$$$ $$$$$$$$$$$$$ $$$$$$$$ $$$$$$$$ $$$$$ $$$$ $$$$$ $$$$ $$$$$ $$$$ $$$ $$$$$ $$$$ $$$$$ $$$$ $$$$$ $$$$ $$$$$ $$$$$ $$$$ $$$ $$$$ $$$$ $$$$$$$$$$ $$$$$$$$ $$$$$ $$$$ $$$ $$$$$$$$ $$$$$$$$ $$$$$ $$$$ $$$$ $$$$$ $$$$ $$$ $$$$ $$$$$ $$$$$ $$$$ $$$$$ $$$$ $$$$$ $$$$ $$$ $$$$$ $$$$ $$$$$ $$$$ $$$$$ $$$$ $$$$$$$$ $$$$$ $$$$ $$$ $$$$$$$$ $$$$$$$$$$ How to program for windows 95 in asm32 Lesson 0 : The Introduction by _HaK_ and corrected by Nemrod and ReN (Sorry : no asm this time) ----------------------------------------------------------------------- --------------------------------------------------------------------------- 1.Introduction : ---------------- With this tutorials, I will try to explain you how to produce an application with windows, menus and dialogs for Microsoft Windows 95 and 98 in full ASM. I decided to do this, because after I released my first freeware ICU, which is written in full ASM, some people on #WIN32ASM (on EFNET) asked me for a tutorial on GUI interface ! I write application for windows in ASM because ASM is the only language I already had practiced a bit. All informations given here are only for those who understand a bit of asm (at least they should know how one or two ASM instructions works). I can't be held responsable for any damage this text or his content could do ! 2.What you will need : ---------------------- First thing will be an assembler. This tutorial is written for TASM 5.0 from Borland (www.inprise.com). Other assembler could be supported with some modifications to the sources, but my purpose isn't to do this. So if you want to convert the files, do it, but send me them back once you have finish, I will include them in this Pack for the other. In addition you will need some ASM knowledge : understand all instructions (maybe not all but moreless the most used). In complement of TASM, you will need a resource editor such as Borland Resource Workshop or the MS dialog editor included in the platformSDK tool pack (download it at www.microsoft.com/msdn/sdk). This will be needed in the future for dialog box edition and menu implementation. To conclude you will need the famous "Win32 programmer's reference" Help file, bewhich explain all the Windows API. Most of the tool you will need can be found on the following adresses: http://lastninja.home.ml.org/ http://cracking.home.ml.org/ http://www.aquanet.co.il/vip/fresh/tools.htm http://members.xoom.com/foxcore/tasm 3.All the files types : ---------------------- 3.1.Short description: ---------------------- .ASM : the main file it contains the real source code ! .INC : (optional can be included in the .ASM) complement of the .asm can be used to define datavalue, ... .RC : the resource file, a new file type for windows ! this file include all the resource needed by the application such as menu,dialog box, icon, bitmap, et cetera, ... Similar to a data file. .DEF : help the linker for the linking : define the exe type, exports, imports fonctions, ... makefile : used for compiling the whole application. 3.2.The .RC files: ------------------ This files include all the resources needed by the application. They are similar to a data file, because every resources have to be loaded within the application. They must be compiled too. For those who have TASM by BRC32.exe Once compiled they become .RES which are ready for LINKING. There will be a whole lesson on them in the future (lesson 4) 3.3.The .DEF file: ------------------ This file define the options for the linking. It is composed by : (this is an example and works perfectly for ICU) ;--- Start of ICU.DEF --->8 NAME ICU ; define the name of the application DESCRIPTION 'ASM program' ; give a short description EXETYPE WINDOWS ; define the EXETYPE : windows CODE PRELOAD MOVEABLE ;type of the code segment DATA PRELOAD MOVEABLE MULTIPLE ; type of data segment ;8<- EOF ICU.DEF --- other parameters exist : * STUB 'Winstub.exe' It gives the famous dos message when windows not running and if not included say that we need win32. Seems we can do our own message ! * EXPORTS WndProc It defines which are the exported fonction by the application. * IMPORTS DLLPROG.SetWinAPI It defines which are the imported fonction by the application. It doesn't be necessar if we link with an import library (here import32.lib see below) * HEAPSIZE 8192 It define the size of the heap : didn't understand what it is, but can be 0 for a DLL. * STACKSIZE 8192 It define the size of the stack. * LIBRARY DLLPROG It define that the prog is a DLL and the name of the library. If you decide to do a library : DATA must be SINGLE and not MULTIPLE It Seems that a library has no NAME. * DATA and CODE can have for parameters (not sure about signification) - PRELOAD : autoloaded, loaded when the progs run ? - MOVEABLE : can be moved within memory ? - FIXED : cant be moved within memory ? - SINGLE : Single segment ? - MULTIPLE : Multiple segment ? - NONDISCARDABLE : ? * It seems to be more options (after a fast look into link32.exe) I'm always searching info on this, so if u have some : contact me ! 3.4.The makefile file: ---------------------- This file is a sort of Batch used for the compilation ! example : ;--- Start of MakeFile --->8 # TASM32.EXE, TLINK32.EXE, BRC32.EXE, MAKE.EXE # are from TASM v5.0. Make sure the path points to them. # Path only needs to point to \bin subdirectory, # TLINK32 finds IMPORT32.LIB in the \lib subdirectory ok. # TLINK32 switches: /Tpa = build 32-bit EXE, # /aa = target Windows 32-bit application, # /v = include debug info. #TASM32 switches: /Zi = include debug info, # /m2 = 2 passes while compiling. # the last parameter is the resource file to be bound to the # executable. the 2nd last param. is the definition file. # make -B Will build .EXE # make -B -DDEBUG Will build the debug version. NAME = ICU OBJS = $(NAME).obj DEF = $(NAME).def !if $d(DEBUG) TASMDEBUG=/zi LINKDEBUG=/v !else TASMDEBUG= LINKDEBUG= !endif !if $d(MAKEDIR) IMPORT=$(MAKEDIR)\..\lib\import32 !else IMPORT=import32 !endif $(NAME).EXE: $(OBJS) $(DEF) tlink32 /Tpe /aa /c $(LINKDEBUG) $(OBJS),$(NAME),, $(IMPORT), $(DEF), $(NAME) .asm.obj: tasm32 $(TASMDEBUG) /ml /m2 $&.asm brc32 -r $(NAME).rc ;8<- EOF MakeFile --- Replace the NAME variable by the name of the file of application. All the filename must be the same : here ICU.DEF, ICU.ASM, ICU.RC If you want to build the exe : type "make" (but the \tasm\bin directory must be in the PATH : ex :PATH=c:\windows;d:\tasm\bin;...) While linking you will need the import32.lib which is in the "lib" subdirectory of tasm. This file is used to link the apicalls in the .ASM file and the real api address in memory. 4.How to use the Win32 programmer's reference : ----------------------------------------------- As said before, this HLP contain all the Windows API. The problems are that on the one hand there is to much API that we can't know them all and on the other hand we can't find the one we are searching for. To find the API we are searching for, if it exists, we could use the search engine included within the help, but I never get it to work (always crash befor finishing the indexation), so we have to go on with the INDEX and the SOMMAIRE. My method consist to search mainly with the index : - once you know what you want to do, find the main idea : for exemple if you want to trace a circle, what you want to do is to trace, draw or paint something (synonyms are usefull) - try by typing the main idea in the index to find something similar. On my exemple with trace : found nothing with draw : found "drawing ****" with paint : found "painting and drawing ****" - now let see what we found, and try to come to the nearest to what you are searching : what we want is drawing a circle so drawing something (a special shape) on the screen : we try drawing rectangles - here don't panic: it's not what we are searching for, but by reading a bit we found something : to draw a rectangle we can use the api "Rectangle", we click on it so we obtain the documentation of it. - hey what is that button at the top : "Group", let's click on it ! - now what we see: a list of fonction who all draw a special filled shape : there is a fonction call "Ellipse" that's it we found it ! (the circle is a particular case of an ellipse) Here we have seen that we need some luck, intuition and some idea. Another method to find what we are searching for is using some generalities : (Quite) All Things where you want to get something begin by Get...... (Quite) All things where you want to set something begin by Set...... And the rest is sometimes in relation with it does. For example to Get the coordinate of the mouse : - we want to get something so : Get..... - a mouse(real, hardware) is always represented by a cursor(virtual, image of the mouse) : GetCursor - we want the coordinate, the position of the Cursor : GetCursorPos Another way is the reverse engeering of apps which does what you want. For example to know how to access the registry disasm the "regedit.exe" and try to understand how does it work. The last method is the NET : try on #Win32asm there should be people to listen to you ! or try with a news searcher like dejanews (www.dejanews.com) or reference (www.reference.com) But at all: synonyms are the best way to find something ! OK, now we have found the API we are searching, It's mainly represented under this form : 'type0' APINAME ( type parameters, type parameters, type parameters, type parameters ) The type0 define what's the returned value type (mainly in eax) is. The type define what's the paramter values type are. Sometimes the type of a paramter consist of a special structure (like point and rect), this say that all the structure is to be given too ! All the type are DWORD: * any HANDLE (HWND,HDC,HMENU,HKEY,...) * any INT, BOOL, UINT, ... * any Long Pointer (LP*) My aim is not to define all the existing type If they aren't DWORD, they are defined as what they are ! There is 3 main types of LP : * LPvoid points on a procedure * LPctstr points on a null terminated string * LP*STRUCT points to a structure The parameters are often defined with names and not value : to find the value corresponding to the names (TASM doesn't recognize them), see in the \TASM\INCLUDE directory, in the WINDOWS.INC but they aren't all here ! The best way to find them is to search in the PlatformSDK from Microsoft in all the include files (.h) 5.Conclusion ------------ After all this reading you thing that's was inutile. But I don't think so: I prefere to define everything once, and then to answer to the question by updating this text. Every thing that is sayed here never be sayed again in any of my others lessons. This lessons is a sort of big introduction defining needed tools, how to use the "Win32 programmer's reference" HELP and a short description of the uncommon file. 6.Here there are : ThE CrEdItZ : -------------------------------- Thanx to _masta_ for the tutorials : It made me begun to program for Win95 in ASM to Nemrod for his correction : the punishement just begun ! ( ]:-) <- it's the devil) to my beta tester (and friend) ReN 7.Where to find me : -------------------- On #Win32ASM (on EFNET) : _HaK_ mainly on Sundays ! And wait for the next lesson : a stupid hello world message box !