2010-02-10 4 views
1

Quelqu'un veut-il partager quelques idées sur la façon d'utiliser LSP pour la modification de paquets? J'utilise le sous-type non IFS et je peux voir comment (pseudo?) Les paquets entrent d'abord dans WSPRecv. Mais comment puis-je les modifier? Ma requête concerne une seule réponse HTTP qui appelle WSPRecv à être appelée 3 fois: ((J'ai besoin de modifier plusieurs parties de cette réponse, mais comme il s'agit de 3 tranches, il est assez difficile de la modifier en conséquence. sur d'autres machines ou dans des conditions différentes (comme un trafic élevé), il n'y aurait qu'un seul appel WSPRecv, ou peut-être 10 appels.Quelle est la meilleure façon de travailler autour (s'il vous plaît pas NDIS: D), et comment changer correctement tampon (lpBuffers-> BUF) en l'augmentant?LSP packet modify

int WSPAPI 
WSPRecv(
SOCKET   s, 
LPWSABUF  lpBuffers, 
DWORD   dwBufferCount, 
LPDWORD   lpNumberOfBytesRecvd, 
LPDWORD   lpFlags, 
LPWSAOVERLAPPED lpOverlapped, 
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 
LPWSATHREADID lpThreadId, 
LPINT   lpErrno 
) 
{ 
LPWSAOVERLAPPEDPLUS ProviderOverlapped = NULL; 
SOCK_INFO   *SocketContext = NULL; 
int     ret = SOCKET_ERROR; 


*lpErrno = NO_ERROR; 

// 
// Find our provider socket corresponding to this one 
// 
SocketContext = FindAndRefSocketContext(s, lpErrno); 
if (NULL == SocketContext) 
{ 
    dbgprint("WSPRecv: FindAndRefSocketContext failed!"); 
    goto cleanup; 
} 

// 
// Check for overlapped I/O 
// 
if (NULL != lpOverlapped) 
{ 
    /*bla bla .. not interesting in my case*/ 
} 
else 
{ 
    ASSERT(SocketContext->Provider->NextProcTable.lpWSPRecv); 

    SetBlockingProvider(SocketContext->Provider); 
    ret = SocketContext->Provider->NextProcTable.lpWSPRecv(
      SocketContext->ProviderSocket, 
      lpBuffers, 
      dwBufferCount, 
      lpNumberOfBytesRecvd, 
      lpFlags, 
      lpOverlapped, 
      lpCompletionRoutine, 
      lpThreadId, 
      lpErrno); 
    SetBlockingProvider(NULL); 

    //is this the place to modify packet length and contents ? 

    if (strstr(lpBuffers->buf, "var mapObj = null;")) 
    { 
     int nLen = strlen(lpBuffers->buf) + 200; 
     /*CHAR *szNewBuf = new CHAR[]; 
     CHAR *pIndex; 

     pIndex = strstr(lpBuffers->buf, "var mapObj = null;"); 
     nLen = strlen(strncpy(szNewBuf, lpBuffers->buf, (pIndex - lpBuffers->buf) * sizeof (CHAR))); 
     nLen = strlen(strncpy(szNewBuf + nLen * sizeof(CHAR), "var com = null;\r\n", 17 * sizeof(CHAR))); 
     pIndex += 18 * sizeof(CHAR); 
     nLen = strlen(strncpy(szNewBuf + nLen * sizeof(CHAR), pIndex, 1330 * sizeof (CHAR))); 
     nLen = strlen(strncpy(szNewBuf + nLen * sizeof(CHAR), "if (com == null)\r\n" \ 
              "com = new ActiveXObject(\"InterCommJS.Gateway\");\r\n" \ 
              "com.lat = latitude;\r\n" \ 
              "com.lon = longitude;\r\n}", 111 * sizeof (CHAR))); 
     pIndex = strstr(szNewBuf, "Content-Length:"); 
     pIndex += 16 * sizeof(CHAR); 
     strncpy(pIndex, "1465", 4 * sizeof(CHAR)); 

     lpBuffers->buf = szNewBuf; 
     lpBuffers->len += 128;*/ 
    } 

    if (SOCKET_ERROR != ret) 
    { 
     SocketContext->BytesRecv += *lpNumberOfBytesRecvd; 
    } 
} 

cleanup: 

if (NULL != SocketContext) 
    DerefSocketContext(SocketContext, lpErrno); 

return ret; 
} 

Merci

+0

Je pense que je suis à quelque chose - comment attraper la demande de connexion initiée par mon application cible, puis le rediriger vers mon serveur socket personnalisé qui permettrait de proxy toute la communication entre l'application cible et le serveur Web? Ensuite, je n'attendrai que la réponse http (3 tranches), l'avaler et envoyer à mon application cible ce que je veux. Pourtant, comment puis-je savoir que la réponse Http spécifique est terminée? – kellogs

+0

pouvez-vous poster le code entier ici ou quelque part je suis intéressé à faire cela aussi bien. Je vous remercie. – Para

Répondre

0

mon commentaire a marché. têtes de réponse HTTP/demande avéré fin dans \ r \ n \ r \ n.

Questions connexes