Модификация пакета LSP - PullRequest
       11

Модификация пакета LSP

1 голос
/ 11 февраля 2010

Кто-нибудь хочет поделиться некоторыми соображениями о том, как использовать LSP для модификации пакетов?

Я использую подтип не IFS, и я могу видеть, как (псевдо?) Пакеты сначала входят в WSPRecv. Но как мне их изменить? Мой запрос касается одного HTTP-ответа, который заставляет WSPRecv вызываться 3 раза: ((. Мне нужно изменить несколько частей этого ответа, но, поскольку он состоит из 3 фрагментов, его довольно сложно изменить соответствующим образом. И, возможно, на других машинах или в других условиях (например, при интенсивном трафике) будет только один отдельный вызов WSPRecv или, возможно, 10. Вызовите, как лучше всего обойти это (пожалуйста, не NDIS: D), и как правильно изменить буфер (lpBuffers-> buf), увеличив его?

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;
}

Спасибо

1 Ответ

0 голосов
/ 12 февраля 2010

мой комментарий сработал. Заголовки / запрос http завершились в \ r \ n \ r \ n.

...