*/
#include <ndis.h>
+#include <stdlib.h>
#include "adapter.h"
#include "transmitter.h"
#include "receiver.h"
IN PNDIS_OID_REQUEST Request
)
{
- PVOID Buffer;
- ULONG BufferLength;
- ULONG BytesNeeded;
- ULONG BytesRead;
- NDIS_STATUS ndisStatus;
+ PVOID Buffer;
+ ULONG BufferLength;
+ ULONG BytesNeeded;
+ ULONG BytesRead;
+ BOOLEAN Warn;
+ NDIS_STATUS ndisStatus;
Buffer = Request->DATA.SET_INFORMATION.InformationBuffer;
BufferLength = Request->DATA.SET_INFORMATION.InformationBufferLength;
BytesNeeded = BytesRead = 0;
+ Warn = TRUE;
ndisStatus = NDIS_STATUS_SUCCESS;
switch (Request->DATA.SET_INFORMATION.Oid) {
case OID_GEN_INTERRUPT_MODERATION:
case OID_GEN_MACHINE_NAME:
+ Warn = FALSE;
+ /*FALLTHRU*/
default:
+ if (Warn)
+ Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid);
+
ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
break;
}
static FORCEINLINE NDIS_STATUS
__CopyBuffer(
- IN PVOID Buffer,
- IN ULONG BufferLength,
- IN PVOID Source,
- IN ULONG SourceLength
+ IN PVOID Destination,
+ IN ULONG DestinationLength,
+ IN PVOID Source,
+ IN ULONG SourceLength,
+ OUT PULONG CopyLength
)
{
- if (BufferLength >= SourceLength) {
- RtlCopyMemory(Buffer, Source, SourceLength);
- return NDIS_STATUS_SUCCESS;
- }
+ *CopyLength = __min(SourceLength, DestinationLength);
+ RtlCopyMemory(Destination, Source, *CopyLength);
- RtlCopyMemory(Buffer, Source, BufferLength);
- return NDIS_STATUS_BUFFER_TOO_SHORT;
+ return (DestinationLength >= SourceLength) ?
+ NDIS_STATUS_SUCCESS :
+ NDIS_STATUS_BUFFER_TOO_SHORT;
}
static FORCEINLINE NDIS_STATUS
__SetUlong(
- IN PVOID Buffer,
- IN ULONG BufferLength,
- IN ULONG Source,
- IN OUT PULONG SourceLength
+ IN PVOID Destination,
+ IN ULONG DestinationLength,
+ IN ULONG Source,
+ OUT PULONG CopyLength
)
{
- *SourceLength = sizeof(ULONG);
-
- if (BufferLength >= sizeof(ULONG)) {
- *(PULONG)Buffer = (ULONG)Source;
- return NDIS_STATUS_SUCCESS;
- }
-
- return NDIS_STATUS_BUFFER_TOO_SHORT;
+ return __CopyBuffer(Destination,
+ DestinationLength & ~3,
+ &Source,
+ sizeof (ULONG),
+ CopyLength);
}
static FORCEINLINE NDIS_STATUS
__SetUlong64(
- IN PVOID Buffer,
- IN ULONG BufferLength,
- IN ULONGLONG Source,
- IN OUT PULONG SourceLength
+ IN PVOID Destination,
+ IN ULONG DestinationLength,
+ IN ULONG64 Source,
+ OUT PULONG CopyLength
)
{
- *SourceLength = sizeof(ULONGLONG);
-
- if (BufferLength >= sizeof(ULONGLONG)) {
- *(PULONGLONG)Buffer = Source;
- return NDIS_STATUS_SUCCESS;
- }
+ NDIS_STATUS ndisStatus;
- if (BufferLength >= sizeof(ULONG)) {
- *(PULONG)Buffer = (ULONG)Source;
- *SourceLength = sizeof(ULONG);
- return NDIS_STATUS_SUCCESS;
- }
+ ndisStatus = __CopyBuffer(Destination,
+ DestinationLength & ~3,
+ &Source,
+ sizeof (ULONG64),
+ CopyLength);
+ if (DestinationLength >= 4)
+ ndisStatus = NDIS_STATUS_SUCCESS;
- return NDIS_STATUS_BUFFER_TOO_SHORT;
+ return ndisStatus;
}
NDIS_STATUS
IN PNDIS_OID_REQUEST Request
)
{
- PVOID Buffer;
- ULONG BufferLength;
- ULONG BytesNeeded;
- ULONG BytesWritten;
- ULONG Value32;
- ULONGLONG Value64;
- ETHERNET_ADDRESS EthernetAddress;
- NDIS_STATUS ndisStatus;
+ PVOID Buffer;
+ ULONG BufferLength;
+ ULONG BytesNeeded;
+ ULONG BytesWritten;
+ ULONG Value32;
+ ULONGLONG Value64;
+ ETHERNET_ADDRESS EthernetAddress;
+ BOOLEAN Warn;
+ NDIS_STATUS ndisStatus;
Buffer = Request->DATA.QUERY_INFORMATION.InformationBuffer;
BufferLength = Request->DATA.QUERY_INFORMATION.InformationBufferLength;
- BytesNeeded = BytesWritten = sizeof(ULONG);
+ BytesNeeded = BytesWritten = 0;
+ Warn = TRUE;
ndisStatus = NDIS_STATUS_SUCCESS;
switch (Request->DATA.QUERY_INFORMATION.Oid) {
case OID_PNP_CAPABILITIES:
- BytesNeeded = BytesWritten = sizeof(Adapter->Capabilities);
+ BytesNeeded = sizeof(Adapter->Capabilities);
ndisStatus = __CopyBuffer(Buffer,
BufferLength,
&Adapter->Capabilities,
- BytesWritten);
+ BytesNeeded,
+ &BytesWritten);
break;
case OID_PNP_QUERY_POWER:
break;
case OID_GEN_SUPPORTED_LIST:
- BytesNeeded = BytesWritten = sizeof(XennetSupportedOids);
+ BytesNeeded = sizeof(XennetSupportedOids);
ndisStatus = __CopyBuffer(Buffer,
BufferLength,
&XennetSupportedOids[0],
- BytesWritten);
+ BytesNeeded,
+ &BytesWritten);
break;
case OID_GEN_HARDWARE_STATUS:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
NdisHardwareStatusReady,
case OID_GEN_MEDIA_SUPPORTED:
case OID_GEN_MEDIA_IN_USE:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
XENNET_MEDIA_TYPE,
case OID_GEN_MAXIMUM_LOOKAHEAD:
case OID_GEN_TRANSMIT_BLOCK_SIZE:
case OID_GEN_RECEIVE_BLOCK_SIZE:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
Adapter->MaximumFrameSize,
&Adapter->VifInterface,
(PULONG)&Value32);
Value32 *= Adapter->MaximumFrameSize;
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
Value32,
break;
case OID_GEN_VENDOR_DESCRIPTION:
- BytesNeeded = BytesWritten = (ULONG)strlen(COMPANY_NAME_STR) + 1;
+ BytesNeeded = (ULONG)strlen(COMPANY_NAME_STR) + 1;
ndisStatus = __CopyBuffer(Buffer,
BufferLength,
COMPANY_NAME_STR,
- BytesWritten);
+ BytesNeeded,
+ &BytesWritten);
break;
case OID_GEN_VENDOR_DRIVER_VERSION:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
((MAJOR_VERSION << 8) | MINOR_VERSION) << 8,
break;
case OID_GEN_DRIVER_VERSION:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(6 << 8) | 0, // NDIS 6.0
break;
case OID_GEN_MAC_OPTIONS:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
XENNET_MAC_OPTIONS,
break;
case OID_GEN_STATISTICS:
- BytesNeeded = BytesWritten = sizeof(NDIS_STATISTICS_INFO);
+ BytesNeeded = sizeof(NDIS_STATISTICS_INFO);
ndisStatus = AdapterQueryGeneralStatistics(Adapter,
(PNDIS_STATISTICS_INFO)Buffer,
BufferLength,
XENVIF_VIF(MacQueryPermanentAddress,
&Adapter->VifInterface,
&EthernetAddress);
- BytesNeeded = BytesWritten = sizeof(ETHERNET_ADDRESS);
+ BytesNeeded = sizeof(ETHERNET_ADDRESS);
ndisStatus = __CopyBuffer(Buffer,
BufferLength,
&EthernetAddress,
- BytesWritten);
+ BytesNeeded,
+ &BytesWritten);
break;
case OID_802_3_CURRENT_ADDRESS:
XENVIF_VIF(MacQueryCurrentAddress,
&Adapter->VifInterface,
&EthernetAddress);
- BytesNeeded = BytesWritten = sizeof(ETHERNET_ADDRESS);
+ BytesNeeded = sizeof(ETHERNET_ADDRESS);
ndisStatus = __CopyBuffer(Buffer,
BufferLength,
&EthernetAddress,
- BytesWritten);
+ BytesNeeded,
+ &BytesWritten);
break;
case OID_GEN_MAXIMUM_FRAME_SIZE:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
Adapter->MaximumFrameSize -
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
Adapter->MaximumFrameSize -
break;
case OID_GEN_CURRENT_LOOKAHEAD:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
Adapter->CurrentLookahead,
break;
case OID_GEN_VENDOR_ID:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
0x5853,
NULL,
&Value64,
NULL);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)(Value64 / 100),
(PNET_IF_MEDIA_CONNECT_STATE)&Value32,
NULL,
NULL);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
Value32,
break;
case OID_GEN_MAXIMUM_SEND_PACKETS:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
16,
case OID_GEN_CURRENT_PACKET_FILTER:
AdapterGetPacketFilter(Adapter, &Value32);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
Value32,
case OID_GEN_XMIT_OK:
AdapterGetXmitOk(Adapter, &Value64);
+ BytesNeeded = sizeof(ULONG64);
ndisStatus = __SetUlong64(Buffer,
BufferLength,
Value64,
case OID_GEN_RCV_OK:
AdapterGetRcvOk(Adapter, &Value64);
+ BytesNeeded = sizeof(ULONG64);
ndisStatus = __SetUlong64(Buffer,
BufferLength,
Value64,
case OID_GEN_XMIT_ERROR:
AdapterGetXmitError(Adapter, &Value32);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
Value32,
case OID_GEN_RCV_ERROR:
AdapterGetRcvError(Adapter, &Value32);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
Value32,
case OID_802_3_RCV_ERROR_ALIGNMENT:
case OID_802_3_XMIT_ONE_COLLISION:
case OID_802_3_XMIT_MORE_COLLISIONS:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
0,
break;
case OID_802_3_MAXIMUM_LIST_SIZE:
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
32,
&Adapter->VifInterface,
XENVIF_TRANSMITTER_UNICAST_OCTETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
&Adapter->VifInterface,
XENVIF_TRANSMITTER_UNICAST_PACKETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
&Adapter->VifInterface,
XENVIF_TRANSMITTER_MULTICAST_OCTETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
&Adapter->VifInterface,
XENVIF_TRANSMITTER_MULTICAST_PACKETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
&Adapter->VifInterface,
XENVIF_TRANSMITTER_BROADCAST_OCTETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
&Adapter->VifInterface,
XENVIF_TRANSMITTER_BROADCAST_PACKETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
&Adapter->VifInterface,
XENVIF_RECEIVER_UNICAST_OCTETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
&Adapter->VifInterface,
XENVIF_RECEIVER_UNICAST_PACKETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
&Adapter->VifInterface,
XENVIF_RECEIVER_MULTICAST_OCTETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
&Adapter->VifInterface,
XENVIF_RECEIVER_MULTICAST_PACKETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
&Adapter->VifInterface,
XENVIF_RECEIVER_BROADCAST_OCTETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
&Adapter->VifInterface,
XENVIF_RECEIVER_BROADCAST_PACKETS,
&Value64);
+ BytesNeeded = sizeof(ULONG);
ndisStatus = __SetUlong(Buffer,
BufferLength,
(ULONG)Value64,
case OID_IP4_OFFLOAD_STATS:
case OID_IP6_OFFLOAD_STATS:
case OID_GEN_SUPPORTED_GUIDS:
-
// We don't handle these since NDIS 6.0 is supposed to do this for us
case OID_GEN_MAC_ADDRESS:
case OID_GEN_MAX_LINK_SPEED:
-
// ignore these common unwanted OIDs
case OID_GEN_INIT_TIME_MS:
case OID_GEN_RESET_COUNTS:
case OID_GEN_MEDIA_SENSE_COUNTS:
-
+ Warn = FALSE;
+ /*FALLTHRU*/
default:
+ if (Warn)
+ Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid);
+
ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
- BytesNeeded = 0;
break;
}