DEBUG API Erreur: Descripteur non valide

Posté par DalKiT le 11/3/2006 10:53:04
Bonjour à tous,

Je suis en train de jouer avec les DEBUG API sous Windev.
Je colle direct le code pour que vous voyez ou ca cloche:

1) Je déclare des structures propres au Debug API:

STARTUPINFOA est une structure
	cb est un entier
	lpReserved est un entier
	lpDesktop est un entier
	lpTitle est un entier
	dwX est un entier
	dwY est un entier
	dwXSize est un entier
	dwYSize est un entier
	dwXCountChars est un entier
	dwYCountChars est un entier
	dwFillAttribute est un entier
	dwFlags est un entier
	wShowWindow est un entier sur 2 octets
	cbReserved2 est un entier sur 2 octets
	lpReserved2 est un entier
	hStdInput est un entier
	hStdOutput est un entier
	hStdError est un entier
FIN

PROCESS_INFORMATION est une structure
	hProcess est un entier
	hThread est un entier
	dwProcessId est un entier
	dwThreadId est un entier
FIN

EXCEPTION_RECORD est une structure
	ExceptionCode est un entier
	ExceptionFlags est un entier
	ExceptionRecord est un entier
	ExceptionAddress est un entier
	NumberParameters est un entier	ExceptionInformation est un entier
FIN

EXCEPTION_DEBUG_INFO est une structure
	ExceptionRecord est un EXCEPTION_RECORD 	dwFirstChance est un entier
FIN

LOAD_DLL_DEBUG_INFO est une structure
	hFile est un entier
	lpBaseOfDll est un entier
	dwDebugInfoFileOffset est un entier
	nDebugInfoSize est un entier
	lpImageName est un entier
	fUnicode est un entier
FIN

DEBUG_EVENT est une structure
	dwDebugEventCode est un entier
	dwProcessId est un entier
	dwThreadId est un entier
        uExceptionDI est un EXCEPTION_DEBUG_INFO
        uLoadDll est une LOAD_DLL_DEBUG_INFO
FIN


2) Je déclare mes objets:

dbEvent est une DEBUG_EVENT
lpStartupInfo est un STARTUPINFOA
lpProcessInformation est un  PROCESS_INFORMATION


3) Je cré le process:

RetourFonction=API("KERNEL32","CreateProcessA",lpApplicationName,"",Null,Null,Faux,OUBinaire(DEBUG_PROCESS,CREATE_NEW_CONSOLE), Null,Null,&lpStartupInfo,&lpProcessInformation)
SI RetourFonction=-1 ALORS
	Erreur (ErreurInfo())
	FinProgramme()
FIN


4) Si tout se passe bien je commence ma boucle de debuggage:

TANTQUE Vrai
	
	API("KERNEL32","WaitForDebugEvent",&dbEvent,0)
	SI (dbEvent:dwProcessId =  lpProcessInformation:dwProcessId) ALORS
		
		SELON  dbEvent:dwDebugEventCode
			
			CAS EXCEPTION_DEBUG_EVENT
				SELON dbEvent:uExceptionDI:ExceptionRecord:ExceptionCode
						
				FIN

				
			CAS CREATE_PROCESS_DEBUG_EVENT
				Trace ("create porocess: "+dbEvent:dwProcessId)

				
			CAS LOAD_DLL_DEBUG_EVENT
				Size est un entier=API ("KERNEL32","GetFileSize",dbEvent:uLoadDll:hFile,0)
                                //Size me retourne -1
// et l'erreur de erreurinfo est :
// GetLastError a renvoyé 6
// Descripteur non valide	
							
		FIN
	FIN
	
	Multitache(-1)
	API ("KERNEL32","ContinueDebugEvent",dbEvent:dwProcessId,dbEvent:dwThreadId,DBG_CONTINUE)
FIN


dbEvent:uLoadDll:hFile est égal à 0 lors de l'appel à GetFileSize. Donc la j'avoue que je ne vois pas.
J'ai fais la meme chose avec VC++ 6.0 et la ca marche nickel.
J'ai également essayé d'utiliser avec windev l'API CreateFileA me retournant un Handle, puis GetFileSize. Ce test me retourne bien la taille de l executable.

Alors pourquoi dbEvent:uLoadDll:hFile (Qui correspond au handle du module chargé par executable) est égal à 0 ?
Est ce une mauvaise déclaration d une structure ?
Un passage de pointeur oublié ?

Merci d'avances pour vos réponses.

Bonne journée

Cette contribution était de : http://old.wdforge.org/newbb/viewtopic.php?forum=14&topic_id=3693&post_id=15596