📄 vpnproto.c
字号:
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 + -