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