int WSPAPI WSPStartup(
WORD wVersionRequested,
LPWSPDATA pWSPData,
LPWSAPROTOCOL_INFOW lpProtocolInfo,
WSPUPCALLTABLE upcallTable, 
LPWSPPROC_TABLE lpProcTable 
)
{
TCHAR sLibraryPath[512];
LPWSPSTARTUP WSPStartupFunc=NULL;
HMODULE hLibraryHandle=NULL;
INT ErrorCode=0; if (!GetHookProvider(lpProtocolInfo, sLibraryPath)
|| (hLibraryHandle = LoadLibrary(sLibraryPath)) == NULL
|| (WSPStartupFunc = (LPWSPSTARTUP)GetProcAddress(
hLibraryHandle, "WSPStartup")) == NULL
)
return WSAEPROVIDERFAILEDINIT; if ((ErrorCode = WSPStartupFunc(wVersionRequested, lpWSPData
, lpProtocolInfo, upcallTable, lpProcTable)) != ERROR_SUCCESS)
return ErrorCode; NextProcTable = *lpProcTable; lpProcTable->lpWSPSocket=WSPSocket;
//30个服务函数指针设置... return 0;
}SOCKET WSPAPI WSPSocket(
int af,                               
int type,                             
int protocol,                         
LPWSAPROTOCOL_INFOW lpProtocolInfo,   
GROUP g,                              
DWORD dwFlags,                        
LPINT lpErrno
)
{
return NextProcTable.lpWSPSocket(af, type
, protocol, lpProtocolInfo, g, dwFlags, lpErrno);
}//NextProcTable为一个全局变量,保存系统的30个服务函数指针我的疑惑是:NextProcTable = *lpProcTable;获得了30个服务指针,但是在后面lpProcTable->lpWSPSocket=WSPSocket;又重新设定了lpProcTable,lpProcTable中服务函数地址发生了变化,那么NextProcTable中保存的函数地址不是也一样发生变化了吗,那如何还能保存服务函数指针?如果这样,在截获的服务提供者函数WSPSocket中,NextProcTable.lpWSPSocket不就是指向了WSPSocket它自己的函数地址吗?那么如何实现调用底层相应函数进行转发呢?可能自己哪方面没想明白,希望有知道的朋友能解答下,谢谢。

解决方案 »

  1.   

    可以理解的啊,你把它想象成一个链表就很好理解 了
    struct AA

        int a; 
        AA *next;
    };
    一个一个的串接起来,不就是自己看到的。
      

  2.   

    多谢你的提醒,然我思考了下指针的基本知识,我把最基本的指针传递值和指针指向的值弄混了。
    #include <stdio.h>
    int main(){
    int a=5;
    int* c=&a;
    int b;
    b=*c;
    *c=10;
    printf("*c=%d,b=%d\n",*c,b);
    }
    上面这个函数既能解释了。