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