当前位置: 代码迷 >> PB >> 有没有相关API函数,可以让PB程序创建VPN连接,该怎么处理
  详细解决方案

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

热度:120   发布时间:2016-04-29 09:27:22.0
有没有相关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(); }
  相关解决方案