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.