有没有相关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();
}
#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;
}
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