www.pudn.com > IPsec_Src_Instal.rar > IPSec.c


/*++ 
 
	Copyright (c) 1992-2000  Microsoft Corporation 
 
--*/ 
 
#include "precomp.h" 
#include "PktHdr.h" 
 
// 
//	NDIS_INIT_FUNCTION is a macro used to mark a driver function to be  
//	run once only during initialization. 
// 
#pragma NDIS_INIT_FUNCTION(DriverEntry) 
 
 
NDIS_HANDLE		DriverHandle; 
NDIS_HANDLE		ProtocolHandle; 
NDIS_HANDLE		NdisWrapperHandle; 
 
NDIS_SPIN_LOCK  GlobalLock; 
 
NDIS_MEDIUM		Medium[2]  =  { NdisMedium802_3, NdisMediumWan  }; 
                                  
PADAPT			pAdaptList  =  NULL; 
 
 
//  
//	An Intermediate Driver's initial required entry point must be  
//	explicitly named "DriverEntry". 
// 
NTSTATUS	DriverEntry( 
						IN PDRIVER_OBJECT        DriverObject, 
						IN PUNICODE_STRING       RegistryPath 
                       ) 
{ 
	 
	NDIS_STRING						Name; 
 
	NDIS_MINIPORT_CHARACTERISTICS	MChars;	 
 
	NDIS_PROTOCOL_CHARACTERISTICS	PChars; 
 
	NDIS_STATUS						Status	=	NDIS_STATUS_SUCCESS; 
 
	// 
	//	Initializes a variable of type NDIS_SPIN_LOCK, used to  
	//	synchronize access to shared resources. 
	// 
	NdisAllocateSpinLock(&GlobalLock); 
 
	// 
	//	Notifies to NDIS that a Miniport is Initializing 
	// 
	NdisMInitializeWrapper(  &NdisWrapperHandle,  
							 DriverObject, 
							 RegistryPath,  
							 NULL 
						  ); 
 
	do 
	{ 
		//	 
		//	NdisZeroMemory fills a block of memory with Zeros 
		//	MChars should be initialized to Zero	 
		// 
		NdisZeroMemory(  &MChars,  
			             sizeof(NDIS_MINIPORT_CHARACTERISTICS) 
					  ); 
 
		MChars.MajorNdisVersion			=	4; 
		MChars.MinorNdisVersion			=	0; 
 
 
        MChars.InitializeHandler		=	MPInitialize; 
        MChars.QueryInformationHandler	=	MPQueryInformation; 
        MChars.SetInformationHandler	=	MPSetInformation; 
        MChars.ResetHandler				=	NULL; 
        MChars.TransferDataHandler		=	MPTransferData; 
        MChars.HaltHandler				=	MPHalt; 
        MChars.CheckForHangHandler		=	NULL; 
        MChars.ReturnPacketHandler		=	MPReturnPacket; 
        MChars.SendHandler				=	NULL; 
        MChars.SendPacketsHandler		=	MPSendPackets; 
 
 
		// 
		//	Registers an intermediate Driver's MiniportXxx entry points  
		//	"DriverHandle" saved globally 
		// 
		Status = NdisIMRegisterLayeredMiniport(	NdisWrapperHandle,  
												&MChars, 
												sizeof(MChars), 
												&DriverHandle 
											  ); 
 
		if (Status != NDIS_STATUS_SUCCESS)	 
		{ 
			break; 
		} 
		 
		// 
		//	PChars should be initialized to Zero 
		// 
		NdisZeroMemory(  &PChars, 
						 sizeof(NDIS_PROTOCOL_CHARACTERISTICS) 
					  ); 
 
		NdisMRegisterUnloadHandler(  NdisWrapperHandle, 
									 PPUnload 
								  ); 
 
		PChars.MajorNdisVersion			=	4; 
		PChars.MinorNdisVersion			=	0; 
	 
		// 
		//	The string in this buffer must match that specified in the  
		//	registery (under Services while creating Ndi key)  
		//	when the protocol was installed. 
		// 
		NdisInitUnicodeString(&Name, L"IPSecVPN"); 
		 
		PChars.Name							=	Name; 
 
		PChars.OpenAdapterCompleteHandler	=	PPOpenAdapterComplete; 
		PChars.CloseAdapterCompleteHandler	=	PPCloseAdapterComplete; 
		PChars.SendCompleteHandler			=	PPSendComplete; 
		PChars.TransferDataCompleteHandler	=	PPTransferDataComplete; 
		PChars.ResetCompleteHandler			=	PPResetComplete; 
 
		PChars.RequestCompleteHandler		=	PPRequestComplete; 
		PChars.ReceiveHandler				=	PPReceive; 
		PChars.ReceiveCompleteHandler		=	PPReceiveComplete; 
		 
		PChars.StatusHandler				=	PPStatus; 
		PChars.StatusCompleteHandler		=	PPStatusComplete; 
 		PChars.ReceivePacketHandler			=	PPReceivePacket; 
		 
		PChars.BindAdapterHandler			=	PPBindAdapter; 
		PChars.UnbindAdapterHandler			=	PPUnbindAdapter; 
		PChars.PnPEventHandler				=	PPPnpEvent; 
		PChars.UnloadHandler				=	NULL; 
 
		// 
		//	Registers ProtocolXxx Portion of the Miniport 
		//	ProtocolHandle Saved Globally 
		// 
		NdisRegisterProtocol(  &Status,  
							   &ProtocolHandle, 
							   &PChars,  
							   sizeof(NDIS_PROTOCOL_CHARACTERISTICS) 
							); 
 
        if (Status != NDIS_STATUS_SUCCESS) 
        { 
	 
			NdisIMDeregisterLayeredMiniport(DriverHandle); 
             
			break; 
         
		} 
 
		// 
		//	Informs that the MiniportXxx and ProtocolXxx functions  
		//	belongs to the same driver 
		// 
		NdisIMAssociateMiniport(  DriverHandle,  
			                      ProtocolHandle 
							); 
 
	}while (FALSE); 
 
	if (Status != NDIS_STATUS_SUCCESS) 
    { 
 
        NdisTerminateWrapper(NdisWrapperHandle, NULL); 
     
	} 
 
	return Status; 
}