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
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
pouvez-vous poster le code entier ici ou quelque part je suis intéressé à faire cela aussi bien. Je vous remercie. – Para