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它自己的函数地址吗?那么如何实现调用底层相应函数进行转发呢?可能自己哪方面没想明白,希望有知道的朋友能解答下,谢谢。
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它自己的函数地址吗?那么如何实现调用底层相应函数进行转发呢?可能自己哪方面没想明白,希望有知道的朋友能解答下,谢谢。
struct AA
{
int a;
AA *next;
};
一个一个的串接起来,不就是自己看到的。
#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);
}
上面这个函数既能解释了。