📄 request.c
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Module Name:
Abstract:
Functions:
--*/
#include <ndis.h>
#include <VMini.h>
#include "zone.h"
UCHAR VendorDescription[] = "MICROSOFT NULL ETHER PORT";
DWORD g_dwLookAhead = VMINI_INDICATE_MAXIMUM - MAC_HEADER_SIZE;
DWORD g_dwMediaStatus = NDIS_STATUS_MEDIA_CONNECT;
////////////////////////////////////////////////////////////////////////////////
// InternalVMiniQueryInformation()
// We emulate 802.3 10Mbps.
// VMiniQuerylInformation process a Query request for NDIS_OIDs that are
// specific to a binding about the mini-port.
//
// Arguments:
// MiniportAdapterContext - a pointer to the adapter.
// Oid - the NDIS_OID to process.
// InfoBuffer - a pointer into the NdisRequest->InformationBuffer
// into which store the result of the query.
// BytesLeft - The number of bytes left in the InformationBuffer.
// BytesNeeded - If there is not enough room in the information
// buffer then this will contain the number of
// bytes needed to complete the request.
// BytesWritten - A pointer to the number of bytes written into the
// InformationBuffer.
//
//
NDIS_STATUS
InternalVMiniQueryInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded
)
{
static NDIS_OID VMiniGlobalSupportedOids[] =
{
OID_GEN_SUPPORTED_LIST,
OID_GEN_HARDWARE_STATUS,
OID_GEN_MEDIA_SUPPORTED,
OID_GEN_MEDIA_IN_USE,
OID_GEN_MEDIA_CONNECT_STATUS,
OID_GEN_MAXIMUM_SEND_PACKETS,
OID_GEN_VENDOR_DRIVER_VERSION,
OID_GEN_MAXIMUM_LOOKAHEAD,
OID_GEN_MAXIMUM_FRAME_SIZE,
OID_GEN_MAC_OPTIONS,
OID_GEN_PROTOCOL_OPTIONS,
OID_GEN_LINK_SPEED,
OID_GEN_TRANSMIT_BUFFER_SPACE,
OID_GEN_RECEIVE_BUFFER_SPACE,
OID_GEN_TRANSMIT_BLOCK_SIZE,
OID_GEN_RECEIVE_BLOCK_SIZE,
OID_GEN_VENDOR_ID,
OID_GEN_VENDOR_DESCRIPTION,
OID_GEN_CURRENT_PACKET_FILTER,
OID_GEN_CURRENT_LOOKAHEAD,
OID_GEN_DRIVER_VERSION,
OID_GEN_MAXIMUM_TOTAL_SIZE,
OID_GEN_XMIT_OK,
OID_GEN_RCV_OK,
OID_GEN_XMIT_ERROR,
OID_GEN_RCV_ERROR,
OID_GEN_RCV_NO_BUFFER,
OID_802_3_PERMANENT_ADDRESS,
OID_802_3_CURRENT_ADDRESS,
OID_802_3_MULTICAST_LIST,
OID_802_3_MAXIMUM_LIST_SIZE,
OID_802_3_RCV_ERROR_ALIGNMENT,
OID_802_3_XMIT_ONE_COLLISION,
#ifdef NDIS50_MINIPORT
OID_PNP_CAPABILITIES,
OID_PNP_QUERY_POWER,
OID_PNP_SET_POWER,
#endif
OID_802_3_XMIT_MORE_COLLISIONS
};
PVOID SourceBuffer;
ULONG SourceBufferLength;
PNDIS_OID SupportedOidArray;
INT SupportedOids;
ULONG GenericUlong;
USHORT GenericUshort;
NDIS_STATUS Status;
UCHAR VendorId[4];
PSTRUCT_VMINI Adapter = MiniportAdapterContext;
#ifdef NDIS50_MINIPORT
NDIS_PNP_CAPABILITIES ndis_pnp_capablities;
#endif
DEBUGMSG (ZONE_GET, (TEXT("VMini:: VMiniQueryInformation() OID = [0x%x] \r\n"),
Oid));
Status = NDIS_STATUS_SUCCESS;
SupportedOidArray = (PNDIS_OID)VMiniGlobalSupportedOids;
SupportedOids = sizeof(VMiniGlobalSupportedOids)/sizeof(ULONG);
SourceBuffer = &GenericUlong;
SourceBufferLength = sizeof(ULONG);
////////////////////////////////////////////////////////////////////////////
// Switch on request type
//
switch (Oid)
{
////////////////////////////////////////////////////////////////
case OID_GEN_MAC_OPTIONS:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_MAC_OPTIONS.\r\n")));
GenericUlong = (ULONG)(NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |
NDIS_MAC_OPTION_RECEIVE_SERIALIZED |
NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |
NDIS_MAC_OPTION_NO_LOOPBACK);
break;
////////////////////////////////////////////////////////////////
case OID_GEN_SUPPORTED_LIST:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_SUPPORTED_LIST.\r\n")));
SourceBuffer = SupportedOidArray;
SourceBufferLength = sizeof(VMiniGlobalSupportedOids);
break;
////////////////////////////////////////////////////////////////
// NULL Ethernet is ALWAYS ready...
//
case OID_GEN_HARDWARE_STATUS:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_HARDWARE_STATUS.\r\n")));
GenericUlong = NdisHardwareStatusReady;
break;
////////////////////////////////////////////////////////////////
// NULL Ethernet supports 802.3 only.
//
case OID_GEN_MEDIA_SUPPORTED:
case OID_GEN_MEDIA_IN_USE:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_MEDIA_SUPPORT | OID_GEN_MEDIA_IN_USE.\r\n")));
GenericUlong = NdisMedium802_3;
break;
////////////////////////////////////////////////////////////////
case OID_GEN_MAXIMUM_LOOKAHEAD:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_MAXIMUM_LOOKAHEAD.\r\n")));
GenericUlong = VMINI_INDICATE_MAXIMUM - MAC_HEADER_SIZE;
break;
////////////////////////////////////////////////////////////////
case OID_GEN_MAXIMUM_FRAME_SIZE:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_MAXIMUM_FRAME_SIZE.\r\n")));
GenericUlong = VMINI_INDICATE_MAXIMUM - MAC_HEADER_SIZE;
break;
////////////////////////////////////////////////////////////////
case OID_GEN_MAXIMUM_TOTAL_SIZE:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_MAXIMUM_TOTAL_SIZE.\r\n")));
GenericUlong = VMINI_INDICATE_MAXIMUM;
break;
////////////////////////////////////////////////////////////////
case OID_GEN_MEDIA_CONNECT_STATUS:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_MEDIA_CONNECT_STATUS.\r\n")));
if (g_dwMediaStatus == NDIS_STATUS_MEDIA_CONNECT)
GenericUlong = NdisMediaStateConnected;
else
GenericUlong = NdisMediaStateDisconnected;
break;
////////////////////////////////////////////////////////////////
case OID_GEN_MAXIMUM_SEND_PACKETS:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_MAXIMUM_SEND_PACKETS.\r\n")));
GenericUlong = MAX_SEND_PACKETS;
break;
////////////////////////////////////////////////////////////////
case OID_GEN_VENDOR_DRIVER_VERSION:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_VENDOR_DRIVER_VERSION.\r\n")));
GenericUshort = (VMini_DRIVER_MAJOR_VERSION << 8) + VMini_DRIVER_MINOR_VERSION;
SourceBuffer = &GenericUshort;
SourceBufferLength = sizeof(USHORT);
break;
////////////////////////////////////////////////////////////////
// Virtual Ethernet supports 10Mbps.
// in 100bps units
//
case OID_GEN_LINK_SPEED:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_LINK_SPEED.\r\n")));
GenericUlong = 10 * 10000;
break;
case OID_GEN_TRANSMIT_BUFFER_SPACE:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_TRANSMIT_BUFFER_SPACE.\r\n")));
GenericUlong = TRANSMIT_BUFFER_SIZE * TRANSMIT_BUFFERS;
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_RECEIVE_BUFFER_SPACE.\r\n")));
GenericUlong = RECEIVE_BUFFER_SIZE * RECEIVE_BUFFERS;
break;
////////////////////////////////////////////////////////////////
case OID_GEN_TRANSMIT_BLOCK_SIZE:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_TRANSMIT_BLOCK_SIZE.\r\n")));
GenericUlong = TRANSMIT_BUFFER_SIZE;
break;
////////////////////////////////////////////////////////////////
case OID_GEN_RECEIVE_BLOCK_SIZE:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_RECEIVE_BLOCK_SIZE.\r\n")));
GenericUlong = RECEIVE_BUFFER_SIZE;
break;
////////////////////////////////////////////////////////////////
case OID_GEN_VENDOR_ID:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_VENDOR_ID.\r\n")));
NdisMoveMemory(VendorId, Adapter->vm_PermanentNetworkAddress, 3);
VendorId[3] = 0x0;
SourceBuffer = VendorId;
SourceBufferLength = sizeof(VendorId);
break;
////////////////////////////////////////////////////////////////
case OID_GEN_VENDOR_DESCRIPTION:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_VENDOR_DESCRIPTION...\r\n")));
SourceBuffer = (PVOID)VendorDescription;
SourceBufferLength = sizeof(VendorDescription);
break;
////////////////////////////////////////////////////////////////
case OID_GEN_DRIVER_VERSION:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_DRIVER_VERSION...\r\n")));
GenericUshort = (VMini_DRIVER_MAJOR_VERSION << 8) + VMini_DRIVER_MINOR_VERSION;
SourceBuffer = &GenericUshort;
SourceBufferLength = sizeof(USHORT);
break;
////////////////////////////////////////////////////////////////
case OID_GEN_CURRENT_LOOKAHEAD:
GenericUlong = g_dwLookAhead;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_CURRENT_LOOKAHEAD. = %d\r\n"), GenericUlong));
break;
////////////////////////////////////////////////////////////////
case OID_GEN_CURRENT_PACKET_FILTER:
GenericUlong = Adapter->vm_CurrentPacketFilter;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: Virtual Mini:: returning filter type: 0x%x\r\n"),
GenericUlong));
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_CURRENT_PACKET_FILTER. = %d\r\n"), GenericUlong));
break;
////////////////////////////////////////////////////////////////
case OID_GEN_XMIT_OK:
GenericUlong = 0x00;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_XMIT_OK:: Returning BOGUS\r\n")));
break;
////////////////////////////////////////////////////////////////
case OID_GEN_RCV_OK:
GenericUlong = 0x00;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_RCV_OK:: Returning BOGUS\r\n")));
break;
////////////////////////////////////////////////////////////////
case OID_GEN_XMIT_ERROR:
GenericUlong = 0x00;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_XMIT_ERROR:: Returning BOGUS\r\n")));
break;
////////////////////////////////////////////////////////////////
case OID_GEN_RCV_ERROR:
GenericUlong = 0x00;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_RCV_ERROR:: Returning BOGUS\r\n")));
break;
////////////////////////////////////////////////////////////////
case OID_GEN_RCV_NO_BUFFER:
GenericUlong = 0x00;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_GEN_RCV_NO_BUFFER:: Returning BOGUS\r\n")));
break;
////////////////////////////////////////////////////////////////
case OID_802_3_PERMANENT_ADDRESS:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_802_3_PERMANENT_ADDRESS.\r\n")));
SourceBuffer = Adapter->vm_PermanentNetworkAddress;
SourceBufferLength = 6;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: PermanentNetworkAddress = %x%x%x%x%x%x\r\n"),
Adapter->vm_PermanentNetworkAddress[0],
Adapter->vm_PermanentNetworkAddress[1],
Adapter->vm_PermanentNetworkAddress[2],
Adapter->vm_PermanentNetworkAddress[3],
Adapter->vm_PermanentNetworkAddress[4],
Adapter->vm_PermanentNetworkAddress[5]));
break;
////////////////////////////////////////////////////////////////
case OID_802_3_CURRENT_ADDRESS:
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_802_3_CURRENT_ADDRESS...\r\n")));
SourceBuffer = Adapter->vm_CurrentNetworkAddress;
SourceBufferLength = 6;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: CurrentNetworkAddress = %x%x%x%x%x%x\r\n"),
Adapter->vm_CurrentNetworkAddress[0],
Adapter->vm_CurrentNetworkAddress[1],
Adapter->vm_CurrentNetworkAddress[2],
Adapter->vm_CurrentNetworkAddress[3],
Adapter->vm_CurrentNetworkAddress[4],
Adapter->vm_CurrentNetworkAddress[5]));
break;
////////////////////////////////////////////////////////////////
case OID_802_3_MAXIMUM_LIST_SIZE:
GenericUlong = Adapter->vm_MaxListSize;
DEBUGMSG (ZONE_GET,
(TEXT("VMini:: OID_802_3_MAXIMUM_LIST_SIZE = 0x%x\r\n"), GenericUlong));
break;
////////////////////////////////////////////////////////////////
case OID_802_3_MULTICAST_LIST:
SourceBuffer = (PVOID)(Adapter->vm_MulticastAddresses);
SourceBufferLength = Adapter->vm_MulticastAddressesInUse * 6;
DEBUGMSG (ZONE_GET,
(TEXT("VMini: Qry Multicast returning [%d]bytes\r\n"),
SourceBufferLength));
break;
////////////////////////////////////////////////////////////////
case OID_802_3_RCV_ERROR_ALIGNMENT:
GenericUlong = 0x00;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_802_3_RCV_ERROR_ALIGNMENT:: Returning: BOGUS\r\n")));
break;
////////////////////////////////////////////////////////////////
case OID_802_3_XMIT_ONE_COLLISION:
GenericUlong = 0x00;
DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_802_3_XMIT_ONE_COLLISION:: Returning: BOGUS\r\n")));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -