⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 pppoe client
💻 CPP
字号:

//********************************************************************
//	日期:	2004/08/10 - 10:8:2004   19:48
//	名前:	tiamo
//	描述:	main
//*********************************************************************

#include "stdafx.h"

#pragma NDIS_INIT_FUNCTION(DriverEntry)

// wrapper handle pointed to _NDIS_WRAPPER_HANDLE
NDIS_HANDLE g_hNdisWrapperHandle;

// miniport driver handle pointed to _NDIS_M_DRIVER_BLOCK
// NDIS_HANDLE g_hMiniDriverHandle;

// protocol handle pointed to _NDIS_PROTOCOL_BLOCK
NDIS_HANDLE g_hProtocolHandle;

// bind list
LIST_ENTRY g_ltBinds;

// bind lock
NDIS_SPIN_LOCK g_lockBind;

// work item look aside list
NPAGED_LOOKASIDE_LIST g_lookasideWorkItem;

// driver entry
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver,PUNICODE_STRING pRegPath)
{
	DbgEnterFunction();

	drvDbgPrint("driver object is 0x%x\n",pDriver);

	NDIS_STATUS status;
	
	__try
	{
		status = InitializePool();

		if(status != NDIS_STATUS_SUCCESS)
		{
			drvDbgPrint("can't init pool,raise status 0x%x.\n",status);
			ExRaiseStatus(status);
		}

		// initialzie work item look aside list
		NdisInitializeNPagedLookasideList(&g_lookasideWorkItem,0,0,0,sizeof(PPPOE_WORK_ITEM),'WKIT',0);

		// bind list stuff initialize
		NdisAllocateSpinLock(&g_lockBind);

		NdisInitializeListHead(&g_ltBinds);

		// initialize timer
		NdisInitializeListHead(&g_timer.m_ltTimerItem);

		g_timer.m_ulSig = 'TIME';
		NdisAllocateSpinLock(&g_timer.m_lockSelf);

		NdisInitializeTimer(&g_timer.m_ndisTimer,GlobalTimerEvent,&g_timer);

		// initialize wrapper
		NdisMInitializeWrapper(&g_hNdisWrapperHandle,pDriver,pRegPath,NULL);

		NDIS_MINIPORT_CHARACTERISTICS miniportCharacteristics;

		RtlZeroMemory(&miniportCharacteristics,sizeof(miniportCharacteristics));

		// i think i should use c...no c++
		miniportCharacteristics.Ndis30Chars.MajorNdisVersion = 4;
		miniportCharacteristics.Ndis30Chars.MinorNdisVersion = 0;

		// wan wrapper
		miniportCharacteristics.Ndis30Chars.Reserved = NDIS_USE_WAN_WRAPPER;

		miniportCharacteristics.Ndis30Chars.InitializeHandler = (W_INITIALIZE_HANDLER)miniportInitialize;

		miniportCharacteristics.Ndis30Chars.QueryInformationHandler = (W_QUERY_INFORMATION_HANDLER)miniportQueryInformation;
		miniportCharacteristics.Ndis30Chars.SetInformationHandler = (W_SET_INFORMATION_HANDLER)miniportSetInformation;

		miniportCharacteristics.Ndis30Chars.HaltHandler = (W_HALT_HANDLER)miniportHalt;

		miniportCharacteristics.Ndis30Chars.ResetHandler = (W_RESET_HANDLER)miniportReset;

		miniportCharacteristics.Ndis30Chars.WanSendHandler = (WM_SEND_HANDLER)miniportWanSendPacketHandler;
		
		// register miniport
		status = NdisMRegisterMiniport(g_hNdisWrapperHandle,&miniportCharacteristics,sizeof(miniportCharacteristics));

		if(status != NDIS_STATUS_SUCCESS)
		{
			drvDbgPrint("can't register miniport,raise status 0x%x.\n",status);
			ExRaiseStatus(status);
		}

		// register protocol
		NDIS_PROTOCOL_CHARACTERISTICS protocolCharacteristics;

		NdisZeroMemory(&protocolCharacteristics,sizeof(protocolCharacteristics));

		protocolCharacteristics.Ndis30Chars.MajorNdisVersion = 4;
		protocolCharacteristics.Ndis30Chars.MinorNdisVersion = 0;

		NdisInitUnicodeString(&protocolCharacteristics.Ndis30Chars.Name,PROTOCOL_NAME);

		protocolCharacteristics.Ndis30Chars.OpenAdapterCompleteHandler = (OPEN_ADAPTER_COMPLETE_HANDLER)protocolOpenAdapterComplete;
		protocolCharacteristics.Ndis30Chars.CloseAdapterCompleteHandler = (CLOSE_ADAPTER_COMPLETE_HANDLER)protocolCloseAdapterComplete;
		protocolCharacteristics.Ndis30Chars.SendCompleteHandler = (SEND_COMPLETE_HANDLER)protocolSendComplete;
		protocolCharacteristics.Ndis30Chars.TransferDataCompleteHandler = (TRANSFER_DATA_COMPLETE_HANDLER)protocolTransferDataComplete;

		//protocolCharacteristics.Ndis40Chars.Ndis30Chars.ResetCompleteHandler = (RESET_COMPLETE_HANDLER)protocolResetComplete;
		protocolCharacteristics.Ndis30Chars.RequestCompleteHandler = (REQUEST_COMPLETE_HANDLER)protocolRequestComplete;
		protocolCharacteristics.Ndis30Chars.ReceiveCompleteHandler = (RECEIVE_COMPLETE_HANDLER)protocolReceiveComplete;
		protocolCharacteristics.Ndis30Chars.StatusCompleteHandler = (STATUS_COMPLETE_HANDLER)protocolStatusComplete;

		protocolCharacteristics.Ndis30Chars.StatusHandler = (STATUS_HANDLER)protocolStatus;
		protocolCharacteristics.Ndis30Chars.ReceiveHandler = (RECEIVE_HANDLER)protocolReceive;

		protocolCharacteristics.BindAdapterHandler = (BIND_HANDLER)protocolBindAdapter;
		protocolCharacteristics.UnbindAdapterHandler = (UNBIND_HANDLER)protocolUnbindAdapter;

		protocolCharacteristics.UnloadHandler = (UNLOAD_PROTOCOL_HANDLER)protocolUnload;
		protocolCharacteristics.ReceivePacketHandler = (RECEIVE_PACKET_HANDLER)protocolReceivePacket;
		protocolCharacteristics.PnPEventHandler = (PNP_EVENT_HANDLER)protocolPnPEvent;

		NdisRegisterProtocol(&status,&g_hProtocolHandle,&protocolCharacteristics,sizeof(protocolCharacteristics));

		if(status != NDIS_STATUS_SUCCESS)
		{
			drvDbgPrint("can't register protocol,raise status 0x%x.\n",status);
			ExRaiseStatus(status);
		}

		// NdisIMAssociateMiniport(g_hMiniDriverHandle,g_hProtocolHandle);

		// register unload handle
		NdisMRegisterUnloadHandler(g_hNdisWrapperHandle,DriverUnload);
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		//if(g_hMiniDriverHandle)
		//	NdisIMDeregisterLayeredMiniport(g_hMiniDriverHandle);

		DriverUnload(pDriver);

		NdisTerminateWrapper(g_hNdisWrapperHandle,NULL);
	}

	DbgLeaveFunctionWithStatus(status);
	return status;
}

// driver unload
VOID DriverUnload(PDRIVER_OBJECT pDriver)
{
	DbgEnterFunction();

	NDIS_STATUS status;

	if(g_hProtocolHandle)
	{
		drvDbgPrint("deregister protocol\n");
		NdisDeregisterProtocol(&status,g_hProtocolHandle);
	}
	
	NdisDeleteNPagedLookasideList(&g_lookasideWorkItem);

	DestroyPool();
	
	DbgLeaveFunction();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -