Кто-нибудь хочет поделиться некоторыми сведениями о том, как использовать LSP для модификации пакетов?LSP-пакет изменить
Я использую подтип non IFS, и я вижу, как (псевдо?) Пакеты сначала вводятся в WSPRecv. Но как мне их изменить? Мой запрос касается одного ответа HTTP, который вызывает WSPRecv для вызова 3 раза: ((Мне нужно изменить несколько частей этого ответа, но поскольку он входит в 3 среза, его довольно сложно изменить соответствующим образом. на других машинах или в разных условиях (например, с высоким трафиком) будет только один единственный вызов WSPRecv или, может быть, 10 вызовов. Каков наилучший способ работы с этим (пожалуйста, не NDIS: D), и как правильно изменить буфер (lpBuffers-> ЬиЕ) за счет увеличения его?
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;
}
Спасибо
Я думаю, что я что-то делаю - как насчет того, чтобы поймать запрос на подключение, инициированный моим целевым приложением, а затем перенаправить его на мой собственный сервер сокетов, который проксирует всю связь между целевым приложением и веб-сервером? Тогда я буду ждать только этого (3 фрагмента) ответа HTTP, проглотить его и отправить свое целевое приложение, что я хочу. Тем не менее, как я узнаю, что ответ Spicful Http завершен? – kellogs
Можете ли вы опубликовать весь код здесь или где-то, я тоже заинтересован в этом. Спасибо. – Para