
                    Na polski przetlumaczyl Jube ( SevenTeam )
                            http://www.7team.z.pl

  ---------------------------------------------------------------------------
    -----------------------------------------------------------------------
            - 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 1 : your first program
                    by _HaK_ and corrected by Nemrod and ReN

    -----------------------------------------------------------------------
  ---------------------------------------------------------------------------

                     Jak programowac pod Windows 95 w asm32
                         Lekcja 1 : twoj pierwszy program


  1.Wstep :
  ---------

    W tej lekcji sprobuje pokazac  Ci jak zrobic proste program pod windows
    wykorzystujacy funkcje MessageBox.



  2.Jak to zrobimy ?
  ------------------

    Glowna  funkcja  API  uzyta w przykladowym programie (patrz nizej) jest
    MessageBoxA. Przegladajac rozpiske funkcji API widzimy :

      int MessageBox(
        HWND hWnd,            // wskaznik do okna macierzystego
        LPCTSTR lpText,       // adres tekstu 
        LPCTSTR lpCaption,    // adres tytulu okna
        UINT uType            // styl okna
      );

    Przed wywolaniem funkcji API musimy odlozyc na stos wszystkie parametry
    funkcji  uzywajac  instrukcji  push.  Ale  nie  w dowolnej kolejnosci :
    ostatni  parametr  na  poczatku, potem trzeci, za nim drugi i na koniec
    pierwszy parametr.

    Zawsze nalezy zachowac taka kolejnosc :  ostatni  parametr na poczatku, 
    a pierwszy na koncu !

    Wszystkie danych wystepujace w tej funkcji sa typu  DWORD  co odpowiada 
    LARGE PUSH (wysylane na stos dane maja 4 bajty). Parametry typu "uType" 
    okreslaja rodzaj okna dialogowego.

    Ich glowne znaczenie to :

      MB_OK               equ 00000000h ; tworzy zwykly przycisk OK 
      MB_OKCANCEL         equ 00000001h ; 2 przyciski: OK i Anuluj 
      MB_ABORTRETRYIGNORE equ 00000002h ; 3 przyciski: Zaniechaj, Ponow 
                                                       i Zignoruj
      MB_YESNOCANCEL      equ 00000003h ; 3 przyciski: Tak, Nie i Anuluj
      MB_YESNO            equ 00000004h ; 2 przyciski: Tak i Nie
      MB_RETRYCANCEL      equ 00000005h ; 2 przyciski: Ponow i Anuluj

    Jezeli chcemy dodac specjalna ikone  po  lewej  stronie  tekstu  musimy 
    dodac jedna z wartosci:

      MB_ICONHAND         equ 00000010h ; wyprobuj zeby przekonac
      MB_ICONQUESTION     equ 00000020h ; co oznaczaja !
      MB_ICONEXCLAMATION  equ 00000030h
      MB_ICONASTERISK     equ 00000040h

    Mozemy takze wybrac domyslny przycisk dodajac jedna z wartosci:

      MB_DEFBUTTON1       equ 00000000h ; domyslny przycisk = pierwszy
      MB_DEFBUTTON2       equ 00000100h ; drugi
      MB_DEFBUTTON3       equ 00000200h ; trzeci
      MB_DEFBUTTON4       equ 00000300h ; i czwarty !

    Inne wartosci (Nie sprawdzalem ich wiec wyprubuj je sam) :

      MB_APPLMODAL        equ 00000000h
      MB_SYSTEMMODAL      equ 00001000h
      MB_TASKMODAL        equ 00002000h
      MB_HELP             equ 00004000h ; przycisk pomocy (wysyla WM_HELP)
      MB_RIGHT            equ 00080000h
      MB_RTLREADING       equ 00100000h

      MB_NOFOCUS          equ 00008000h
      MB_SETFOREGROUND    equ 00010000h
      MB_DEFAULT_DESKTOP_ONLY equ 00020000h
      MB_SERVICE_NOTIFICATION equ 00040000h

      MB_TYPEMASK         equ 0000000Fh
      MB_USERICON         equ 00000080h
      MB_ICONMASK         equ 000000F0h
      MB_DEFMASK          equ 00000F00h
      MB_MODEMASK         equ 00003000h
      MB_MISCMASK         equ 0000C000h

    (Jube: mozna stosowac dowolne kombinacje)
    Ok po wyslaniu na stos wartosci uType, musimy wyslac 2 wskazniki :

      - lpCaption : wskazuje na tytul okna, ktory jest na gorze.

      - lpContent : wskazuje na tresc okna.

    Te dwa parametry  sa wskaznikami  wiec wskazuja tylko na  pierwszy znak
    ciagu. Dlatego ciag musi byc  zakonczony zerem  (null terminated)  zeby 
    system wiedzial gdzie sie konczy.

    Jesli chcesz  wyswietlic  wiadomosc  skladajaca sie z wiecej niz 2 lini
    uzyj:,13,10 na koncu lini zamiast zera ktore oznacza koniec wiadomosci.
    Znak o kodzie 13 (ASCII) oznacza  powrot karetki (kursora) a 10 oznacza
    nastepna linie.    

    Ostatni parametr do wyslania na stos to HWND :  uchwyt  do  aplikacji : 
    jest dla Windows'a,  uzywa go  zeby wiedziec  co  z czym jest polaczone
    (osobiste przypuszczenie).  Wiec  przed  wyslaniem  na  stos  musimy go
    najpierw zdobyc (dalej jest opisane jak)  
    
    Teraz mamy juz wyslane  wszystkie  dane na stos. Mozemy wywolac funkcje 
    API aby stworzyc okno z naszymi parametrami.

    Raz wywolane, okno czeka az urzytkownik nacisnie przycisk. W tym czasie
    nie przywraca ci kontroli i wykonywanie programu jest wstrzymane.

    Jezeli uzytkownik wybierze jakis przycisk, Windows niszczy okno,zwraca
    wartosc nacisnietego przycisku do rejestru EAX i wykonywanie programu
    zostaje wznowione. Wartosc w EAX moze byc:

      IDOK     =   1
      IDCANCEL =   2
      IDABORT  =   3
      IDRETRY  =   4
      IDIGNORE =   5
      IDYES    =   6
      IDNO     =   7
 
    Zeby  zdobyc  wskaznik aplikacji  uzywamy GetModuleHandleA. Ta  funkcja
    API zwraca hwnd programu.

    Mozemy wyslac  wskaznik, wskazujacy na ciag  znakow zakonczony  zerem i
    okreslajacy nazwe procesu do ktorego chcemy uchwyt(hwnd). Jezeli jednak
    chcemy uchwyt ktory Windows przypisuje naszej aplikacji, wysylamy tylko
    zerowa wartosc  i jako wynik  w EAX otrzymujemy  wskaznik do  aktualnie
    otwartego pliku, ktory odpowiada uchwytowi  aplikacji (hwnd).  Mysle ze
    kiedy program jest uruchomiony,  Windows przydziela ten uchwyt, ale nie
    wiem gdzie !

    Jezeli juz wszystko zrobimy, bedziemy chcieli wyjsc z naszego programu. 
    Zeby to zrobic uzyjemy API : ExitProcess. Zanim ja wywolamy musimy wys-
    lac na stos wartosc : kod wyjscia (exit code) ktory jest tym samym co
    w funkcji int 21h/4Ch.



  3.Ogolne informacje.
  --------------------

    Kazda  funkcja  API zanim  zostanie  wywolana, musi byc  zdefiniowana w 
    pliku .asm jako zewnetrzna procedura. Wykorzystuje to assembler: tworzy
    rodzaj tabeli skokow, oraz linker : wypelnia ta tabele wlasciwymi 
    adresami okreslonymi w imports32.lib.



  4.Glowny plik : .ASM
  --------------------

    ;--- Poczatek TUT_01.ASM -->8

              .386
              locals
              jumps
              .model flat,STDCALL

      ; Wszystkie API musza byc zdefiniowane zanim zostana wywolane

              extrn GetModuleHandleA:Proc
              extrn MessageBoxA:Proc
              extrn ExitProcess:Proc

      ; tutaj przechowujemy dane !
              .data

      AppHWnd       dd 0            ; tutaj znajduje sie uchwyt aplikacji !

      MsgBoxCaption db "Lesson 1",0 ; Tytul okna  (ang. caption)

      MsgBoxContent db "Jube pozdrawia,",13,10 ; Tresc okna
                    db "wszystkich crackerow !!!",0

      ; tu sie zaczyna wlasciwy kod programu
              .code

      Start:
              push    0h                      ; 0 = biezaca aplikacja
              call    GetModuleHandleA        ; daje nam uchwyt !
              mov     [AppHWnd],eax           ; i przechowuje go.

              push    20h                     ; rodzaj okna
                                              ; (MB_ICONQUESTION i MB_OK)
              push    offset MsgBoxCaption    ; wskaznik tytulu okna
              push    offset MsgBoxContent    ; wskaznik tresci okna
              push    [AppHWnd]               ; uchwyt aplikacji
              call    MessageBoxA             ; wyswietla okno

              push    0h                      ; nie ma kodu wyjscia
              call    ExitProcess             ; zakoncz dzialanie

      End Start                               ; koniec kodu.

    ;8<- EOF TUT_01.ASM ---



  5.Plik z definicjami : .DEF
  ---------------------------

    ;--- Poczatek TUT_01.DEF -->8

      NAME           TUT_01
      DESCRIPTION    'ASM program'
      EXETYPE        WINDOWS
      CODE           PRELOAD MOVEABLE
      DATA           PRELOAD MOVEABLE MULTIPLE

    ;8<- EOF TUT_01.DEF ---



  6.Plik makefile (ulatwia kompilacje) :
  --------------------------------------

    ;--- Poczatek MakeFile -->8

      # make -B            Will build .EXE
      # make -B -DDEBUG    Will build the debug version.

      NAME = TUT_01
      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)

      .asm.obj:
         tasm32 $(TASMDEBUG) /ml /m2 $&.asm

    ;8<- EOF MakeFile ---



  7.Jak skompilowac.
  ------------------

    Zeby stworzyc plik TUT_01.EXE, zrob tylko pliki TUT_01.ASM, TUT_01.DEF 
    i MAKEFILE uzywajac powyzszych danych. Dodaj katalog path tasm/bin do
    autoexec.bat i po prostu uruchom polecenie : MAKE.



  8.Podziekowania (_HaK_):
  ------------------------

    _Masta_ : when does your next lesson come out ?
    Nemrod  : your punishment continues !! :)
    ReN     : Which university ?

    Zeby sie ze mna skontaktowac : sprobuj niedzielne popoludnia na 
    #Win32asm  (EFNET).

    Nastepna lekcja : twoje pierwsze okno (GUI)!

###########################################################################

  8.Podziekowania (Jube) :
  ------------------------

    Osoby : Plastek, Maxibogas, mNICH, _Hak_, _Masta_
    Grupy : CrackPL, AAOCG, CookieCrk

    Wszelkie uwagi na  *** jube2@poczta.onet.pl  ***

    Odwiedz koniecznie *** http://www.7team.z.pl ***