有没有相关API函数,可以让PB程序创建VPN连接,该怎么处理

有没有相关API函数,可以让PB程序创建VPN连接
VPN服务器已经存在,每个客户端去配置VPN太烦。能不能用PB调用API函数创建VPN连接??

VPN服务器是固定公网IP,用户名密码都已知

------解决方案--------------------
做一个安装包,直接去安装

或者用pb做个模拟器,模拟一下安装VPN的过程

直接用api调用,应该不可行。
------解决方案--------------------
可以参考

http://topic.csdn.net/u/20080901/11/efafc76e-dfb8-4378-914e-d1de56006eb3.html

C/C++ code

以下为第三段源代码

RcvMACHeader=(PMAC_HEADER)IndicateBuffer; 

if(RcvMACHeader->ProtocolType==IP_PROTOCOL){ 

RcvIPHeader=(PIP_HEADER)(IndicateBuffer+MAC_HEADER_LEN); 

switch( QueryAccessList(RcvIPHeader,QUERY_RCV_PACKET,&sndkeyno) 
{ 

case PACKET_REFUSE: 

return NDIS_STATUS_SUCCESS; 

case PACKET_CLEAR: 

goto forward; 

case PACKET_MUD: 

PacketSize = Decrypt_reg( 
(PUCHAR)RcvIPHea 
er+IP_HEADER_LEN, 
(USHORT)PacketSi 
e-IP_HEADER_LEN, 
sndkeyno 
); 
PacketSize += IP_HEADER_LEN; 

Old_cksum = RcvIPHeader->HeaderCRC; 
RcvIPHeader->HeaderCRC = 0; 
RcvIPHeader->LengthL = (USHORT)(PacketSize)&0x00ff; 
RcvIPHeader->LengthU = ((USHORT)(PacketSize)&0xff00)>>8; 
New_cksum=In_cksum((PUCHAR)RcvIPHeader,IP_HEADER_LEN); 
RcvIPHeader->HeaderCRC=New_cksum; 
LookaheadBufferSize=PacketSize; 

break; 
} 

} 


forward: 
_asm pop edi 
_asm pop esi 
_asm pop ebx 
_asm leave 
_asm jmp [IPReceiveAddr] 

} 

/*VOID NDIS_API 
NSHIM_RegisterMac( 
OUT PNDIS_STATUS Status, 
OUT PNDIS_HANDLE NdisMacHandle, 
IN NDIS_HANDLE NdisWrapperHandle, 
IN NDIS_HANDLE MacMacContext, 
IN PNDIS_MAC_CHARACTERISTICS MacCharacteristics, 
IN UINT CharacteristicsLength 
) 
{ 

WrapperHandle = NdisWrapperHandle; 
MacContext = MacMacContext; 

NdisRegisterMacAddr( 
Status, 
NdisMacHandle, 
NdisWrapperHandle, 
MacMacContext, 
MacCharacteristics, 
CharacteristicsLength 
); 

if(*Status==NDIS_STATUS_SUCCESS){ 

MacHandle = *NdisMacHandle; 

} 

return; 
}*/ 


UINT 
CopyPacketToBuffer( 
IN OUT PUCHAR Buf, // destination 
IN PNDIS_PACKET Packet, // source packet 
IN UINT Offset, // offset in packet 
IN UINT Length // number of bytes to copy 
) 

/*++ 

Routine Description: 

Copies bytes from a packet into a buffer. Used to copy data 
out of a packet during loopback indications. 

Arguments: 

Buf - the destination buffer 
Packet - the source packet 
Offset - the offset in the packet to start copying at 
Length - the number of bytes to copy 

Return Value: 

The actual number of bytes copied; will be less than Length if 
the packet length is less than Offset+Length. 

--*/ 
--*/ 

{ 
PNDIS_BUFFER CurBuffer; 
UINT BytesCopied; 
PUCHAR BufVA; 
UINT BufLen; 
UINT ToCopy; 
UINT CurOffset; 

BytesCopied = 0; 

// 
// First find a spot Offset bytes into the packet. 
// 

CurOffset = 0; 

NdisQueryPacket(Packet, NULL, NULL, &CurBuffer, NULL); 

while (CurBuffer != (PNDIS_BUFFER)NULL) { 

NdisQueryBuffer(CurBuffer, (PVOID *)&BufVA, &BufLen); 

if (CurOffset + BufLen > Offset) { 

break; 

} 

CurOffset += BufLen; 

NdisGetNextBuffer(CurBuffer, &CurBuffer); 

} 

// 
// See if the end of the packet has already been passed. 
// 

if (CurBuffer == (PNDIS_BUFFER)NULL) { 

return 0; 

} 
} 

// 
// Now copy over Length bytes. 
// 

BufVA += (Offset - CurOffset); 

BufLen -= (Offset - CurOffset); 

for (;;) { 

ToCopy = (BytesCopied+BufLen > Length) ? Length - BytesCopied : BufLen; 

NdisMoveMemory(Buf+BytesCopied, BufVA, ToCopy); 

BytesCopied += ToCopy; 

if (BytesCopied == Length) { 

return BytesCopied; 

} 
} 

NdisGetNextBuffer(CurBuffer, &CurBuffer); 

if (CurBuffer == (PNDIS_BUFFER)NULL) { 

break; 

} 

NdisQueryBuffer(CurBuffer, (PVOID *)&BufVA, &BufLen); 

} 

return BytesCopied; 

} 

VOID 
CopyNdisString( PNDIS_STRING D_string, 
PNDIS_STRING S_string 
) 
{ 
{ 
D_string->Length = S_string->Length; 
D_string->MaximumLength = S_string->MaximumLength; 

NdisMoveMemory( D_string->Buffer, S_string->Buffer, S_string->Length); 

return; 
} 


#pragma VxD_ICODE_SEG 
#pragma VxD_IDATA_SEG 

DWORD _stdcall NSHIM_Device_Init(void) 
{ 
Out_Debug_String("NSHIMSAMP: Dynamic Init\n\r"); 
return(VXD_SUCCESS); 
} 

DWORD _stdcall NSHIM_Sys_Crit_Init(void) 
{ 
UCHAR i; 


Ndis_Hook(); 

if((SendBuffer=(PUCHAR)_HeapAllocate(15000,HEAPLOCKEDIFDP|HEAPZEROINIT)) 
=NULL){ 
// SendMACHeader=(PMAC_HEADER)SendBuffer; 
// SendIPHeader =(PIP_HEADER)(SendBuffer+14); 

NdisAllocateBufferPool( 
&ReturnStatus, 
&SendBufferPoolHandle, 
MAX_SEND_BUF_LIST //* NumberOfD 
scriptors 
); 
if(ReturnStatus!=NDIS_STATUS_SUCCESS){} 

NdisAllocatePacketPool( 
&ReturnStatus, 
&SendPacketPoolHandle, 
MAX_SEND_PKT_LIST, //NumberOfDes 
riptors, 
1 //ProtocolReservedLength 
); 

if(ReturnStatus!=NDIS_STATUS_SUCCESS){} 

for(i=0;i 
NdisAllocatePacket( 
&ReturnStatus, 
&SendPktList[i], 
SendPacketPoolHandle 
); 

if(ReturnStatus!=NDIS_STATUS_SUCCESS){} 

} 

SendPktListHead=SendPktListTail=0; 
} 

if((RcvBuffer=(PUCHAR)_HeapAllocate(2000,HEAPLOCKEDIFDP|HEAPZEROINIT))!= 
ULL){ 
TransferBuffer=RcvBuffer+500; 


NdisAllocatePacketPool( 
&ReturnStatus, 
&RcvPacketPoolHandle, 
1, //NumberOfDescriptors, 
0 //ProtocolReservedLength 
); 

if(ReturnStatus!=NDIS_STATUS_SUCCESS){} 

NdisAllocatePacket( 
&ReturnStatus, 
&RcvTransferPacket, 
RcvPacketPoolHandle 
); 
if(ReturnStatus!=NDIS_STATUS_SUCCESS){} 

NdisAllocateBufferPool( 
&ReturnStatus, 
&RcvBufferPoolHandle, 
1 //* NumberOfDescriptors 
); 
if(ReturnStatus!=NDIS_STATUS_SUCCESS){} 

NdisAllocateBuffer( 
&ReturnStatus, 
&RcvPacketBuffer, 
RcvBufferPoolHandle, 
TransferBuffer, //VirtualAddress 

1500 //Length 
); 
if(ReturnStatus!=NDIS_STATUS_SUCCESS){} 

NdisChainBufferAtBack( 
RcvTransferPacket, 
RcvPacketBuffer 
); 
} 

// InitAccessList(); 

}