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

📄 cpgpnetdriver.cpp

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 CPP
字号:
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.

	$Id: CPGPnetDriver.cpp,v 1.3 2002/08/06 20:10:26 dallen Exp $
____________________________________________________________________________*/

#include "pgpnetBase.h"
#include "pgpnetPacket.h"

#include "pgpnetPacketHelper.h"

#include "CPGPnetDriver.h"

#include "pgpnetDebug.h"

CPGPnetDriver::CPGPnetDriver()
{
	NdisAllocateSpinLock(&general_lock);
	NdisAllocateSpinLock(&doTransform_lock);
}

CPGPnetDriver::~CPGPnetDriver()
{
	NdisFreeSpinLock(&general_lock);
	NdisFreeSpinLock(&doTransform_lock);
}

NDIS_STATUS CPGPnetDriver::AllocatePacketPool()
{
	NDIS_STATUS status;

	int i;
	UINT block_size;
	NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);

	DBG_FUNC("AllocateDriverPacketPool")
	
	DBG_ENTER();

	do 
	{
		NdisAllocatePacketPool(&status, &PGPnetDriver->packet_pool, SHARED_PACKET_POOL_SIZE,
			PROTOCOL_RESERVED_LENGTH);
		if (status != NDIS_STATUS_SUCCESS)
			break;
		NdisAllocateBufferPool(&status, &PGPnetDriver->buffer_pool, SHARED_BUFFER_POOL_SIZE);
		if (status != NDIS_STATUS_SUCCESS)
			break;

		PGPnetDriver->free_packet_list	= (PGPnetPacket*)NULL;
		PGPnetDriver->free_packet_head_list = (PPGPnetPacketHead)NULL;

		block_size = BLOCK_SIZE;					// FIX

		for (i = 0; i < PACKET_PENDING_MAXIMUM; i++) {
			PGPnetPacket* packet;
			status = NdisAllocateMemory((void**)&packet, sizeof(PGPnetPacket), 0, HighestAcceptableAddress);
			if (status != NDIS_STATUS_SUCCESS)
				break;
			NdisZeroMemory(packet, sizeof(PGPnetPacket));

			status = NdisAllocateMemory((void**)&packet->srcBlock, block_size, 0, HighestAcceptableAddress);
			if (status != NDIS_STATUS_SUCCESS)
				break;

			status = NdisAllocateMemory((void**)&packet->xformBlock, block_size, 0, HighestAcceptableAddress);
			if (status != NDIS_STATUS_SUCCESS)
				break;
			
			NdisAllocatePacket(&status, &packet->xformPacket, PGPnetDriver->packet_pool);
			if (status != NDIS_STATUS_SUCCESS)
				break;

			NdisAllocateBuffer(&status, &packet->xformBuffer, PGPnetDriver->buffer_pool,
						packet->xformBlock, block_size);
			if (status != NDIS_STATUS_SUCCESS)
				break;

			NdisChainBufferAtFront(packet->xformPacket, packet->xformBuffer);

			PacketEnqueue(&PGPnetDriver->free_packet_list, packet);
		}

		for (i = 0; i < PACKET_HEAD_PENDING_MAXIMUM; i++) {
			PPGPnetPacketHead packetHead;
			status = NdisAllocateMemory((void**)&packetHead, sizeof(PGPnetPacketHead), 0, HighestAcceptableAddress);
			if (status != NDIS_STATUS_SUCCESS)
				break;
			
			NdisZeroMemory(packetHead, sizeof(PGPnetPacketHead));
			PacketHeadEnqueue(&PGPnetDriver->free_packet_head_list, packetHead);
		}

	} while (0);

	DBG_LEAVE(status);

	return status;
}

VOID CPGPnetDriver::FreePacketPool()
{
	PPGPnetPacketHead		head;
	PGPnetPacket*			packet;

	while ((head = PacketHeadDequeue(&PGPnetDriver->free_packet_head_list)) != NULL)
	{
		NdisFreeMemory(head, sizeof(PGPnetPacketHead), 0);
	}
	while ((packet = PacketDequeue(&PGPnetDriver->free_packet_list)) != NULL)
	{
		NdisFreeMemory(packet->srcBlock, BLOCK_SIZE, 0);
		NdisFreeMemory(packet->xformBlock, BLOCK_SIZE, 0);
		NdisFreeMemory(packet, sizeof(PGPnetPacket), 0);
	}

	PGPnetDriver->free_packet_list	= (PGPnetPacket*)NULL;
	PGPnetDriver->free_packet_head_list = (PPGPnetPacketHead)NULL;
}

⌨️ 快捷键说明

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