Message de rapport:
 

Re: DEBUG API Erreur: Descripteur non valide

Sujet: Re: DEBUG API Erreur: Descripteur non valide
par Anonyme sur 12/3/2006 18:39:03

Bonsoir,

Continuant mes tests sur les DEBUG API, je me suis rendu compte que la structure déclarée était incorrecte:

_U est une structure
	uException 			est un EXCEPTION_DEBUG_INFO
	uCreateThread 		est un CREATE_THREAD_DEBUG_INFO
	uCreateProcessInfo 	est un CREATE_PROCESS_DEBUG_INFO
	uExitThread 		est un EXIT_THREAD_DEBUG_INFO
	uExitProcess 		est un EXIT_PROCESS_DEBUG_INFO
	uLoadDll 			est un LOAD_DLL_DEBUG_INFO	
	uUnLoadDll 			est un UNLOAD_DLL_DEBUG_INFO
	uRipInfo 			est un RIP_INFO	
FIN

DEBUG_EVENT est une structure
	
	dwDebugEventCode est un entier sans signe sur 4 octets//Type C : DWORD
	dwProcessId est un entier sans signe sur 4 octets //Type C : DWORD
	dwThreadId est un entier sans signe sur 4 octets //Type C : DWORD
	u est un _u


Je pensais que déclarer une structure transitoire ferait comme le mot clé "union" déclaré dans le fichier WINBASE.H:

typedef struct _DEBUG_EVENT {
    DWORD dwDebugEventCode;
    DWORD dwProcessId;
    DWORD dwThreadId;
    union {
        EXCEPTION_DEBUG_INFO Exception;
        CREATE_THREAD_DEBUG_INFO CreateThread;
        CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
        EXIT_THREAD_DEBUG_INFO ExitThread;
        EXIT_PROCESS_DEBUG_INFO ExitProcess;
        LOAD_DLL_DEBUG_INFO LoadDll;
        UNLOAD_DLL_DEBUG_INFO UnloadDll;
        OUTPUT_DEBUG_STRING_INFO DebugString;
        RIP_INFO RipInfo;
    } u;
} DEBUG_EVENT, *LPDEBUG_EVENT;


Lors de la pratique, c'est autre chose. Je vais essayer d'etre le plus clair possible.
Prenons l'exemple de la structure _U déclarée plus haut: uException est mis en premier et plus loin nous trouvons uLoadDll. Je vais reprendre le corps du code de la boucle de debuggage:

TANTQUE bBoucle=Faux
	
	API("KERNEL32","WaitForDebugEvent",&dbEvent,DBG_INFINITE)
		
	SI (dbEvent:dwProcessId = lpProcessInformation:dwProcessId) ALORS
		
		SELON  dbEvent:dwDebugEventCode
			
			CAS EXCEPTION_DEBUG_EVENT
				SELON dbEvent:uException:ExceptionRecord:ExceptionCode
					
					CAS EXCEPTION_BREAKPOINT
					     //(1) L' evenement passe dans ce cas si uException est mis en 1er dans la structure _U.
					     //Pour info, dbEvent:uException:ExceptionRecord:ExceptionCode est bien égal à -2147483645 (0x80000003),
					     //sinon, il est égal à 1 !! (Je ne sais pas pourquoi).
				FIN

			CAS CREATE_PROCESS_DEBUG_EVENT
				ListeAjoute(LIST_LOG,"Process Created: "+dbEvent:dwProcessId)
				
			CAS LOAD_DLL_DEBUG_EVENT
				//(2) dbEvent:uLoadDll:hFile est correct si uLoadDll est mis en 1er dans la structure _U,
				//sinon, dbEvent:uLoadDll:hFile est incorrect (soit 0, etc ...)

			CAS UNLOAD_DLL_DEBUG_EVENT
				ListeAjoute(LIST_LOG,"Dll Unload: "+dbEvent:uLoadDll:hFile)
		FIN
	SINON

	FIN

	API ("KERNEL32","ContinueDebugEvent",dbEvent:dwProcessId,dbEvent:dwThreadId,DBG_CONTINUE)
FIN


Je récapitule:
-> uLoadDll en 1er: le (2) correct mais pas le (1)
-> uException en 1er: le (1) correct mais pas le (2).

J'ai vérifié en codant le meme programme en C, mais en modifiant dans WINBASE.H la structure DEBUG_EVENT comme ceci (En fait j'ai oté le "union" en le remplacant par une structure: _U):

typedef struct _U
{
    LOAD_DLL_DEBUG_INFO LoadDll;
    EXCEPTION_DEBUG_INFO Exception;
    CREATE_THREAD_DEBUG_INFO CreateThread;
    CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
    EXIT_THREAD_DEBUG_INFO ExitThread;
    EXIT_PROCESS_DEBUG_INFO ExitProcess;
    UNLOAD_DLL_DEBUG_INFO UnloadDll;
    OUTPUT_DEBUG_STRING_INFO DebugString;
    RIP_INFO RipInfo;	

} U, *LPU;

typedef struct _DEBUG_EVENT
{
    DWORD dwDebugEventCode;
    DWORD dwProcessId;
    DWORD dwThreadId;
    U u;
        
} DEBUG_EVENT, *LPDEBUG_EVENT;


Et le plus surprenant, c'est que le programme réagi comme celui de windev suivant si LOAD_DLL_DEBUG_INFO LoadDll est en 1er ou non (idem pour EXCEPTION_DEBUG_INFO Exception).

Donc au final, je pense que la déclaration d'une structure n'est pas la bonne idée (Vous l'aviez deviné je pense ;) )

Donc par quoi pourrais-je la remplacer ?

Merci d'avoir pris le temps de me lire.

Bonne soirée
Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2