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

📄 vpnmac.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 4 页
字号:

	status = NDIS_STATUS_SUCCESS;

	if (VpnAdapterGlobal == NULL)
	{
		DBG_LEAVE(status);
		return status;
	}

    if (adapter) {
		if (adapter->NdisBindingHandleToRealMac != NULL)
		{
			/*
			PPGPNDIS_PACKET pgpPacket;
			while ( (pgpPacket = PacketDequeue(adapter, &adapter->sent_plainpacket_list)) != NULL)
			{
				DBG_PRINT(("||||| Complete Send plain packet.\n"););
				NdisCompleteSend(pgpPacket->Binding->NdisBindingContextFromProtocol,
					pgpPacket->srcPacket, NDIS_STATUS_SUCCESS);
				PGPNdisPacketFreeWithBindingContext(adapter, pgpPacket);
			}
			*/

			NdisCloseAdapter (
					&status,
	 				adapter->NdisBindingHandleToRealMac
	 				);

	        adapter->open = FALSE;
			adapter->NdisBindingHandleToRealMac = NULL;
		}
    }

	if (status == NDIS_STATUS_PENDING)
		status = NDIS_STATUS_SUCCESS;

	DBG_LEAVE(status)

	return status;

}


VOID MacUnload(
	IN NDIS_HANDLE MacContext)
{
    DBG_FUNC("MacUnload")

    NDIS_STATUS status;

	DBG_ENTER();

	ASSERT(MacContext == PGPnetDriver.NdisMacHandle);
    if (PGPnetDriver.NdisMacHandle)
    {
        NdisDeregisterMac(&status, PGPnetDriver.NdisMacHandle);
        PGPnetDriver.NdisMacHandle = NULL;
        ASSERT(status == NDIS_STATUS_SUCCESS);
    }

	DBG_LEAVE(status);
}

NDIS_STATUS MacQueryGlobalStatistics(
    IN NDIS_HANDLE MacContext,
    IN PNDIS_REQUEST NdisRequest
    )
{
	DBG_FUNC("MacQueryGlobalStatistics")
	NDIS_STATUS	status;

    PVPN_ADAPTER adapter;
    UINT BytesWritten = 0;
    UINT BytesNeeded = 0;
    UINT BytesLeft = NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength;
    PUCHAR InfoBuffer = (PUCHAR)(NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer);
	UINT MoveBytes = sizeof(UINT) * 2 + sizeof(NDIS_OID);

	DBG_ENTER();


    status = NDIS_STATUS_SUCCESS;

	adapter = (PVPN_ADAPTER)MacContext;

#if DBG_MESSAGE
	DBG_PRINT(("MacQueryGlobalStatistics: %s\n", GetOidString(NdisRequest->DATA.QUERY_INFORMATION.Oid)););
#endif
    //
    // Make sure that int is 4 bytes.  Else GenericULong must change
    // to something of size 4.
    //
    ASSERT(sizeof(UINT) == 4);
	ASSERT(NdisRequest->RequestType == NdisRequestQueryStatistics);

#ifdef GENERIC_QUERY
    switch (NdisRequest->DATA.QUERY_INFORMATION.Oid) {
    case OID_GEN_SUPPORTED_LIST:

		status = NDIS_STATUS_NOT_SUPPORTED;

        break;
    case OID_GEN_MAC_OPTIONS:

		status = NDIS_STATUS_NOT_SUPPORTED;

        break;
	case OID_GEN_WIN32_IOCTL:
		status = ConfigurationIoctl(adapter,
                    NdisRequest->DATA.QUERY_INFORMATION.Oid,
                    NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
                    NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
                    &(NdisRequest->DATA.QUERY_INFORMATION.BytesWritten),
                    &(NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded)
                    );


		break;
	default:
		status = NDIS_STATUS_NOT_SUPPORTED;

	}
    NdisRequest->DATA.QUERY_INFORMATION.BytesWritten = BytesWritten;
    NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded = BytesNeeded;

#else
	status = ConfigurationIoctl(adapter,
                    NdisRequest->DATA.QUERY_INFORMATION.Oid,
                    NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
                    NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
                    &(NdisRequest->DATA.QUERY_INFORMATION.BytesWritten),
                    &(NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded)
                    );
  
#endif

	DBG_LEAVE(status);

	return status;
}

VOID MacRemoveAdapter(
    IN NDIS_HANDLE MacContext
    )
{
	DBG_FUNC("MacRemoveAdapter")
	NDIS_STATUS		status;
	PVPN_ADAPTER	adapter;

	DBG_ENTER()

	adapter = (PVPN_ADAPTER)MacContext;

	/*
	if (adapter->open)
	{
		PPGPNDIS_PACKET	pgpPacket;
		while ( (pgpPacket = PacketDequeue(adapter, &adapter->sent_plainpacket_list)) != NULL)
		{
			DBG_PRINT(("||||| Complete Send plain packet.\n"););
			NdisCompleteSend(pgpPacket->Binding->NdisBindingContextFromProtocol,
				pgpPacket->srcPacket, NDIS_STATUS_SUCCESS);
			PGPNdisPacketFreeWithBindingContext(adapter, pgpPacket);
		}
	}
	*/

    if (adapter->SharedMemorySize)
    {
        NdisFreeSharedMemory(adapter->NdisAdapterRegistrationHandle,
                                 adapter->SharedMemorySize,
                                 FALSE,
                                 adapter->SharedMemoryPtr,
                                 adapter->SharedMemoryPhysicalAddress
                                 );
		adapter->SharedMemoryPtr = NULL;
    }

	status = NdisDeregisterAdapter (adapter->NdisAdapterRegistrationHandle);

    if (adapter->buffer_pool)
        NdisFreeBufferPool(adapter->buffer_pool);
    if (adapter->packet_pool)
        NdisFreePacketPool(adapter->packet_pool);
	{
		BOOLEAN success;
		NdisCancelTimer(&adapter->collection_timer, &success);
#ifdef CHICAGO
		NdisCancelTimer(&adapter->event_timer, &success);
#endif
		NdisCancelTimer(&adapter->request_timer, &success);
	}

	FreeVpnAdapter(adapter);

	DBG_LEAVE(status);

	return;
}

NDIS_STATUS MacReset(
    IN NDIS_HANDLE Context
    )
{
	DBG_FUNC("MacReset")
	NDIS_STATUS status;
	PBINDING_CONTEXT binding;
    PVPN_ADAPTER adapter;

	DBG_ENTER();

	binding = (PBINDING_CONTEXT) Context;

	adapter = binding->adapter;

	adapter = (PVPN_ADAPTER)Context;

    NdisAcquireSpinLock(&adapter->general_lock);

    if (adapter->ResetBinding != NULL)
    {
        status = NDIS_STATUS_RESET_IN_PROGRESS;
    }
	else
	{
		UINT i;
		PBINDING_CONTEXT	eachBinding;

		adapter->ResetBinding = binding;

		eachBinding = (PBINDING_CONTEXT)adapter->Bindings.Flink;
		for (i = 0; i < adapter->BindingNumber; i++)
		{
			ASSERT(eachBinding);

			NdisIndicateStatus(eachBinding->NdisBindingContextFromProtocol,
                                   NDIS_STATUS_RESET_START,
                                   NULL,
                                   0
								   );

			eachBinding = (PBINDING_CONTEXT)eachBinding->Next.Flink;

		}

		NdisReset(&status, adapter->NdisBindingHandleToRealMac);

		if (status != NDIS_STATUS_PENDING)
		{
			eachBinding = (PBINDING_CONTEXT)adapter->Bindings.Flink;
			for (i = 0; i < adapter->BindingNumber; i++)
			{
				ASSERT(eachBinding);

				if (eachBinding != binding)
				{
					NdisIndicateStatus(eachBinding->NdisBindingContextFromProtocol,
										   NDIS_STATUS_RESET_END,
										   NULL,
										   0
										  );

				}
				eachBinding = (PBINDING_CONTEXT)eachBinding->Next.Flink;
			}
			adapter->ResetBinding = NULL;
		}
	}

	NdisReleaseSpinLock(&adapter->general_lock);

	DBG_LEAVE(status);
	return status;
}

NDIS_STATUS PgpMacQueryInformation(
    IN PBINDING_CONTEXT binding,
    IN PNDIS_REQUEST Request,
    IN NDIS_OID Oid,         
    IN PVOID InformationBuffer,
    IN ULONG BufferLength,     
    OUT PULONG BytesWritten,   
    OUT PULONG BytesNeeded)    
{

	DBG_FUNC("PgpMacQueryInformation")

    NDIS_STATUS status = NDIS_STATUS_SUCCESS;
	PVPN_ADAPTER adapter = binding->adapter;
	PPGPNDIS_REQUEST pgpRequest;

	DBG_ENTER();


    switch (Oid) {
	case OID_GEN_VENDOR_DESCRIPTION:
		if (!adapter->DescriptionQueried)
		{
			adapter->DescriptionQueried = TRUE;
			*BytesNeeded = 128;
			status = NDIS_STATUS_INVALID_LENGTH;
			break;
		}

    case OID_GEN_MAXIMUM_FRAME_SIZE:
    case OID_GEN_TRANSMIT_BUFFER_SPACE:
    case OID_GEN_RECEIVE_BUFFER_SPACE:
    case OID_GEN_TRANSMIT_BLOCK_SIZE:
    case OID_GEN_RECEIVE_BLOCK_SIZE:
	/*
        if (BufferLength < sizeof(UINT)) {
            *BytesNeeded = sizeof(UINT);
            status = NDIS_STATUS_INVALID_LENGTH;
        } else {
			UINT frame_size = MAX_ETHER_FRAME_SIZE - ETHER_HEADER_SIZE - MAX_IPSEC_PACKETSIZE_INCREASE;
            NdisMoveMemory(InformationBuffer,
                &frame_size, sizeof(frame_size));
            *BytesWritten = sizeof(frame_size);
        }
        break;
	*/

    default:
		{
			pgpRequest = PGPNdisRequestAlloc(&status, adapter);

			if (status != NDIS_STATUS_SUCCESS)
				return status;

			pgpRequest->NdisRequest = Request;
			pgpRequest->Binding = binding;

#ifdef MEMPHIS
			RequestEnqueue(adapter, &adapter->send_request_list, pgpRequest);

			NdisRequest (
				&status,
				adapter->NdisBindingHandleToRealMac,
				Request
				);

			if (status != NDIS_STATUS_PENDING)
			{
				pgpRequest = RequestRemoveByNdisRequest(adapter, &adapter->send_request_list, Request);
				PGPNdisRequestFree(adapter, pgpRequest);

			}
			else
			{
				status = NDIS_STATUS_SUCCESS;
			}
#else
			RequestEnqueue(adapter, &adapter->wait_request_list, pgpRequest);
			status = NDIS_STATUS_PENDING;
			NdisSetTimer(&adapter->request_timer, 1000);
#endif


			break;
		}
    }

    DBG_LEAVE(status);

    return status;
}

NDIS_STATUS PgpMacSetInformation(
    IN PBINDING_CONTEXT binding,
    PNDIS_REQUEST Request,
    IN NDIS_OID Oid,      
    IN PVOID InformationBuffer)

{
    NDIS_STATUS status;
	PPGPNDIS_REQUEST pgpRequest;

	PVPN_ADAPTER adapter = binding->adapter;

	pgpRequest = PGPNdisRequestAlloc(&status, adapter);

	if (status != NDIS_STATUS_SUCCESS)
		return status;

	pgpRequest->NdisRequest = Request;
	pgpRequest->Binding = binding;

#ifdef MEMPHIS
	RequestEnqueue(adapter, &adapter->send_request_list, pgpRequest);

	NdisRequest (
			&status,
			adapter->NdisBindingHandleToRealMac,
			Request
			);

	if (status != NDIS_STATUS_PENDING)
	{
		pgpRequest = RequestRemoveByNdisRequest(adapter, &adapter->send_request_list, Request);
		PGPNdisRequestFree(adapter, pgpRequest);

	}
	else
	{
		status = NDIS_STATUS_SUCCESS;
	}
#else
	RequestEnqueue(adapter, &adapter->wait_request_list, pgpRequest);
	status = NDIS_STATUS_PENDING;
	NdisSetTimer(&adapter->request_timer, 1000);
#endif


    return status;
}


NDIS_STATUS MacRequest(
    IN NDIS_HANDLE Context,
    IN PNDIS_REQUEST NdisRequest
    )
{
	DBG_FUNC("MacRequest")

⌨️ 快捷键说明

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