www.pudn.com > PPPOE.rar > main.cpp


 
//******************************************************************** 
//	ÈÕÆÚ:	2004/08/24 - 24:8:2004   23:15 
//	Ãûǰ:	tiamo 
//	ÃèÊö:	main 
//********************************************************************* 
 
#include "Stdafx.h" 
 
// wrapper handle 
NDIS_HANDLE g_hNdisWrapperHandle; 
 
// protocol handle 
NDIS_HANDLE g_hNdisProtocolHandle; 
 
#pragma alloc_text(PAGE,DriverUnload) 
// we want to keep driverentry code 
#pragma alloc_text(PAGE,DriverEntry) 
 
// driver unload 
VOID DriverUnload(PDRIVER_OBJECT pDriverObject) 
{ 
	PAGED_CODE(); 
 
	// shut down xxx 
	ShutdownBindSystem(); 
 
	ShutdownTimerSystem(); 
 
	ShutdownWorkItemSystem(); 
 
	ShutdownPoolSystem(); 
 
	ShutdownMemorySystem(); 
 
	NDIS_STATUS status; 
 
	if(g_hNdisProtocolHandle) 
		NdisDeregisterProtocol(&status,g_hNdisProtocolHandle); 
} 
 
// driver entry 
NDIS_STATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegPath) 
{ 
	PAGED_CODE(); 
 
	DebugInfo(("driver object = 0x%x,reg path = %Z\n",pDriverObject,pRegPath)); 
 
	NDIS_STATUS status = NDIS_STATUS_SUCCESS; 
 
	__try 
	{ 
		// init xxx system 
		InitializeMemorySystem(); 
 
		InitializePoolSystem(); 
 
		InitializeWorkItemSystem(); 
 
		InitializeTimerSystem(); 
 
		InitializeBindSystem(); 
 
		// init wapper 
		NdisMInitializeWrapper(&g_hNdisWrapperHandle,pDriverObject,pRegPath,NULL); 
 
		// register miniport  
		NDIS_MINIPORT_CHARACTERISTICS miniChar; 
		NdisZeroMemory(&miniChar,sizeof(miniChar)); 
 
		miniChar.Ndis40Chars.Ndis30Chars.MajorNdisVersion = NDIS_MAJOR_VERSION; 
		miniChar.Ndis40Chars.Ndis30Chars.MinorNdisVersion = NDIS_MINOR_VERSION; 
 
		miniChar.Ndis40Chars.Ndis30Chars.HaltHandler = (W_HALT_HANDLER)miniportHalt; 
		miniChar.Ndis40Chars.Ndis30Chars.InitializeHandler = (W_INITIALIZE_HANDLER)miniportInitialize; 
		miniChar.Ndis40Chars.Ndis30Chars.ResetHandler = (W_RESET_HANDLER)miniportReset; 
		miniChar.Ndis40Chars.ReturnPacketHandler = (W_RETURN_PACKET_HANDLER)miniportReturnPacket; 
		miniChar.CoActivateVcHandler = (W_CO_ACTIVATE_VC_HANDLER)miniportCoActivateVc; 
		miniChar.CoDeactivateVcHandler = (W_CO_DEACTIVATE_VC_HANDLER)miniportCoDeactivateVc; 
		miniChar.CoRequestHandler = (W_CO_REQUEST_HANDLER)miniportCoRequest; 
		miniChar.CoSendPacketsHandler = (W_CO_SEND_PACKETS_HANDLER)miniportCoSendPackets; 
 
		status = NdisMRegisterMiniport(g_hNdisWrapperHandle,&miniChar,sizeof(miniChar)); 
		if(status != NDIS_STATUS_SUCCESS) 
		{ 
			DebugError(("register miniport error 0x%x\n",status)); 
			ExRaiseStatus(status); 
		} 
 
		// register protocol 
		NDIS_PROTOCOL_CHARACTERISTICS protoChar; 
		NdisZeroMemory(&protoChar,sizeof(protoChar)); 
 
		protoChar.Ndis40Chars.Ndis30Chars.MajorNdisVersion = NDIS_MAJOR_VERSION; 
		protoChar.Ndis40Chars.Ndis30Chars.MinorNdisVersion = NDIS_MINOR_VERSION; 
 
		NdisInitUnicodeString(&protoChar.Ndis40Chars.Ndis30Chars.Name,PROTOCOL_NAME); 
 
		protoChar.Ndis40Chars.Ndis30Chars.CloseAdapterCompleteHandler = (CLOSE_ADAPTER_COMPLETE_HANDLER)protocolCloseAdapterComplete; 
		protoChar.Ndis40Chars.Ndis30Chars.OpenAdapterCompleteHandler = (OPEN_ADAPTER_COMPLETE_HANDLER)protocolOpenAdapterComplete; 
		protoChar.Ndis40Chars.Ndis30Chars.SendCompleteHandler = (SEND_COMPLETE_HANDLER)protocolSendComplete; 
		protoChar.Ndis40Chars.Ndis30Chars.TransferDataCompleteHandler = (TRANSFER_DATA_COMPLETE_HANDLER)protocolTransferDataComplete; 
		 
		protoChar.Ndis40Chars.Ndis30Chars.RequestCompleteHandler = (REQUEST_COMPLETE_HANDLER)protocolRequestComplete; 
		protoChar.Ndis40Chars.Ndis30Chars.ReceiveCompleteHandler = (RECEIVE_COMPLETE_HANDLER)protocolReceiveComplete; 
		protoChar.Ndis40Chars.Ndis30Chars.StatusCompleteHandler = (STATUS_COMPLETE_HANDLER)protocolStatusComplete; 
 
		protoChar.Ndis40Chars.Ndis30Chars.StatusHandler = (STATUS_HANDLER)protocolStatus; 
		protoChar.Ndis40Chars.Ndis30Chars.ReceiveHandler = (RECEIVE_HANDLER)protocolReceive; 
 
		protoChar.Ndis40Chars.BindAdapterHandler = (BIND_HANDLER)protocolBindAdapter; 
		protoChar.Ndis40Chars.UnbindAdapterHandler = (UNBIND_HANDLER)protocolUnbindAdapter; 
 
		protoChar.Ndis40Chars.ReceivePacketHandler = (RECEIVE_PACKET_HANDLER)protocolReceivePacket; 
		protoChar.Ndis40Chars.PnPEventHandler = (PNP_EVENT_HANDLER)protocolPnPEvent; 
 
		NdisRegisterProtocol(&status,&g_hNdisProtocolHandle,&protoChar,sizeof(protoChar)); 
		if(status != NDIS_STATUS_SUCCESS) 
		{ 
			DebugError(("register protocol error 0x%x\n",status)); 
			ExRaiseStatus(status); 
		} 
 
		// register unload handle 
		NdisMRegisterUnloadHandler(g_hNdisWrapperHandle,DriverUnload); 
	} 
	__except(EXCEPTION_EXECUTE_HANDLER) 
	{ 
		DriverUnload(pDriverObject); 
	} 
 
	return status; 
}