2010-08-12 5 views
0

Je reçois des plantages profonds dans wininet.dll. Il s'est écrasé en essayant de lire l'emplacement de la mémoire zéro dans HTTP_REQUEST_HANDLE_OBJECT::ReleaseConnectionCause de plantages apparemment aléatoires dans wininet.dll?

Est-ce un bug dans la DLL réelle et non causée par une mauvaise utilisation? !

wininet HTTP_REQUEST_HANDLE_OBJECT :: ReleaseConnection + 0x60
wininet HTTP_REQUEST_HANDLE_OBJECT :: CloseConnection + 0x84
wininet HTTP_REQUEST_HANDLE_OBJECT :: ReadData_Fsm + 0x5e8
wininet CFsm_ReadData :: RunSM + 0x2e
wininet MAFC!: :! Run + 0x39
wininet DoFsm + 0x25
wininet HTTP_REQUEST_HANDLE_OBJECT :: ReadData + 0x38
wininet HTTP_REQUEST_HANDLE_OBJECT :: HttpReadData_Fsm + 0x43
wininet! CFsm_HttpReadData :: RunSM + 0x2e
wininet! MAFC :: Run + 0x39
wininet! DoFsm + 0x25
wininet! HttpReadData + 0x67
wininet! ReadFile_Fsm + 0x2D
wininet! CFsm_ReadFile :: RunSM + 0x2B
wininet! MAFC :: Run + 0x39
wininet! DoFsm + 0x25
wininet! InternetReadFile + 0x3ca

Le contexte est que je suis en train de télécharger un fichier. J'appelle

InternetReadFile (hFichier, lpBuffer, dwNumberOfBytesToRead, lpdwNumberOfBytesRead);

La poignée hFile HINTERNET semble bien (valeur 0x00cc0024 qui semble légitime) le dwNumberOfBytesToRead est 20000.

Ma taille du tampon est 131000 ce qui est bien aussi.

Le truc c'est que mon code fonctionne 99.9999% du temps!

+0

Vous transmettez probablement des données non valides. Quel appel de votre programme provoque le crash? Veuillez coller l'appel et le code environnant pertinent. – Thomas

+3

Vous devrez fournir * beaucoup * plus de contexte, c'est-à-dire un exemple de la manière dont vous appelez WinInet et qui déclenche l'erreur ** et ** du niveau d'O/S et du Service Pack que vous testez.Étant donné que c'est une partie essentielle du système d'exploitation Windows, il est fort probable que la faute vous incombe (bien qu'il y ait toujours une chance que vous ayez trouvé un bogue inconnu dans Windows =) – Rob

+0

J'essaie de télécharger un fichier. J'appelle InternetReadFile (hFichier, lpBuffer, dwNumberOfBytesToRead, lpdwNumberOfBytesRead); La poignée de HFile HINTERNET semble bien (la valeur est 0x00cc0024 qui semble légitime) le dwNumberOfBytesToRead est 20000. – crazyx

Répondre

0

Vérifiez l'utilisation de lpdwNumberOfBytesRead. Il devrait être soit

DWORD *lpdwNumberOfBytesRead = &someDWORDsomewhere; 
InternetReadFile (..., lpdwNumberOfBytesRead); 

ou

DWORD NumBytes 
InternetReadFile (..., &NumBytes); 

J'ai le sentiment que vous faites la première méthode sans réglage de la variable pointeur quelque part valide.

+0

Im faire la deuxième méthode, la chose est mon code fonctionne 99,9999% du temps! Merci pour le pointeur cependant. – crazyx

+0

Si vous voulez une réponse rapide et correcte, veuillez poster le code correspondant. – wallyk

0

J'ai trouvé que le problème était en appelant InternetCloseHandle dans d'autres threads avec un handle déjà fermé. Normalement, cela renvoie juste ERROR_INVALID_HANDLE mais dans certains cas, wininet plante dans InternetCloseHandle ou comme dans ce cas.

Questions connexes