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

📄 vpnproto.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	DBG_ENTER();

	adapter = (PVPN_ADAPTER)ProtocolBindingContext;

	if ( (pgpPacket = PacketRemoveBySrcPacket(adapter, &adapter->sent_plainpacket_list, Packet)) != NULL )
	{
		NdisCompleteSend(pgpPacket->Binding->NdisBindingContextFromProtocol, Packet, Status);
		PGPNdisPacketFreeWithBindingContext(adapter, pgpPacket);
	}
	else if ((pgpPacket = PacketRemoveByXformPacket(adapter, &adapter->sent_ipsecpacket_list, Packet)) != NULL)
	{
		if ( pgpPacket->fragmentNumber == 2)
		{
			NdisCompleteSend(pgpPacket->Binding->NdisBindingContextFromProtocol,
				pgpPacket->originalPacket,
				Status);
		}
		else if (pgpPacket->fragmentNumber == 1)
		{
			DBG_PRINT(("ProtocolSendComplete. fragment1 sent.\n"););
		}
		else
		{
			NdisCompleteSend(pgpPacket->Binding->NdisBindingContextFromProtocol,
				pgpPacket->srcPacket,
				Status);
		}
		PGPNdisPacketFree(adapter, pgpPacket);

	}
	else if ((pgpPacket = PacketRemoveByXformPacket(adapter, &adapter->outgoing_multiple_ipsecpacket_list, Packet)) != NULL )
	{
		if (pgpPacket->lastSrcBlock == TRUE)
			NdisCompleteSend(pgpPacket->Binding->NdisBindingContextFromProtocol, pgpPacket->srcPacket, Status);

		PGPNdisPacketFree(adapter, pgpPacket);
	}
	else
	{
		//ASSERT(FALSE);
		//NdisCompleteSend(adapter->NdisBindingContextFromProtocol, pgpPacket->srcPacket, Status);
		//PGPNdisPacketFree(adapter, pgpPacket);
		DBG_PRINT(("Packet Completed while adapter shutdown or Memory Leak!\n"););
	}

	DBG_LEAVE(0);
}

VOID ProtocolStatus(
    IN NDIS_HANDLE		ProtocolBindingContext,
    IN NDIS_STATUS      Status,
    IN PVOID            StatusBuffer,
    IN UINT             StatusBufferSize
    )
{
	DBG_FUNC("ProtocolStatus")
	PBINDING_CONTEXT eachBinding;
	UINT			 i;
	PVPN_ADAPTER adapter;

	DBG_ENTER();

	adapter = (PVPN_ADAPTER)ProtocolBindingContext;

    DBG_PRINT(("!!!!! ProtocolStatus Status=%Xh\n",
                   Status););

	if (Status == NDIS_STATUS_WAN_LINE_DOWN)
	{
		adapter->WanIPAddressDetected = FALSE;
		PGPnetRASdisconnect(adapter);
	}

	if (Status == NDIS_STATUS_WAN_LINE_UP)
	{
		//ULONG ipAddress = (ULONG)((PNDIS_WAN_LINE_UP)StatusBuffer)->LocalAddress;
		//PGPnetRASconnect(adapter, ipAddress);
		adapter->WanIPAddressDetected = FALSE;
	}

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

        ASSERT(eachBinding->NdisBindingContextFromProtocol);
            
        NdisReleaseSpinLock(&adapter->general_lock);

        NdisIndicateStatus(eachBinding->NdisBindingContextFromProtocol,
                           Status,
                           StatusBuffer,
                           StatusBufferSize);
        
        NdisAcquireSpinLock(&adapter->general_lock);

        eachBinding = (PBINDING_CONTEXT)eachBinding->Next.Flink;
    }
    NdisReleaseSpinLock(&adapter->general_lock);

	DBG_LEAVE(0);
}

VOID ProtocolStatusComplete(
    IN NDIS_HANDLE		ProtocolBindingContext
    )
{
	DBG_FUNC("ProtocolStatusComplete")
	PBINDING_CONTEXT eachBinding;
	UINT			 i;
	PVPN_ADAPTER adapter;

	DBG_ENTER();

	adapter = (PVPN_ADAPTER)ProtocolBindingContext;

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

        ASSERT(eachBinding->NdisBindingContextFromProtocol);
            
        NdisReleaseSpinLock(&adapter->general_lock);

        NdisIndicateStatusComplete(eachBinding->NdisBindingContextFromProtocol);
        
        NdisAcquireSpinLock(&adapter->general_lock);

        eachBinding = (PBINDING_CONTEXT)eachBinding->Next.Flink;
    }
    NdisReleaseSpinLock(&adapter->general_lock);

	DBG_LEAVE(0);
}

VOID ProtocolTransferDataComplete(
    IN NDIS_HANDLE		ProtocolBindingContext,
    IN PNDIS_PACKET     Packet,
    IN NDIS_STATUS      Status,
    IN UINT             BytesTransferred
    )
{
	DBG_FUNC("ProtocolTransferDataComplete")
	PVPN_ADAPTER	adapter;
	PPGPNDIS_PACKET	pgpPacket;
	DBG_ENTER();

	adapter = (PVPN_ADAPTER)ProtocolBindingContext;

	if ( (pgpPacket = PacketRemoveBySrcPacket(adapter, &adapter->sent_plainpacket_list, Packet)) != NULL )
	{
		NdisCompleteTransferData(pgpPacket->Binding->NdisBindingContextFromProtocol, Packet, Status, BytesTransferred);
		PGPNdisPacketFreeWithBindingContext(adapter, pgpPacket);
	}
	// Check to see if the packet is in the list.
	// If not, it'a unsecured one indicate it to the upper Protocol driver.
	// Add the checking later!
	else if ( (pgpPacket = PacketRemoveBySrcPacket(adapter, &adapter->incoming_ipsectransferComplete_wait_list, Packet)) != NULL)
	{
		if (Status == NDIS_STATUS_SUCCESS) {
			PGPnetAdjustTransferCompletePacket(pgpPacket);
			PacketEnqueue(adapter, &adapter->incoming_indicateComplete_wait_list, pgpPacket);
		}
		else {
			PGPNdisPacketFreeSrcPacket(adapter, pgpPacket);
		}
	}
	else {
		ASSERT(FALSE);
		//NdisCompleteTransferData(adapter->NdisBindingContextFromProtocol, Packet, Status, BytesTransferred);
	}

	DBG_LEAVE(Status);
}

VOID ProtocolBindAdapter(
    OUT PNDIS_STATUS    Status,
    IN NDIS_HANDLE      BindContext,
    IN PNDIS_STRING     DeviceName,
    IN PVOID            SystemSpecific1,
    IN PVOID            SystemSpecific2
    )
{
	DBG_FUNC("ProtocolBindAdapter")

	PVPN_ADAPTER	adapter;
	NDIS_STATUS		status;
	//NDIS_STATUS		OpenErrorStatus;


	NDIS_MEDIUM MediumArray[] = { NdisMedium802_3, NdisMediumWan };
	DBG_ENTER();

	/*
	 *	Check if the Mac instance already exists. FIX!
	 */

	if (NULL != VpnAdapterGlobal)
	{
		adapter = VpnAdapterGlobal;
		status = NDIS_STATUS_SUCCESS;

	    //adapter->NdisBindingContextFromProtocol = BindContext;
		//adapter->NdisAdapterRegistrationHandle = SystemSpecific1;

		*Status = status;

		DBG_LEAVE(0);

		return;
		
		
	}

	/*
	 *	First thing first. We have to call the Mac Driver Entry here.
	 */
	status = MacDriverEntry(NULL, NULL);

    if (status != NDIS_STATUS_SUCCESS)
    {
		*Status = status;
        DBG_PRINT(("!!!!! MacDriverEntry return %Xh\n", status););
		return;
    }


	/*
	 *	Since we don't have a way to disable the PGPnet protocol driver binding to the PGPnet
	 *	adapter itself. We have to detect the redundant binding in this BindAdapter Entry.
	 *	Hopefully by simply return SUCCESS will convince the NDIS LIB.
	 */
	// To Do


	/*
	 *	Allocate memory for the virtual adapter. Borrow some code from AddAdapter.
	 */

	adapter = AllocateVpnAdapter();

	if (adapter == NULL)
		goto failed;


	/*
	 *	Allocate memory for the adapter name and copy the name over.
	 */
	// Merge with AllocateVpnAdapter.
	if (adapter->RealMacName.Length == 0) {
		status = NdisAllocateMemory(&adapter->RealMacName.Buffer, DeviceName->Length, 0, HighestAcceptableAddress);
		if (status != NDIS_STATUS_SUCCESS)
		{
			*Status = status;
			goto failed;
		}
		NdisMoveMemory(adapter->RealMacName.Buffer, DeviceName->Buffer, DeviceName->Length);
		adapter->RealMacName.MaximumLength = DeviceName->Length;
		adapter->RealMacName.Length = DeviceName->Length;
	}

#ifdef MEMPHIS
	/*
	 *	Allocate the shared memory which is done in AddAdapter on NT.
	 */
	adapter->SharedMemorySize = 1024;  // Fix, should get from registry.

    if (adapter->SharedMemorySize)
    {
        NdisAllocateSharedMemory(adapter->NdisAdapterRegistrationHandle,
                                 adapter->SharedMemorySize,
                                 FALSE,
                                 &adapter->SharedMemoryPtr,
                                 &adapter->SharedMemoryPhysicalAddress
                                 );
        if (adapter->SharedMemoryPtr == NULL)
        {
            DBG_PRINT(("!!!!! Could not allocate shared memory.\n"););  
        }
        else
        {
            NdisZeroMemory(adapter->SharedMemoryPtr,
                           adapter->SharedMemorySize);
        }
    }
	
	status = AllocatePGPnetPacketPool(adapter);
	if (status != NDIS_STATUS_SUCCESS)
		goto failed;

	status = AllocatePGPnetRequestPool(adapter);

    InitializeListHead(&adapter->Bindings);

	if (status != NDIS_STATUS_SUCCESS)
		goto failed;


	/*
	 *	Open the binding adapter. See what we can borrow from the OpenAdapter in pgpmac.c
	 */
    if (adapter->NdisBindingHandleToRealMac == NULL) {
        UINT selected_index;

		NdisOpenAdapter(&status,
				&OpenErrorStatus,
				&adapter->NdisBindingHandleToRealMac,
				&selected_index,
				adapter->SupportedMediums,
				adapter->NumSupportedMediums,
				PGPnetDriver.NdisProtocolHandle,
				adapter,
				&adapter->RealMacName,
				0,
				NULL);


		adapter->media = adapter->SupportedMediums[selected_index];

    }

	if (adapter->media == NdisMedium802_3 || adapter->media == NdisMediumWan)
		adapter->eth_hdr_len = ETHER_HEADER_SIZE;

	/*
	for ( i = 0; i < adapter->NumSupportedMediums; i++ ) {
		if (adapter->media == MediumArray[i]) {
			*SelectedMediumIndex = i;
			break;
		}
	}
	*/

    adapter->open = TRUE;
	adapter->SendPackets = 0;
	adapter->ReceivePackets = 0;
#endif

	/*
	 *	Save the binding context. 
  	 */
    adapter->NdisBindingContextFromProtocol = BindContext;
	adapter->NdisAdapterRegistrationHandle = SystemSpecific1;


	if (NDIS_STATUS_PENDING == status)
		*Status = NDIS_STATUS_SUCCESS;
	else
		*Status = status;
	
failed:
	DBG_LEAVE(0);

}

VOID ProtocolUnbindAdapter(
    OUT PNDIS_STATUS    Status,
    IN NDIS_HANDLE      ProtocolBindingContext,
    IN NDIS_HANDLE      UnbindContext
    )
{
	DBG_FUNC("ProtocolUnbindAdapter")

	PVPN_ADAPTER	adapter;
	DBG_ENTER();

	adapter = ProtocolBindingContext;

	if (!VpnAdapterCreated)
	{
		DBG_LEAVE(0);
		return;
	}

	if (VpnAdapterGlobal == NULL)
	{
		DBG_LEAVE(0);
		return;
	}
	
	if (!PGPnetDriver.NdisMacHandle)
	{
		DBG_LEAVE(0);
		return;
	}
	if (!adapter->open)
	{
		DBG_LEAVE(0);
		return;
	}

    if (adapter->NdisBindingHandleToRealMac != NULL)
	{
        NdisCloseAdapter(Status, adapter->NdisBindingHandleToRealMac);
		// What if return PENDING status? TO DO.
		adapter->open = FALSE;
		adapter->NdisBindingHandleToRealMac = NULL;

	}
	else
	{
		*Status = NDIS_STATUS_SUCCESS;
	}


	DBG_LEAVE(0);
}


VOID ProtocolUnload(
    VOID
    )
{
    DBG_FUNC("ProtocolUnload")

    NDIS_STATUS status;

	DBG_ENTER();

    if (PGPnetDriver.NdisProtocolHandle)
    {
        NdisDeregisterProtocol(&status, PGPnetDriver.NdisProtocolHandle);
        PGPnetDriver.NdisProtocolHandle = NULL;
        ASSERT(status == NDIS_STATUS_SUCCESS);
    }
    
	DBG_LEAVE(status);
}


/*
 *
 */

NDIS_STATUS ProtocolDriverEntry(
    IN PDRIVER_OBJECT   DriverObject,
    IN PUNICODE_STRING  RegistryPath 
    )
{
    DBG_FUNC("ProtocolDriverEntry")

    NDIS_STATUS status;

    NDIS_PROTOCOL_CHARACTERISTICS ProtocolChar;

	DBG_ENTER();
    NdisZeroMemory(&ProtocolChar, sizeof(ProtocolChar));
    ProtocolChar.MajorNdisVersion            = NDIS_MAJOR_VERSION;
    ProtocolChar.MinorNdisVersion            = NDIS_MINOR_VERSION;
    ProtocolChar.Reserved                    = 0;
	ProtocolChar.OpenAdapterCompleteHandler  = ProtocolOpenAdapterComplete;
    ProtocolChar.CloseAdapterCompleteHandler = ProtocolCloseAdapterComplete;
	ProtocolChar.ReceiveHandler              = ProtocolReceive;
    ProtocolChar.ReceiveCompleteHandler      = ProtocolReceiveComplete;
	ProtocolChar.TransferDataCompleteHandler = ProtocolTransferDataComplete;
    ProtocolChar.SendCompleteHandler         = ProtocolSendComplete;
    ProtocolChar.RequestCompleteHandler      = ProtocolRequestComplete;
    ProtocolChar.ResetCompleteHandler        = ProtocolResetComplete;
    ProtocolChar.StatusHandler               = ProtocolStatus;
    ProtocolChar.StatusCompleteHandler       = ProtocolStatusComplete;
    ProtocolChar.Name                        = DriverName;
#ifdef CHICAGO
    ProtocolChar.BindAdapterHandler          = ProtocolBindAdapter;
    ProtocolChar.UnbindAdapterHandler        = ProtocolUnbindAdapter;
    ProtocolChar.UnloadProtocolHandler       = ProtocolUnload;
#endif
    NdisRegisterProtocol(&status,
                         &PGPnetDriver.NdisProtocolHandle,
                         &ProtocolChar,
                         sizeof(ProtocolChar)
                         );
      
    if (status != NDIS_STATUS_SUCCESS)
    {
        DBG_PRINT(("!!!!!:NdisRegisterProtocol status=%Xh\n", status););
    }
	DBG_LEAVE(status);
    return (status);
}

⌨️ 快捷键说明

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