📄 request.c
字号:
break;
////////////////////////////////////////////////////////////////
case OID_802_3_XMIT_MORE_COLLISIONS:
GenericUlong = 0x00;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_802_3_XMIT_MORE_COLLISIONS:: Returning: BOGUS \r\n")));
break;
////////////////////////////////////////////////////////////////
case OID_TYPE_CUSTOM_OPER:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: >>> OID_TYPE_CUSTOM_OPER...\r\n")));
break;
////////////////////////////////////////////////////////////////
#ifdef NDIS50_MINIPORT
case OID_PNP_CAPABILITIES:
{
DEBUGMSG (ZONE_GET,
(TEXT("VMini:: OID_PNP_CAPABILITIES..\r\n")));
ndis_pnp_capablities.WakeUpCapabilities.MinMagicPacketWakeUp = NdisDeviceStateUnspecified;
ndis_pnp_capablities.WakeUpCapabilities.MinPatternWakeUp = NdisDeviceStateUnspecified;
ndis_pnp_capablities.WakeUpCapabilities.MinLinkChangeWakeUp = NdisDeviceStateUnspecified;
SourceBuffer = (PVOID)&ndis_pnp_capablities;
SourceBufferLength = sizeof(ndis_pnp_capablities);
break;
}
case OID_PNP_QUERY_POWER:
{
DEVICE_POWER_STATE DevicePowerState;
DevicePowerState = *(PDEVICE_POWER_STATE)InformationBuffer;
DEBUGMSG (ZONE_GET,
(TEXT("VMini:: Okay OID_PNP_QUERY_POWER for [%s].\r\n"),
(DevicePowerState == NdisDeviceStateD0) ? TEXT("D0"):
(DevicePowerState == NdisDeviceStateD1) ? TEXT("D1"):
(DevicePowerState == NdisDeviceStateD2) ? TEXT("D2"):
(DevicePowerState == NdisDeviceStateD3) ? TEXT("D3"):
TEXT("UNKNOWN")));
GenericUlong = 0x00;
break;
}
#endif
////////////////////////////////////////////////////////////////
default:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID not supported!!\r\n")));
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
} // switch (Oid)
////////////////////////////////////////////////////////////////////////////
// Everyone gets here...
//
if (Status == NDIS_STATUS_SUCCESS)
{
if (SourceBufferLength > InformationBufferLength)
{
////////////////////////////////////////////////////////////////////
// Not enough room in InformationBuffer. Punt
//
DEBUGMSG (0,
(TEXT("VMini:: Err: OID[0x%x] SrcLen = %d > BuffLen = %d \r\n"),
Oid,
SourceBufferLength,
InformationBufferLength));
*BytesNeeded = SourceBufferLength;
Status = NDIS_STATUS_INVALID_LENGTH;
}
else
{
////////////////////////////////////////////////////////////////////
// Store result.
//
NdisMoveMemory(InformationBuffer, SourceBuffer, SourceBufferLength);
*BytesWritten = SourceBufferLength;
}
}
DEBUGMSG (ZONE_GET, (TEXT("VMini:: VMiniQueryInformation returning: %s\r\n"),
Status ? TEXT("Error") : TEXT("Success")));
return Status;
} // InternalVMiniQueryInformation()
////////////////////////////////////////////////////////////////////////////////
// InternalVMiniSetInformation()
//
// The VMiniSetInformation handles a set operation for a single Oid
//
// Arguments:
// MiniportAdapterContext - a pointer to the adapter.
// Oid - The OID of the set.
// InformationBuffer - Holds the data to be set.
// InformationBufferLength - The length of InformationBuffer.
// BytesRead - If the call is successful, returns the number
// of bytes read from InformationBuffer.
// BytesNeeded - If there is not enough data in
// InformationBuffer to satisfy the OID,
// returns the amount of storage needed.
//
// Return Value:
//
// - NDIS_STATUS_SUCCESS
// - NDIS_STATUS_PENDING
// - NDIS_STATUS_INVALID_LENGTH
// - NDIS_STATUS_INVALID_OID
//
//
NDIS_STATUS
InternalVMiniSetInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded
)
{
PSTRUCT_VMINI Adapter = MiniportAdapterContext;
PUCHAR InfoBuffer = (PUCHAR)InformationBuffer;
DWORD dwFilter;
DEBUGMSG (ZONE_SET, (TEXT("VMini:: VMiniSetInformation() OID = 0x%x \r\n"),
Oid));
////////////////////////////////////////////////////////////////////////////
// Check for the most common OIDs
//
switch (Oid)
{
////////////////////////////////////////////////////////////////////////
// MULTICAST LIST SETTING...
//
case OID_802_3_MULTICAST_LIST:
DEBUGMSG (ZONE_SET, (TEXT("VMini:: OID_802_3_MULTICAST_LIST...\r\n")));
DEBUGMSG (0, (TEXT("VMini:: OID_802_3_MULTICAST_LIST...\r\n")));
*BytesRead = 0;
*BytesNeeded = 0;
if ((InformationBufferLength % 6) != 0)
{
DEBUGMSG (ZONE_ERROR,
(TEXT("VMini:: Err:: MulticastList:: Not mult of 6!\r\n")));
return NDIS_STATUS_INVALID_LENGTH;
}
if ((InformationBufferLength / 6) > DEFAULT_MULTICASTLIST_MAX)
{
DEBUGMSG (ZONE_ERROR,
(TEXT("VMini:: MulticastList too long [%d] max [%d] \r\n"),
InformationBufferLength / 6,
DEFAULT_MULTICASTLIST_MAX));
return NDIS_STATUS_MULTICAST_FULL;
}
NdisMoveMemory(
Adapter->vm_MulticastAddresses,
InformationBuffer,
InformationBufferLength);
Adapter->vm_MulticastAddressesInUse = InformationBufferLength / 6;
if (!KernelIoControl(
IOCTL_VBRIDGE_802_3_MULTICAST_LIST,
Adapter->vm_MulticastAddresses,
Adapter->vm_MulticastAddressesInUse,
NULL,
0,
NULL))
{
DEBUGMSG (ZONE_ERROR,
(TEXT("VMini:: Failed to set multicast list.\r\n")));
Adapter->vm_MulticastAddressesInUse = 0x00;
return NDIS_STATUS_FAILURE;
}
#if 0
{
DWORD i;
DEBUGMSG (1,
(TEXT("VMini:: Successfully set [%d] entry in multicast list:\r\n"),
InformationBufferLength / 6));
for (i = 0 ; i < Adapter->vm_MulticastAddressesInUse ; i++)
{
DEBUGMSG (1,
(TEXT("Entry [%d] : %02x-%02x-%02x-%02x-%02x-%02x\r\n"),
i,
Adapter->vm_MulticastAddresses[i][0],
Adapter->vm_MulticastAddresses[i][1],
Adapter->vm_MulticastAddresses[i][2],
Adapter->vm_MulticastAddresses[i][3],
Adapter->vm_MulticastAddresses[i][4],
Adapter->vm_MulticastAddresses[i][5]));
}
}
#endif
return NDIS_STATUS_SUCCESS;
break;
////////////////////////////////////////////////////////////////////////
// Packet Filter setting...
//
case OID_GEN_CURRENT_PACKET_FILTER:
DEBUGMSG (ZONE_SET, (TEXT("VMini:: OID_GEN_CURRENT_PACKET_FILTER.\r\n")));
*BytesRead = 0;
*BytesNeeded = 0;
if (InformationBufferLength != 4 )
return NDIS_STATUS_INVALID_LENGTH;
NdisMoveMemory(&dwFilter, InformationBuffer, 4);
//
// Reject types we don't support..
//
if (dwFilter &
(NDIS_PACKET_TYPE_SOURCE_ROUTING |
NDIS_PACKET_TYPE_SMT |
NDIS_PACKET_TYPE_MAC_FRAME |
NDIS_PACKET_TYPE_FUNCTIONAL |
NDIS_PACKET_TYPE_ALL_FUNCTIONAL |
NDIS_PACKET_TYPE_GROUP))
{
return NDIS_STATUS_NOT_SUPPORTED;
}
//
// Hence we support:
// DIRECTED, MULTICAST, ALL_MULTICAST, BROADCAST,
//
// Set the new value on the adapter..
//
Adapter->vm_CurrentPacketFilter = dwFilter;
if (!KernelIoControl(
IOCTL_VBRIDGE_CURRENT_PACKET_FILTER,
&Adapter->vm_CurrentPacketFilter,
sizeof(DWORD),
NULL,
0,
NULL))
{
DEBUGMSG (ZONE_ERROR,
(TEXT("VMini:: Failed to set filtering mode to: 0x%x\r\n"),
Adapter->vm_CurrentPacketFilter));
Adapter->vm_CurrentPacketFilter = 0x00;
return NDIS_STATUS_FAILURE;
}
return NDIS_STATUS_SUCCESS;
break;
////////////////////////////////////////////////////////////////////////
// LookAhead...
//
case OID_GEN_CURRENT_LOOKAHEAD:
DEBUGMSG (ZONE_SET, (TEXT("VMini:: OID_GEN_CURRENT_LOOKAHEAD...\r\n")));
if (InformationBufferLength != 4 )
{
DEBUGMSG (ZONE_ERROR,
(TEXT("VMini - Set GEN_CURRENT_LOOKAHEAD inval len.\r\n")));
return NDIS_STATUS_INVALID_LENGTH;
}
NdisMoveMemory(&g_dwLookAhead, InformationBuffer, 4);
*BytesRead = 4;
break;
////////////////////////////////////////////////////////////////////////
// Special case to force status disconnect..
//
case 0xf0000001:
{
DWORD dwToDisconnect;
if (InformationBufferLength != 4 )
{
DEBUGMSG (ZONE_ERROR,
(TEXT("VMini - Set 0xf0000001 inval len.\r\n")));
return NDIS_STATUS_INVALID_LENGTH;
}
NdisMoveMemory(&dwToDisconnect, InformationBuffer, 4);
//
// 0 means disconnect, anything else connect..
//
if (dwToDisconnect)
{
DEBUGMSG (ZONE_SET,
(TEXT("VMini:: media status is DISCONNECTED..\r\n")));
g_dwMediaStatus = NDIS_STATUS_MEDIA_CONNECT;
}
else
{
DEBUGMSG (ZONE_SET,
(TEXT("VMini:: media status is CONNECTED..\r\n")));
g_dwMediaStatus = NDIS_STATUS_MEDIA_DISCONNECT;
}
NdisMIndicateStatus(
Adapter->vm_VMiniportHandle,
g_dwMediaStatus,
NULL,
0);
break;
}
////////////////////////////////////////////////////////////////////////
case OID_PNP_SET_POWER:
{
NDIS_DEVICE_POWER_STATE NdisDevicePowerState;
*BytesRead = 4;
*BytesNeeded = 0;
NdisDevicePowerState = *(PNDIS_DEVICE_POWER_STATE)InformationBuffer;
DEBUGMSG (ZONE_SET,
(TEXT("VMini:: OID_PNP_SET_POWER to [%s]\r\n"),
(NdisDevicePowerState == NdisDeviceStateD0) ? TEXT("D0") :
(NdisDevicePowerState == NdisDeviceStateD1) ? TEXT("D1") :
(NdisDevicePowerState == NdisDeviceStateD2) ? TEXT("D2") :
(NdisDevicePowerState == NdisDeviceStateD3) ? TEXT("D3") :
TEXT("UNKNOWN.")));
break;
}
////////////////////////////////////////////////////////////////////////
default:
DEBUGMSG (ZONE_SET, (TEXT("VMini:: Default...returning INVALID\r\n")));
*BytesRead = 0;
*BytesNeeded = 0;
return NDIS_STATUS_INVALID_OID;
}
return NDIS_STATUS_SUCCESS;
} // InternalVMiniSetInformation()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -