首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > PB >

有没有有关API函数,可以让PB程序创建VPN连接

2012-12-31 
有没有相关API函数,可以让PB程序创建VPN连接本帖最后由 assdeng 于 2009-09-27 19:54:18 编辑VPN服务器已

有没有相关API函数,可以让PB程序创建VPN连接
本帖最后由 assdeng 于 2009-09-27 19:54:18 编辑 VPN服务器已经存在,每个客户端去配置VPN太烦。能不能用PB调用API函数创建VPN连接??

VPN服务器是固定公网IP,用户名密码都已知
[解决办法]
做一个安装包,直接去安装

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

直接用api调用,应该不可行。
[解决办法]
本帖最后由 lzp_lrp 于 2009-09-27 23:11:52 编辑 可以参考

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


以下为第三段源代码

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(); 





[/code]
[解决办法]
给你段源代码,C的

[code=C/C++]
由于前面友人向我要win9x下的vpn源代码,我相信肯定有 
人看了我前面的简介还是不太明白,干脆贴在下面。 
下文来自17的毕业论文,别的东西不好都贴上来,毕竟还有 
点军队背景。 

为了免得大家看的麻烦,我就不分成几块了,其实我是很喜欢 
灌水的;-) 
1.Ndisshim.h,C语言头文件。 
/**************************************************************************** 
* * 
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY * 
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * 
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR * 
* PURPOSE. * 
* * 
****************************************************************************/ 

#define WANTVXDWRAPS 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


MAKE_HEADER(DWORD,_stdcall,VKD_Filter_Keyboard_Input, (VOID)) 
MAKE_HEADER(VOID,_cdecl,Ndis_Hook, ()) 
MAKE_HEADER(DWORD,_cdecl,_SHELL_PostMessage,(DWORD,DWORD,DWORD,DWORD,DWORD,DWORD 

MAKE_HEADER(USHORT,_cdecl,Encrypt_reg,(PUCHAR,USHORT,USHORT)) 
MAKE_HEADER(USHORT,_cdecl,Decrypt_reg,(PUCHAR,USHORT,USHORT)) 



#define Ndis_Hook PREPEND(Ndis_Hoo 

#define _SHELL_PostMessage PREPEND(_SHELL_PostMessage) 


#define Encrypt_reg PREPEND(Encrypt_ 
eg) 
#define Decrypt_reg PREPEND(Decrypt_ 
eg) 

#define WM_NSHIM_NEW 3002 

#define IP_PROTOCOL 0x0008 
#define IP_HEADER_LEN 20 
#define MAC_HEADER_LEN 14 

#define NSHIM_VERSION 0x400 

#define NSHIM_V86_FUNCTION1 1 
#define NSHIM_V86_FUNCTION2 2 
#define NSHIM_PM_FUNCTION1 1 
#define NSHIM_PM_FUNCTION2 2 

#define MAX_NSHIM_W32_API (sizeof(NSHIM_W32_Proc)/sizeof(DWORD)) 
#define MAX_SEND_BUF_LIST 10 
#define MAX_SEND_PKT_LIST 10 
#define MAX_SEND_APPEND_LEN 21 
#define MAX_ADAPTER_NUM 5 

#define PACKET_REFUSE 0 
#define PACKET_MUD 1 
#define PACKET_CLEAR 2 
#define PACKET_D_REFUSE 3 
#define PACKET_D_QUERY 4 
#define PACKET_D_CLEAR 5 

#define QUERY_SEND_PACKET 0 
#define QUERY_RCV_PACKET 1 

/*#define ENCRYPT_Service Declare_Service 
#define ENCRYPT_DEVICE_ID 0x1800 

Begin_Service_Table(ENCRYPT) 
ENCRYPT_Service(Encrypt_reg) 
ENCRYPT_Service(Decrypt_reg) 
End_Service_Table(ENCRYPT)*/ 

typedef DIOCPARAMETERS *LPDIOC; 

typedef struct _MAC_HEADER{ 
UCHAR MAC_DA[6]; 
UCHAR MAC_SA[6]; 
USHORT ProtocolType; 
} MAC_HEADER, *PMAC_HEADER; 

typedef struct _IP_HEADER{ 
UCHAR Ver; 
UCHAR Service; 
UCHAR LengthU; 
UCHAR LengthL; 
USHORT Identification; 
USHORT FragmentOffset; 
UCHAR LiveTime; 
UCHAR Protocol; 
USHORT HeaderCRC; 
ULONG IP_SA; 
ULONG IP_DA; 
} IP_HEADER, *PIP_HEADER; 

typedef struct _AC_ITEM 

ULONG ip; 
ULONG net_mask; 
USHORT access; 
USHORT sndkeyno; 
} AC_ITEM, *PAC_ITEM; 

typedef struct _EXCP_ITEM 

ULONG ip; 
USHORT tcp_port; 
} EXCP_ITEM, *PEXCP_ITEM; 

typedef struct _BINDING_INFO{ 
NDIS_HANDLE BindingHandle; 
UCHAR CtrlActived; 
NDIS_STRING Name; 
} BINDING_INFO, *PBINDING_INFO; 

typedef struct _PENDING_INFO{ 
NDIS_HANDLE ProtocolBindingContext; 
PNDIS_HANDLE NdisBindingHandle; 
NDIS_STRING Name; 
} PENDING_INFO, *PPENDING_INFO; 

DWORD _stdcall NSHIM_W32_DeviceIOControl(DWORD, DWORD, DWORD, LPDIOC); 
DWORD _stdcall NSHIM_CleanUp(void); 
DWORD _stdcall NSHIM_W32_OpenWnd(DWORD, DWORD, LPDIOC); 
DWORD _stdcall NSHIM_W32_CloseWnd(DWORD, DWORD, LPDIOC); 
DWORD _stdcall NSHIM_W32_GetAdapterInfo(DWORD, DWORD, LPDIOC); 
DWORD _stdcall NSHIM_W32_SetAdapterState(DWORD, DWORD, LPDIOC); 
DWORD _stdcall NSHIM_W32_SetACState(DWORD, DWORD, LPDIOC); 
DWORD _stdcall NSHIM_W32_LoadAccList(DWORD, DWORD, LPDIOC); 
DWORD _stdcall NSHIM_W32_LoadExcpList(DWORD, DWORD, LPDIOC); 

VOID _stdcall NSHIM_Send(PNDIS_STATUS, NDIS_HANDLE, PNDIS_PACKET); 



VOID _stdcall NSHIM_Request( 
OUT PNDIS_STATUS Status, 
IN NDIS_HANDLE NdisBindingHandle, 
IN PNDIS_REQUEST Request 
); 

VOID NDIS_API 
NSHIM_RegisterProtocol( 
OUT PNDIS_STATUS Status, 
OUT PNDIS_HANDLE NdisProtocolHandle, 
IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, 
IN UINT CharacteristicsLength 
); 

NDIS_STATUS NDIS_API 
NSHIM_IPReceive( 
IN NDIS_HANDLE NdisBindingContext, 
IN NDIS_HANDLE MacReceiveContext, 
IN PVOID HeaderBuffer, 
IN UINT HeaderBufferSize, 
IN PVOID LookaheadBuffer, 
IN UINT LookaheadBufferSize, 
IN UINT PacketSize 
); 


VOID NDIS_API 
VOID NDIS_API 
NSHIM_IPSendComplete( 
IN NDIS_HANDLE NdisBindingContext, 
IN PNDIS_PACKET Packet, 
IN NDIS_STATUS Status 
); 

VOID NDIS_API 
NSHIM_IPOpenAdapterComplete( 
IN NDIS_HANDLE ProtocolBindingContext, 
IN NDIS_STATUS Status, 
IN NDIS_STATUS OpenErrorStatus 
); 

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 
); 

VOID 
VOID 
CopyNdisString( PNDIS_STRING D_string, 
PNDIS_STRING S_string 
); 

extern USHORT In_cksum( unsigned char *buf, 
int len); 

/*USHORT Encrypt_reg(PUCHAR buffer, 
USHORT buflen, 
USHORT sndkeyno 
); 

USHORT Decrypt_reg(PUCHAR buffer, 
USHORT buflen, 
USHORT sndkeyno 
);*/ 


UCHAR QueryAccessList(PIP_HEADER Ip_header, 
UCHAR QueryType, 
PUSHORT sndkeyno 
); 

UCHAR LoadAccessList(PUCHAR buffer, 
ULONG buflen 
); 

UCHAR LoadExceptList(PUCHAR buffer, 
ULONG buflen 
); 

VOID UnloadLists(); 

extern DWORD NdisIndicateReceiveAddr; 
extern DWORD NdisRequestAddr; 
extern DWORD NdisCompleteSendAddr; 
//extern DWORD NdisRegisterProtocolAddr; 
extern DWORD IPReceiveAddr; 
extern DWORD IPSendCompleteAddr; 

extern PUCHAR RcvBuffer; 
extern PUCHAR IndicateBuffer; 
extern PUCHAR TransferBuffer; 
extern NDIS_HANDLE RcvPacketPoolHandle; 
extern PNDIS_PACKET RcvTransferPacket; 
extern NDIS_HANDLE RcvBufferPoolHandle; 
extern PNDIS_BUFFER RcvPacketBuffer; 
extern PMAC_HEADER RcvMACHeader; 
extern PIP_HEADER RcvIPHeader; 

extern PUCHAR SendBuffer; 
extern PUCHAR CurSendBuffer; 
extern PMAC_HEADER SendMACHeader; 
extern PIP_HEADER SendIPHeader; 
extern NDIS_HANDLE SendBufferPoolHandle; 
extern NDIS_HANDLE SendPacketPoolHandle; 
extern PNDIS_PACKET SendPktList[MAX_SEND_PKT_LIST]; 


extern CHAR SendPktListHead; 
extern CHAR SendPktListTail; 
extern PNDIS_PACKET ReservedPkt[MAX_SEND_PKT_LIST]; 


extern NDIS_STATUS ReturnStatus; 
extern PNDIS_BUFFER BUFFER; 
extern DWORD CopiedLen; 
extern UINT BytesTransfered; 

extern USHORT Old_cksum,New_cksum; 

extern DWORD ViewHandle; 
extern BINDING_INFO BindingAdapterInfo[MAX_ADAPTER_NUM]; 
extern UCHAR BindingAdapterNum; 

2.Nshim.c 垫片的C语言程序 

#include "ndisshim.h" 

UINT CurSendPktLen; 
UINT MaxSendPktLen; 

DWORD NdisIndicateReceiveAddr; 
DWORD NdisRequestAddr; 
DWORD NdisCompleteSendAddr; 
//DWORD NdisRegisterProtocolAddr; 
DWORD IPReceiveAddr; 
DWORD IPSendCompleteAddr; 
DWORD IPOpenAdapterCompleteAddr; 


VOID (NDIS_API *NdisSendAddr )( PNDIS_STATUS, NDIS_HANDLE, PNDIS_PACKET); 
VOID (NDIS_API *NdisOpenAdapterAddr)( 
PNDIS_STATUS , 
PNDIS_STATUS , 
PNDIS_HANDLE , 
PUINT , 
PNDIS_MEDIUM , 
UINT , 
NDIS_HANDLE , 
NDIS_HANDLE , 
PNDIS_STRING , 
UINT , 
PSTRING 
); 

VOID (NDIS_API *NdisRegisterProtocolAddr)( 
PNDIS_STATUS , 
PNDIS_HANDLE , 
PNDIS_PROTOCOL_CHARACTERISTICS , 
UINT 
); 


/*VOID (NDIS_API *NdisRegisterMacAddr)( PNDIS_STATUS , 
PNDIS_H 
NDLE, 
NDIS_HA 
DLE , 
NDIS_HA 
DLE , 
PNDIS_M 
C_CHARACTERISTICS, 
UINT 
);*/ 

PUCHAR RcvBuffer; 
PUCHAR IndicateBuffer; 
PUCHAR TransferBuffer; 
NDIS_HANDLE RcvPacketPoolHandle; 
PNDIS_PACKET RcvTransferPacket; 
NDIS_HANDLE RcvBufferPoolHandle; 
PNDIS_BUFFER RcvPacketBuffer; 
PMAC_HEADER RcvMACHeader; 
PIP_HEADER RcvIPHeader; 


PUCHAR SendBuffer; 
PUCHAR CurSendBuffer; 
PMAC_HEADER SendMACHeader; 
PIP_HEADER SendIPHeader; 
NDIS_HANDLE SendBufferPoolHandle; 
NDIS_HANDLE SendPacketPoolHandle; 
PNDIS_PACKET SendPktList[MAX_SEND_PKT_LIST]; 
CHAR SendPktListHead; 
CHAR SendPktListTail; 
PNDIS_PACKET ReservedPkt[MAX_SEND_PKT_LIST]; 


NDIS_STATUS ReturnStatus; 
PNDIS_BUFFER BUFFER; 
DWORD CopiedLen; 
UINT BytesTransfered; 
UCHAR ReadInfoOK=0; 
NDIS_HANDLE IPHandle; 
UCHAR AdapterNameBuf[2*MAX_ADAPTER_NUM][10]; 
BINDING_INFO BindingAdapterInfo[MAX_ADAPTER_NUM]; 
PENDING_INFO PendingOpenAdapter[MAX_ADAPTER_NUM]; 
UCHAR BindingAdapterNum = 0; 
UCHAR PendOpenNum = 0; 
NDIS_STRING TcpName = NDIS_STRING_CONST("MSTCP"); 
//NDIS_HANDLE MacHandle; 
//NDIS_HANDLE WrapperHandle; 
//NDIS_HANDLE MacContext; 

USHORT Old_cksum,New_cksum; 


VOID _stdcall NSHIM_Send( 
OUT PNDIS_STATUS Status, 
IN NDIS_HANDLE NdisBindingHandle, 
IN PNDIS_PACKET Packet 


USHORT sndkeyno; 
UCHAR i; 

for(i=0;i 
if(BindingAdapterInfo[i].BindingHandle==NdisBindingHandle&& Bind 
ngAdapterInfo[i].CtrlActived) 
break; 


[code]
[解决办法]


if(i==BindingAdapterNum) goto forward; 

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

if(CurSendPktLen>MaxSendPktLen) MaxSendPktLen=CurSendPktLen; 

if(SendBuffer!=NULL){ 

CurSendBuffer=SendBuffer+1500*SendPktListHead; 
SendMACHeader=(PMAC_HEADER)CurSendBuffer; 
SendIPHeader=(PIP_HEADER)(CurSendBuffer+MAC_HEADER_LEN); 

CopiedLen=CopyPacketToBuffer( 
CurSendBuffer, 
Packet, 
0, 
MAC_HEADER_LEN //+IP_HEADER_LEN 
); 

if(SendMACHeader->ProtocolType==IP_PROTOCOL){ 

CopiedLen = CopyPacketToBuffer( 
CurSendBuffer+MAC_HEADER_LEN,//+IP_HEADE 
_LEN, 
Packet, 
MAC_HEADER_LEN, //+IP_HEADER_LEN, 
CurSendPktLen-MAC_HEADER_LEN //-IP_HEAD 
R_LEN 
); 

switch( QueryAccessList(SendIPHeader,QUERY_SEND_PACKET,& 
ndkeyno) ){ 

case PACKET_REFUSE : 

*Status=NDIS_STATUS_SUCCESS; 
return; 

case PACKET_CLEAR : 


break; 

case PACKET_MUD : 

CurSendPktLen = Encrypt_reg( 
(PUCHAR) 
endIPHeader+IP_HEADER_LEN, 
CurSendP 
tLen-MAC_HEADER_LEN-IP_HEADER_LEN, 
sndkeyno 
); 
CurSendPktLen += (MAC_HEADER_LEN+IP_HEADER_LEN); 

Old_cksum = SendIPHeader->HeaderCRC; 
SendIPHeader->HeaderCRC = 0; 
SendIPHeader->LengthL = (CurSendPktLen-MAC_HEADE 
_LEN)&0xff; 
SendIPHeader->LengthU = ((CurSendPktLen-MAC_HEAD 
R_LEN)&0xff00)>>8; 
New_cksum = In_cksum((PUCHAR)SendIPHeader,20); 
SendIPHeader->HeaderCRC = New_cksum; 


break; 


NdisQueryPacket(SendPktList[SendPktListHead], NULL, NULL 
&BUFFER, NULL); 

if(BUFFER!=NULL){ 
NdisUnchainBufferAtBack( SendPktList[SendPktList 
ead],&BUFFER); 
NdisFreeBuffer(BUFFER); 


NdisAllocateBuffer( 
&ReturnStatus, 
&BUFFER, 
SendBufferPoolHandle, 
CurSendBuffer, //VirtualAddress, 
CurSendPktLen //Length 
); 

NdisChainBufferAtBack( SendPktList[SendPktListHead],BUFF 
R); 
R); 

SendPktList[SendPktListHead]->ProtocolReserved[0]=SendPk 
ListHead; 
ReservedPkt[SendPktListHead]=Packet; 

NdisSendAddr( Status, 
NdisBindingHandle, 
SendPktList[SendPktListHead] 
); 

if(*Status!=NDIS_STATUS_SUCCESS){ 

SendPktListHead++; 
if(SendPktListHead==MAX_SEND_PKT_LIST) 
SendPktListHead=0; 


return; 






forward: 
_asm pop edi 
_asm pop esi 
_asm pop ebx 
//_asm pop ebp 
_asm leave 
_asm jmp [NdisSendAddr] 




VOID NDIS_API 


NSHIM_IPSendComplete( 
IN NDIS_HANDLE NdisBindingContext, 
IN PNDIS_PACKET Packet, 
IN NDIS_STATUS Status 


UCHAR i; 

for(i=0;i 
if(BindingAdapterInfo[i].BindingHandle==(*((PUINT)NdisBindingCon 
ext+1)) && 
BindingAdapterInfo[i].CtrlActived) 
break; 



if(i==BindingAdapterNum) goto forward; 

if(SendBuffer!= NULL){ 

CurSendBuffer = SendBuffer+SendPktListHead*1500; 
SendMACHeader = (PMAC_HEADER)CurSendBuffer; 

CopiedLen = CopyPacketToBuffer( 
CurSendBuffer, 
Packet, 
0, 
MAC_HEADER_LEN //+IP_HEADER_LEN 
); 


if(SendMACHeader->ProtocolType==IP_PROTOCOL){ 
Packet=ReservedPkt[Packet->ProtocolReserved[0]]; 



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




VOID NDIS_API 
NSHIM_Request( 
OUT PNDIS_STATUS Status, 
IN NDIS_HANDLE NdisBindingHandle, 
IN PNDIS_REQUEST Request 



UCHAR i; 

for(i=0;i 
if(BindingAdapterInfo[i].BindingHandle==NdisBindingHandle ) 
break; 



if(i==BindingAdapterNum) goto forward; 

if( Request->RequestType == NdisRequestQueryInformation){ 

switch ( Request->DATA.QUERY_INFORMATION.Oid ){ 

case OID_GEN_MAXIMUM_FRAME_SIZE: 

*(PULONG)Request->DATA.QUERY_INFORMATION.InformationBuff 
r=1024-14; 
break; 

case OID_GEN_MAXIMUM_TOTAL_SIZE: 

*(PULONG)Request->DATA.QUERY_INFORMATION.InformationBuff 
r=1024; 
break; 

default: 

goto forward; 



Request->DATA.QUERY_INFORMATION.BytesWritten=4; 
Request->DATA.QUERY_INFORMATION.BytesNeeded=4; 
*Status=NDIS_STATUS_SUCCESS; 
return; 


forward: 

_asm pop edi 
_asm pop esi 
_asm pop ebx 
_asm leave 
_asm jmp [NdisRequestAddr] 



VOID NDIS_API 
NSHIM_RegisterProtocol( 
OUT PNDIS_STATUS Status, 
OUT PNDIS_HANDLE NdisProtocolHandle, 
IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, 
IN UINT CharacteristicsLength 


if( !(NdisEqualString( 
&TcpName, 
&ProtocolCharacteristics->Name, 
FALSE 
)) ) 
goto forward; 

IPReceiveAddr = ProtocolCharacteristics->ReceiveHandler; 
ProtocolCharacteristics->ReceiveHandler = NSHIM_IPReceive; 

IPSendCompleteAddr = ProtocolCharacteristics->SendCompleteHandler; 
ProtocolCharacteristics->SendCompleteHandler = NSHIM_IPSendComplete; 

IPOpenAdapterCompleteAddr = ProtocolCharacteristics->OpenAdapterComplete 
andler; 
ProtocolCharacteristics->OpenAdapterCompleteHandler = NSHIM_IPOpenAdapte 
Complete; 

NdisRegisterProtocolAddr( 
Status, 
NdisProtocolHandle, 


ProtocolCharacteristics, 
CharacteristicsLength 
); 
if( *Status==NDIS_STATUS_SUCCESS) 
IPHandle = *NdisProtocolHandle; 

return; 

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



VOID NDIS_API 
NSHIM_OpenAdapter( 
OUT PNDIS_STATUS Status, 
OUT PNDIS_STATUS OpenErrorStatus, 
OUT PNDIS_HANDLE NdisBindingHandle, 
OUT PUINT SelectedMediumIndex, 
IN PNDIS_MEDIUM MediumArray, 
IN UINT MediumArraySize, 
IN NDIS_HANDLE NdisProtocolHandle, 
IN NDIS_HANDLE ProtocolBindingContext, 
IN PNDIS_STRING AdapterName, 
IN UINT OpenOptions, 
IN PSTRING AddressingInformation OPTIONAL 



if( NdisProtocolHandle!=IPHandle ) goto forward; 

PendingOpenAdapter[PendOpenNum].ProtocolBindingContext = ProtocolBinding 
ontext; 
PendingOpenAdapter[PendOpenNum].NdisBindingHandle = NdisBindingHandle; 
PendingOpenAdapter[PendOpenNum].Name.Buffer = AdapterNameBuf[PendOpenNum 
MAX_ADAPTER_NUM]; 

CopyNdisString( 
&PendingOpenAdapter[PendOpenNum].Name, 
AdapterName 
); 
PendOpenNum++; 

NdisOpenAdapterAddr( 
Status, 
OpenErrorStatus, 
NdisBindingHandle, 
SelectedMediumIndex, 
MediumArray, 
MediumArraySize, 
NdisProtocolHandle, 
ProtocolBindingContext, 
AdapterName, 
OpenOptions, 
AddressingInformation 
); 

if(*Status==NDIS_STATUS_SUCCESS){ 

BindingAdapterInfo[BindingAdapterNum].BindingHandle = *NdisBindi 
gHandle; 
BindingAdapterInfo[BindingAdapterNum].Name.Buffer = AdapterNameB 
f[BindingAdapterNum]; 

CopyNdisString( 
&BindingAdapterInfo[BindingAdapterNum].Name, 
AdapterName 
); 

BindingAdapterNum++; 


return; 

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

VOID NDIS_API 
NSHIM_IPOpenAdapterComplete( 
IN NDIS_HANDLE ProtocolBindingContext, 
IN NDIS_STATUS Status, 
IN NDIS_STATUS OpenErrorStatus 


UCHAR i; 

for(i=0;i 
if(PendingOpenAdapter[i].ProtocolBindingContext==ProtocolBinding 
ontext) 
ontext) 
break; 



if(i==PendOpenNum) goto forward; 

if(Status==NDIS_STATUS_SUCCESS){ 

BindingAdapterInfo[BindingAdapterNum].BindingHandle = *PendingOp 
nAdapter[i].NdisBindingHandle; 
BindingAdapterInfo[BindingAdapterNum].Name.Buffer = AdapterNameB 
f[BindingAdapterNum]; 

CopyNdisString( 
&BindingAdapterInfo[BindingAdapterNum].Name, 
&PendingOpenAdapter[i].Name 
); 

BindingAdapterNum++; 


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






NDIS_STATUS NDIS_API 
NSHIM_IPReceive( 
IN NDIS_HANDLE NdisBindingContext, 
IN NDIS_HANDLE MacReceiveContext, 
IN PVOID HeaderBuffer, 
IN UINT HeaderBufferSize, 
IN PVOID LookaheadBuffer, 
IN UINT LookaheadBufferSize, 
IN UINT PacketSize 


USHORT sndkeyno; 
UCHAR i; 

for(i=0;i 
if(BindingAdapterInfo[i].BindingHandle==(*((PUINT)NdisBindingCon 
ext+1)) && 
BindingAdapterInfo[i].CtrlActived) 
break; 



if(i==BindingAdapterNum) goto forward; 

if(LookaheadBufferSize!=PacketSize){ 

IndicateBuffer=TransferBuffer-HeaderBufferSize-LookaheadBufferSi 
e; 

NdisMoveMemory( IndicateBuffer, HeaderBuffer, HeaderBufferSize); 
NdisMoveMemory( IndicateBuffer+HeaderBufferSize, LookaheadBuffer 
LookaheadBufferSize); 



NdisTransferData( 
&ReturnStatus, 
*((PUINT)NdisBindingContext+1), 
MacReceiveContext, 
LookaheadBufferSize, // ByteOffset, 
PacketSize-LookaheadBufferSize, //BytesT 
Transfer, 
RcvTransferPacket, 
&BytesTransfered 
); 

HeaderBuffer=IndicateBuffer; 
LookaheadBuffer=IndicateBuffer+HeaderBufferSize; 
LookaheadBufferSize = PacketSize; 

}else{ 

IndicateBuffer=HeaderBuffer; 



[解决办法]
既然不是pb能做的,所以我就想到了用脚本或批处理,于是就网上搜索了一下,测了,不知道对不对(因为不太懂):
1、
@echo off & color 0a
echo ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo create vpn
echo ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::导入注册表::::::::::::::::::::::::::::::::
(echo Windows Registry Editor Version 5.00
echo.
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\Parameters]
echo.
echo "ProhibitIPSec"=dword:00000001)>%temp%\vpn.reg
regedit.exe /s %temp%\vpn.reg >nul
::::::::::::::::::::::::::创建vpn::::::::::::::::::::::::::::::
(echo [vpn]
echo Encoding=1
echo Type=2
echo AutoLogon=0
echo UseRasCredentials=1
echo DialParamsUID=5229484
echo Guid=84913F208468B548A2D413E6E454270F
echo BaseProtocol=1
echo VpnStrategy=3
echo ExcludedProtocols=0
echo LcpExtensions=1
echo DataEncryption=8
echo SwCompression=1
echo NegotiateMultilinkAlways=0
echo echo SkipNwcWarning=0
echo SkipDownLevelDialog=0
echo SkipDoubleDialDialog=0
echo DialMode=1
echo DialPercent=75
echo DialSeconds=120
echo HangUpPercent=10
echo HangUpSeconds=120
echo OverridePref=15
echo RedialAttempts=3
echo RedialSeconds=60
echo IdleDisconnectSeconds=0
echo RedialOnLinkFailure=0
echo CallbackMode=0
echo CustomDialDll=
echo CustomDialFunc=
echo CustomRasDialDll=
echo AuthenticateServer=0
echo echo ShareMsFilePrint=1
echo BindMsNetClient=1
echo SharedPhoneNumbers=0
echo GlobalDeviceSettings=0
echo PrerequisiteEntry=
echo PrerequisitePbk=
echo PreferredPort=VPN2-0
echo PreferredDevice=WAN 微型端口 (L2TP^)


echo PreferredBps=0
echo PreferredHwFlow=1
echo PreferredProtocol=1
echo PreferredCompression=1
echo PreferredSpeaker=1
echo PreferredMdmProtocol=0
echo PreviewUserPw=1
echo PreviewDomain=0
echo PreviewPhoneNumber=0
echo ShowDialingProgress=1
echo ShowMonitorIconInTaskBar=1
echo CustomAuthKey=-1
echo AuthRestrictions=864
echo TypicalAuth=2
echo IpPrioritizeRemote=1
echo IpHeaderCompression=0
echo IpAddress=0.0.0.0
echo IpDnsAddress=0.0.0.0
echo IpDns2Address=0.0.0.0
echo IpWinsAddress=0.0.0.0
echo IpWins2Address=0.0.0.0
echo IpAssign=1
echo IpNameAssign=1
echo IpFrameSize=1006
echo IpDnsFlags=0
echo IpNBTFlags=1
echo TcpWindowSize=0
echo UseFlags=0
echo IpSecFlags=0
echo IpDnsSuffix=
echo.
echo NETCOMPONENTS=
echo ms_server=1
echo ms_msclient=1
echo ms_psched=1
echo.
echo MEDIA=rastapi
echo Port=VPN2-0
echo Device=WAN 微型端口 (L2TP^)
echo.
echo DEVICE=vpn
echo PhoneNumber=dxvpn.jmu.edu.cn
echo AreaCode=
echo CountryCode=1
echo CountryID=1
echo UseDialingRules=0
echo Comment=
echo LastSelectedPhone=0
echo PromoteAlternates=0
echo TryNextAlternateOnFail=1)>%temp%\vpn.pbk
copy /y %temp%\vpn.pbk "%allusersprofile%\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk" >nul
::::::::::::::::::::桌面快捷::::::::::::::::::::::::::::::::
(echo set ws=createobject("wscript.shell"^) 
echo ws.run "cmd /c ncpa.cpl",0 
echo wscript.sleep 1000 
echo ws.sendkeys "{f5}" 
echo wscript.sleep 1000 
echo ws.sendkeys "vpn" 
echo wscript.sleep 500 
echo ws.sendkeys "%%{f}" 
echo wscript.sleep 500 
echo ws.sendkeys "{s}" 
echo wscript.sleep 300 
echo ws.sendkeys "{y}" 
echo wscript.sleep 300 
echo ws.sendkeys "%%{f4}")>%temp%\vpn.vbs
start /wait %temp%\vpn.vbs
del /f /q %temp%\vpn.pbk %temp%\vpn.vbs >nul
echo.
echo 请重启以使之生效。&& ping 127.0.0.1 >nul



2、
以下是TVZML编写的自动创建VPN和自动拨号脚本,增加了是否创建过的检测,如果创建过了,直接跳转到拨号这步。 使用说明:以下脚本连续10次以上测试通过,实际使用发生失败,请适当调整延迟时间,WScript.Sleep 500改为WScript.Sleep 1000即延迟为1秒。 @echo off set VPN_LAN=0 findstr /c:"VPN_LAN" "C:\Documents and Settings\All Users\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk" 
[解决办法]
set VPN_LAN=1 @echo %VPN_LAN% echo set WshShell = CreateObject("WScript.Shell") >VPN_phone.VBS if %VPN_LAN%==0 goto VPN_ADD echo WshShell.Run "Rasphone -a" >>VPN_phone.VBS echo WScript.Sleep 500 >>VPN_phone.VBS echo WshShell.SendKeys "%%+T" >>VPN_phone.VBS echo WshShell.SendKeys "%%+N" >>VPN_phone.VBS echo WScript.Sleep 100 >>VPN_phone.VBS echo WshShell.SendKeys "vpn.server.ip.com" >>VPN_phone.VBS echo WScript.Sleep 100 >>VPN_phone.VBS echo WshShell.SendKeys "%%+N" >>VPN_phone.VBS echo WScript.Sleep 500 >>VPN_phone.VBS echo WshShell.SendKeys "VPN_LAN" >>VPN_phone.VBS echo WScript.Sleep 500 >>VPN_phone.VBS echo WshShell.SendKeys "{ENTER}" >>VPN_phone.VBS echo WScript.Sleep 50 >>VPN_phone.VBS echo WshShell.SendKeys "{ENTER}" >>VPN_phone.VBS :VPN_ADD echo WScript.Sleep 500 >>VPN_phone.VBS echo WshShell.Run "Rasphone -d VPN_LAN" >>VPN_phone.VBS echo WScript.Sleep 100 >>VPN_phone.VBS echo WshShell.AppActivate "连接 VPN_LAN" >>VPN_phone.VBS echo WScript.Sleep 100 >>VPN_phone.VBS echo WshShell.SendKeys "%%+u" >>VPN_phone.VBS echo WScript.Sleep 100 >>VPN_phone.VBS echo WshShell.SendKeys "USER" >>VPN_phone.VBS echo WScript.Sleep 100 >>VPN_phone.VBS echo WshShell.SendKeys "%%+p" >>VPN_phone.VBS echo WScript.Sleep 500 >>VPN_phone.VBS echo WshShell.SendKeys "password" >>VPN_phone.VBS echo WScript.Sleep 100 >>VPN_phone.VBS echo WshShell.SendKeys "%%+c" >>VPN_phone.VBS start VPN_phone.VBS 

热点排行
Bad Request.