2010-02-10 4 views
1

누구나 패킷 수정을 위해 LSP를 사용하는 방법에 대한 통찰력을 공유 할 수 있습니까?LSP 패킷 수정

IFS가 아닌 하위 유형을 사용하고 있으며 WSPRecv에 처음 패킷을 입력하는 방법을 알 수 있습니다. 하지만 어떻게 수정합니까? 내 질문은 WSPRecv가 3 번 호출되는 단일 HTTP 응답에 대한 것입니다. ((이 응답의 여러 부분을 수정해야하지만 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; 
} 

+0

제가 생각하기에 제가 생각하기에 타겟 애플리케이션에서 시작한 연결 요청을 잡아서 대상 애플리케이션과 웹 서버 간의 모든 통신을 프록시하는 내 맞춤 소켓 서버로 리디렉션하는 방법은 무엇입니까? 그런 다음 (3 조각) http 응답을 기다렸다가 삼키고 원하는 대상을 보냅니다. 그래도 spcific Http 응답이 완료되었음을 어떻게 알 수 있습니까? – kellogs

+0

전체 코드를 여기에 게시하거나 어딘가에이 작업을 수행하는 데 관심이 있습니다. 고맙습니다. – Para

답변

0

내 댓글 밖으로 일을 감사드립니다. HTTP를 응답 헤더/요청 \ 연구 \ 없음 \ 연구 \ n을 끝나는 밝혀졌다.