file n-sdk.txt Utilisation de DrWatson: See SDK WIN31WH search "Dr Watson" Config win.in [Dr. Watson] DisLen=20 ;[8] How Many instructions are disasembly DisStack=10 ;[2] How Many Stack Frames to be disasembly GpContinue=1 ;[1] ;b0=1d Allow Continuation ;b1=2d Write Only three-line reports ;b2=4d Continue even after faults in Kernel ;b3=8d Continue even after fauls in User LogFile=filename ;[DRWATSON.LOG] ShowInfo=dis err loc mod par sou ;[] ;disasembly Enable separate disasembly of the fault add ;errorlog enable error logging ;locals enable stack dumps of local variable and param ;modules enable list of all loaded modules including DLL ;paramlog enable paramter validation error loggin ;sound enable audible warning SkipInfo=inf tim ;[] ;32b itregs disable values of 32bits registers ;clu es disable the dialog box clues ;inf ormation disable system information ;reg isters disable 16 bit registers ;seg ments disable segment contents ;sta ck disable stack bacvktrace ;sum mary disable four lines summary at begging ;tas ks disable list of all active tasks ;tim e disable DrWatson start and stop. Utilisation de CODEVIEW Debugger Deux Exe (Max) CVW /LDeuxieme.exe Premier.exe Deuxieme.exe etant forké par le premier. BreakPoint When Ever Value Has Changed {,,}0xSSSSOOOOL {Function,Module,Exe}Addresse C. Taille 32 => Point d'arret pour n'importe quel exe. option de compilation du CL pour tous /Zpei p: pack structure e: enable extansion (… la norme ansi) i: prepare for debugging /Gf string polling (string folding) /Gx- assume that data is far /Ge add stack check call /Gs remove stack check call /G3 generate 386 code pour DLL pour EXE /c /AM /Od /GA /G3 /W3 /Zpe /D_WINDOWS /c compile only /AM multi code, mono data /Od disable optimisation /GA protected-mode Win entry/exit code /G3 386 instructions /W3 warning level /Zp pack structs /Ze enable extensions (default) /D_WINDOWS /D<name>[=|#text] define macro compatibilit‚: Gw permet de tourner en mode reel/mode proteg‚ CFLAGS = /nologo /W3 /ALw /O1 /D "NDEBUG" /FR /GD LFLAGS = /NOLOGO /NOD /NOE /PACKC:61440 /ALIGN:16 /ONERROR:NOEXE /MAP:FULL LIBS = oldnames libw ldllcew commdlg.lib olecli.lib olesvr.lib shell.lib RCDEFINES = -dNDEBUG =============================================================================== A propos des Taches: =============================================================================== Sous windows les taches sont carract‚ris‚es par des fenˆtres, des instances et des applications: Application: Indentifiant: Non application.exe Caract‚ris‚ un Code Segment Uniques, Des DATA segment multiples (un par instance) et des segments de donn‚es communs (Based Segment par exemples) . Role: Cree les classes de fenˆtres. en les associants … des Fonctions CallBacks. Appel: Interne -> WinExec WinMain(hPrevInst=NULL,hInst) Instance: Plusieurs par application. Indentifiant: hinst. Caracteris‚ par un DATA segment propres. Role: Cree les fenˆtres en les associant … des classes. Dispatche les messages de l'instance Gere les messages de l'instance. Appel WinMain(,hInst) Windows Plusieurs par instance => li‚ … Un CallBack Identifiant: hwnd Plusieurs par instance. Caract‚ris‚ par une classe qui definit quelle CallBack et appel‚e. Role: Reagit aux messages de la callBack Appel CallBack(hWnd). =============================================================================== A propos des messages: =============================================================================== Une pile de message par application. Windows effectue un tourniquet par pile de message. PeekMessage(NULL) PeekMessage dispatche en priorite … son application car il tente de vider --------- d'abord sa pile avant de donner la main aux autres. par contre Yield permet de donner la main aux autres application mais pas … soi meme Peek et Yield ont donc un comportement tres different. De facon general on utilise Peek pour dispatcher … soi mˆme puis aux autres => code reentrant + possibilit‚ de TimeOut plus fin. Yield permet de dispatcher aux autres => code parallele. (Time Out grossier) Il ne rend la main que lorsque toutes les autres piles sont vides. Il existe deux types de messages. SendMessage -> ne rentrerait pas dans le tourniquet des messages … dispatcher. PostMessage -> rentre dans le tourniquet. Le fait d'utiliser un DialogBox dans un SendMessage le bloque et bloque aussi le dispatching (la tache appelante ayant une pile probablement non vide). Pour eviter cela on utilise: if () ReplyMessage() continue le traitement mais rend la main au send au premier dispatch: Par Windows 3 Piles ----------- ------------- ----------- |Pile Send| | Pile Reply| |Pile Post| | | | | | | | | | | | | ----------- ------------- ----------- Appel: SendMessage ReplyMessage PostMessage Actif: Tout De Suite DialogBox PeekMessage Yield ->Translate ->Dispatch Une fois que la fonction PeekMessage a terminer de lire la pile des message il effectue un appel … Yield. Algorithme: SendMessage -> Changement Contexte -> Call CallBack(message) -> Lit la pile du retour. PostMessage: ->Inserer Message dans la PostPile de la windows consider‚e ReplyMessage: ->Inserer reponse dans la ReplyPile des messages. PeekMessage: - Si PostPile de l'appelant non vide Lit le message dans la PostPile de la windows consider‚e ou de toutes les PostPiles de l'instance consid‚r‚e. De toutes fa‡on on ne peut avoir au mieux que les messages de son instance. Retourne le Message et Vrai Sinon -> Yield DialogBox: - Yield (?) ou PeekMessage(?) - Attend reponse utilisateur. Yield - Si ReplyPile non vide Return Message au SendMessage. Sinon Donne la main … l'application suivante ayant effectu‚e un PeekMessage et ayant une PostPile Non Vide. (Tourniquet) Translate Converti le message Dispatch Call CallBack Fonction (message) Windows poste les evenement … l'application except‚ qq rares messages tel que destroy ou bien dde.