Programmation d'un LSP [Résolu]

Signaler
Messages postés
20
Date d'inscription
lundi 24 mai 2004
Statut
Membre
Dernière intervention
11 mai 2006
-
Messages postés
3
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
21 mars 2005
-
Salut,
Dans le SDK de Winsock il y a un exemple d'un LSP que je voudrais réutiliser pour créer un programme capable de remplacer des mots déterminés quand ils apparaissent dans un navigateur ou quand ils arrivent par mail


en lecture je n'ai pas de problème, il suffit que je lise le buffer qui se trouve dans la fonction WSPRecv() pour voir défiler toutes les données récues du web par toute application windows, mais je commence à avoir des problèmes quand j'essaye de modifier ce buffer
d'ailleurs je peux même pas le modifier car j'ai l'impression qu'il est en perpétuelle évolution et voici la preuve:


FILE *stream;
char* buffer4 = new char[InternalBuffers[0].len];
//strncpy(buffer4, InternalBuffers[0].buf,InternalBuffers[0].len);
memcpy(buffer4, InternalBuffers[0].buf,InternalBuffers[0].len);
stream = fopen( "c:\\test_1.txt", "a" );
fprintf( stream, "%d : %s\n",strlen(buffer4),buffer4);
fclose( stream );
stream = fopen( "c:\\test_2.txt", "a" );
fprintf( stream, "%d : %s\n",InternalBuffers[0].len,InternalBuffers[0].buf);
fclose( stream );


Je m'attendais à ce que les deux fichiers soient identiques mais ils ne sont pas identique
Qu'est ce qui cloche à votre avis ?
Merci pour toutes les réponses

14 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Toutes ces fonctions, utilisent des fonctions pour les chaines de caracteres.
Ce que tu pourrais faire, c'est rajouter un \0 a la fin de ton buffer, et utiliser ces fonctions, mais si un \0 se trouve au milieu du buffer, ton code traitera uniquement la 1ere moitier du buffer.
C'est pour ca que je pense qu'il faut utiliser un pointeur pour parcourir du début a la fin ton buffer, tester si l'on pointe sur le bon mot avec memcmp() et remplacer le mot si on le trouve.
Je pense aussi que pendant les tests ils faut se limiter a 1 mot a changer (et a remplacer par un mot de la meme taille: toto => dodo etait une bonne idée) afin de ne pas rendre le code trop compliqué.

Pourrait tu mettre un zip sur le net avec le code du lsp directement copié du SDK de Winsock ? (le code non modifié).
Messages postés
20
Date d'inscription
lundi 24 mai 2004
Statut
Membre
Dernière intervention
11 mai 2006

Si vous voulez voir à quoi ca a l'air vous pouvez telecharger ce fichier:
http://www.ifrance.com/varbool/LSP.zip
et suivre ces étapes :
1) Editez Makefile et remplacez "C:\WINNT\system32" par le chemin de votre répertoire system32
Compilez le projet pour générer votre LSP (lsp.dll sera crée dans system32)
Copiez ces fichiers dans votre rep system32 : sporder.Dll sporder.Exe et inst_lsp.exe
Exécutez "System32\inst_lsp.exe" (LSP est installé)
Ouvrez votre navigateur web et à ce moment là deux fichiers seront créés dans le C et contiendront toutes les données récues par le navigateur
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Tu traites le contenu du buffer comme si il contenait des chaines de caracteres.. alors qu'il n'en contient pas (sauf exeption).
Il faut donc eviter d'afficher le buffer avec %s, ou d'appeler strlen() sur ce buffer.
Messages postés
20
Date d'inscription
lundi 24 mai 2004
Statut
Membre
Dernière intervention
11 mai 2006

Qu'est ce qui vous laisse pensez qu'il ne contient pas de chaines de caractères ?
Et dans ce cas comment je peut le manipuler
merci
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Ben rien ne dis qu'il contient des chaines de caracteres. Meme pour les protocoles qui utilisent du texte (smtp, pop3, http, etc..) les commandes se terminent en général par \n ou \r\n, aucun \0 !
Pour manipuler un buffer, je pense qu'il faudrait savoir la taille des données contenues dans le buffer (car InternalBuffer[0].len c'est la taille du buffer, pas des données qu'il contient, a moins que je me trompe). Ensuite pour écrire ce buffer dans un fichier il suffirait de faire un fwrite() sur le bon nombre d'octets.
Messages postés
20
Date d'inscription
lundi 24 mai 2004
Statut
Membre
Dernière intervention
11 mai 2006

Merci aardman
Je viens d'essayer ton conseil mais le contenu des deux fichiers deumeure toujours different
FILE *stream;
char* buffer4 = new char[InternalBuffers[0].len];
memcpy(buffer4, InternalBuffers[0].buf,InternalBuffers[0].len);


stream = fopen( "c:\\test_1.txt", "a" );
fwrite( buffer4, sizeof( char ), strlen(buffer4), stream );
fclose( stream );


stream = fopen( "c:\\test_2.txt", "a" );
fwrite( InternalBuffers[0].buf, sizeof( char ), InternalBuffers[0].len, stream );
fclose( stream );

Je résume un peut la situation...
J'ai un buffer
Je veux modifier ce buffer de manière à remplacer toutes les occurrences de "toto" par "dodo"
J'ai écrit une fonction Replace() que j'ai bien testée dans un projet à part (elle marche très bien)
Je copie le buffer avec memcpy
Je passe la copie à Replace()
Je récupère le résultat et je l'affecte au buffer d'origine et là tout casse Internet Explorer devient instable et l'affichage des pages catastrophique


Je commence mes investigations...
Test 1:
J'ai viré Replace() et j'ai appliqué juste toupper() au buffer
Résultat : IE est stable les pages s'affichent bien et le texte est en majuscule
Conclusion : il est possible de modifier ce même buffer pour avoir une répercussion directe sur IE


Test 2:
(C'est celui que j'ai collé plus haut)
Je copie le buffer
J'imprime le buffer dans un fichier
J'imprime la copie dans un autre fichier
Et je compare les deux fichiers
Résultat de la comparaison les deux fichiers ne sont pas identique
Conclusion : Le buffer a mystérieusement été modifié entre le moment ou je l'ai copié et le moment ou je l'ai imprimé dans le fichier d'où ma question :
Comment modifier un buffer qui est tout le temps en train d'évoluer ?
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Mais c'est pas le buffer qui est tout le temp entrain d'evoluer, c'est toi qui n'en écrit qu'une partie.
Tu utilises encore un strlen lorsque tu écris dans test1.txt, la bonne facon pour écrire dans un fichier l'etat du buffer c'est celle que tu utilises pour écrire dans le fichier test2.txt.

Je pense que le prob vient de ta fonction Replace(), peut tu mettre son code ici ?
il faudrait faire une fonction qui prend en param un pointeur sur un buffer, et la taille du buffer, et qui remplace toutes les occurences de "toto" par "dodo".
Messages postés
20
Date d'inscription
lundi 24 mai 2004
Statut
Membre
Dernière intervention
11 mai 2006

Salut aardman,
Tu a raison il faut pas que je manipule le buffer avec les fonctions pour les strings, dans Remplacer() j'ai parcouru le buffer mot à mot avec strtok()
Qu'est ce que tu me conseille à la place ?


Tiens il est là mon code :
//InternalBuffers[0].buf = _strupr(InternalBuffers[0].buf);
char* buffer = new char[InternalBuffers[0].len];
memcpy(buffer, InternalBuffers[0].buf,InternalBuffers[0].len);
char seps[] = "<> ,\t\n:_-()";
char *token;
int nbWord;
P_MYWORD hihi;
nbWord = sizeof(tabWord)/sizeof(tabWord[0]);
token = strtok( buffer, seps );
while( token != NULL )
{
hihi = SearchWordQuick(tabWord,nbWord,token);
if (hihi != NULL)
{
Remplacer(buffer,token,hihi->about);
}
token = strtok(NULL, seps );
}
InternalBuffers[0].buf = buffer;



Les fonctions :
int Remplacer(char *Sujet, char *A, const char *B)
{
char FIN[300];
int I;
int J;
int K;
for (I=0; Sujet[I]; I++)
{
if (Sujet[I]==A[0])
{
for (J=1; A[J] && (A[J]==Sujet[I+J]); J++);
if (A[J]=='\0') /* TROUVE ! */
{
for (K=0; Sujet[K+I+J]; K++)
FIN[K]=Sujet[K+I+J];
FIN[K]='\0';
for (K=0; B[K]; K++,I++)
Sujet[I]=B[K];
for (K=0; FIN[K]; K++)
Sujet[I+K]=FIN[K];
Sujet[I+K]='\0';
I--;
}
}
}
return 0;
}


(Cette fonction je l'ai trouvée dans CppFrance)
P_MYWORD SearchWordQuick(P_MYWORD tab,int nbWord,const char *word)
{
int f;
int r;
if(nbWord <= 0)
{
return NULL;
}
f = 1;
while((f<<=1) < nbWord); //ici un point-virgule !
f>>=1;
r = 0;
do
{
int s;
r += f;
if(r >= nbWord)
{
r -= f;
}
else
{
s = strcmp(word,(tab + r)->name);
if(s == 0)
{
return tab + r;
}
else if(s < 0)
{
r -= f;
}
}
}while(f >>= 1);
return strcmp(word,(tab + r)->name)
?
(NULL) // n'existe pas dans le tableau
:
(tab + r); // existe dans le tableau
}


Les déclarations:
typedef struct TagMYWORD
{
const char *name;
const char *about;
}MYWORD,*P_MYWORD;


// Les mots doivent être classés par ordre alphabétique
MYWORD tabWord[] =
{
{ "Aoao", "gtdgd"},
{ "Bobo", "zzee"},
{ "Coco", "ssse"},
{ "Dodo", "zz"},
{ "Eoeo", "aaaa"},
{ "Fofo", "ssdc"},
{ "Gogo", "fgg"},
{ "Hoho", "xxdd"},
{ "Roro", "ffg"},
{ "Soso", "fff"},
{ "Toto", "Dodo"},
{ "Xoxo", "ffff"},
{ "Yoyo", "Bffff4"},
{ "Zozo", "fff"}
};


http://www.ifrance.com/varbool/LSP.zip
Merci
Messages postés
20
Date d'inscription
lundi 24 mai 2004
Statut
Membre
Dernière intervention
11 mai 2006

Salut,
LSP modifié :
http://www.ifrance.com/varbool/lsp.zip

LSP de chez Microsoft :
http://www.ifrance.com/varbool/layered.exe


Je te serai très reconnaissant si tu me donne un lien ou un exemple de fonction
Messages postés
3
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
21 mars 2005

Bonjour,

J'ai visual c++ 6.0 version pro, je viens d'installer ton lsp modifié et les fichiers test_1
et test_2 ne sont pas créés (j'ai suivit la démarche dont tu parlais)
As tu une idée d'ou ca peut venir?
De plus comment puis je maintenant desinstaller ton lsp ?
(je ne peux plus supprimer le fichier lsp.dll)

Merci
Messages postés
20
Date d'inscription
lundi 24 mai 2004
Statut
Membre
Dernière intervention
11 mai 2006

Salut,
Tu a copier sporder.Dll sporder.Exe inst_lsp.exe et lsp.dll dans system32 ?
Tu a executé instlsp.exe ?
si oui que se passe t il quand tu ouvre IE ?
erreur dns ?

pour desinstaller lsp il suffit dexecuter instlsp.exe une seconde fois
Messages postés
3
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
21 mars 2005

Bonjour,

Bien je n'ai pas de de fichier sporder.dll ni sporder.exe.
oui j'ai executé instlsp.exe
quand j'ouvre ie rie nde particulier se passe tout marche bien mais
je n'ai pas les fihiers de test de créés.

Merci,
Messages postés
20
Date d'inscription
lundi 24 mai 2004
Statut
Membre
Dernière intervention
11 mai 2006

desolé je l'avais oublié
telecharge le d'ici :

http://www.ifrance.com/varbool/zayd.zip

si t'arrive pas à effacer la dll tu peux toujours la renommer !! c'est ce que je fais moi
Messages postés
3
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
21 mars 2005

Bonjour,

ca marche toujours pas : aucun fichier de test créé, j'ai refait toute la manipulation,
j'ai placé en plus ton fichier sporder.dll mais il manque toujours le fichier sporder.exe.

de plus si je n'ai pas les droits pour effacer je ne les ai pas non plus pour renommer.