2010-02-10 5 views
1

Кто-нибудь хочет поделиться некоторыми сведениями о том, как использовать 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; 
} 

Спасибо

+0

Я думаю, что я что-то делаю - как насчет того, чтобы поймать запрос на подключение, инициированный моим целевым приложением, а затем перенаправить его на мой собственный сервер сокетов, который проксирует всю связь между целевым приложением и веб-сервером? Тогда я буду ждать только этого (3 фрагмента) ответа HTTP, проглотить его и отправить свое целевое приложение, что я хочу. Тем не менее, как я узнаю, что ответ Spicful Http завершен? – kellogs

+0

Можете ли вы опубликовать весь код здесь или где-то, я тоже заинтересован в этом. Спасибо. – Para

ответ

0

мой комментарий разработал. HTTP заголовки ответа/запрос оказался конец \ г \ п \ г \ п.

 Смежные вопросы

  • Нет связанных вопросов^_^