📄 miniport.c.bak
字号:
//
// This variable holds result of query
//
ULONG GenericULong;
USHORT GenericUShort;
UCHAR GenericArray[6];
UINT MoveBytes = sizeof(ULONG);
PVOID MoveSource = (PVOID)(&GenericULong);
DEBUGMSG(1, (TEXT("+CS8900:CS8900QueryInformation\r\n")));
//
// Make sure that int is 4 bytes. Else GenericULong must change
// to something of size 4.
//
ASSERT(sizeof(ULONG) == 4);
//
// Switch on request type
//
switch (Oid) {
case OID_GEN_MAC_OPTIONS:
GenericULong = (ULONG)(NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |
NDIS_MAC_OPTION_RECEIVE_SERIALIZED |
NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |
NDIS_MAC_OPTION_NO_LOOPBACK
);
DEBUGMSG(1, (TEXT("----> OID_GEN_MAC_OPTIONS\r\n")));
break;
case OID_GEN_SUPPORTED_LIST:
MoveSource = (PVOID)(CS8900SupportedOids);
MoveBytes = sizeof(CS8900SupportedOids);
DEBUGMSG(1, (TEXT("----> OID_GEN_SUPPORTED_LIST\r\n")));
break;
case OID_GEN_HARDWARE_STATUS:
HardwareStatus = NdisHardwareStatusReady;
MoveSource = (PVOID)(&HardwareStatus);
MoveBytes = sizeof(NDIS_HARDWARE_STATUS);
DEBUGMSG(1, (TEXT("----> OID_GEN_HARDWARE_STATUS\r\n")));
break;
case OID_GEN_MEDIA_SUPPORTED:
case OID_GEN_MEDIA_IN_USE:
MoveSource = (PVOID) (&Medium);
MoveBytes = sizeof(NDIS_MEDIUM);
DEBUGMSG(1, (TEXT("----> OID_GEN_MEDIA\r\n")));
break;
case OID_GEN_MAXIMUM_LOOKAHEAD:
GenericULong = CS8900_MAX_LOOKAHEAD;
DEBUGMSG(1, (TEXT("----> OID_GEN_MAXIMUM_LOOKAHEAD\r\n")));
break;
case OID_GEN_MAXIMUM_FRAME_SIZE:
GenericULong = (ULONG)(1518 - CS8900_HEADER_SIZE);
DEBUGMSG(1, (TEXT("----> OID_GEN_MAXIMUM_FRAME_SIZE\r\n")));
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
GenericULong = (ULONG)(1518);
DEBUGMSG(1, (TEXT("----> OID_GEN_TOTAL_SIZE\r\n")));
break;
case OID_GEN_LINK_SPEED:
GenericULong = (ULONG)(100000);
DEBUGMSG(1, (TEXT("----> OID_GEN_LINK_SPEED\r\n")));
break;
case OID_GEN_TRANSMIT_BUFFER_SPACE:
GenericULong = (ULONG)(1518);
DEBUGMSG(1, (TEXT("----> OID_GEN_TRANSMIT_BUFFER_SPACE\r\n")));
// while(1);
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
GenericULong = (ULONG)(1518);
DEBUGMSG(1, (TEXT("----> OID_GEN_RECEIVE_BUFFER_SPACE\r\n")));
// while(1);
break;
case OID_GEN_TRANSMIT_BLOCK_SIZE:
GenericULong = (ULONG)(1518);
DEBUGMSG(1, (TEXT("----> OID_GEN_TRANSMIT_BLOCK_SIZE\r\n")));
// while(1);
break;
case OID_GEN_RECEIVE_BLOCK_SIZE:
GenericULong = (ULONG)(1518);
DEBUGMSG(1, (TEXT("----> OID_GEN_RECEIVE_BLOCK_SIZE\r\n")));
// while(1);
break;
#ifdef CS8900
case OID_GEN_VENDOR_ID:
NdisMoveMemory(
(PVOID)&GenericULong,
Adapter->PermanentAddress,
3
);
GenericULong &= 0xFFFFFF00;
MoveSource = (PVOID)(&GenericULong);
MoveBytes = sizeof(GenericULong);
DEBUGMSG(1, (TEXT("----> OID_GEN_VENDER_ID\r\n")));
break;
case OID_GEN_VENDOR_DESCRIPTION:
MoveSource = (PVOID)"CS8900A Adapter";
MoveBytes = 21;
DEBUGMSG(1, (TEXT("----> OID_GEN_VENDOR_DESCRIPTION\r\n")));
break;
#else
case OID_GEN_VENDOR_ID:
NdisMoveMemory(
(PVOID)&GenericULong,
Adapter->PermanentAddress,
3
);
GenericULong &= 0xFFFFFF00;
GenericULong |= 0x01;
MoveSource = (PVOID)(&GenericULong);
MoveBytes = sizeof(GenericULong);
break;
case OID_GEN_VENDOR_DESCRIPTION:
MoveSource = (PVOID)"Novell 1000 Adapter.";
MoveBytes = 21;
break;
#endif
case OID_GEN_DRIVER_VERSION:
GenericUShort = ((USHORT)CS8900_NDIS_MAJOR_VERSION << 8) |
CS8900_NDIS_MINOR_VERSION;
MoveSource = (PVOID)(&GenericUShort);
MoveBytes = sizeof(GenericUShort);
break;
case OID_GEN_CURRENT_LOOKAHEAD:
GenericULong = (ULONG)(Adapter->MaxLookAhead);
DEBUGMSG(1, (TEXT("----> OID_GEN_CURRENT_LOOKAHEAD\r\n")));
break;
case OID_802_3_PERMANENT_ADDRESS:
CS8900_MOVE_MEM((PCHAR)GenericArray,
Adapter->PermanentAddress,
CS8900_LENGTH_OF_ADDRESS);
MoveSource = (PVOID)(GenericArray);
MoveBytes = sizeof(Adapter->PermanentAddress);
DEBUGMSG(1, (TEXT("----> OID_802_3_PERMANENT_ADDRESS\r\n")));
break;
case OID_802_3_CURRENT_ADDRESS:
CS8900_MOVE_MEM((PCHAR)GenericArray,
Adapter->StationAddress,
CS8900_LENGTH_OF_ADDRESS);
MoveSource = (PVOID)(GenericArray);
MoveBytes = sizeof(Adapter->StationAddress);
DEBUGMSG(1, (TEXT("----> OID_802_3_CURRENT_ADDRESS\r\n")));
break;
case OID_802_3_MAXIMUM_LIST_SIZE:
GenericULong = (ULONG) (Adapter->MulticastListMax);
DEBUGMSG(1, (TEXT("----> OID_802_3_MAXIMUM_LIST_SIZE\r\n")));
break;
case OID_GEN_XMIT_OK:
GenericULong = (UINT)(Adapter->FramesXmitGood);
DEBUGMSG(1, (TEXT("----> OID_GEN_XMIT_OK\r\n")));
break;
case OID_GEN_RCV_OK:
GenericULong = (UINT)(Adapter->FramesRcvGood);
DEBUGMSG(1, (TEXT("----> OID_GEN_RCV_OK\r\n")));
break;
case OID_GEN_XMIT_ERROR:
GenericULong = (UINT)(Adapter->FramesXmitBad);
DEBUGMSG(1, (TEXT("----> OID_GEN_XMIT_ERROR\r\n")));
break;
case OID_GEN_RCV_ERROR:
GenericULong = (UINT)(Adapter->CrcErrors);
DEBUGMSG(1, (TEXT("----> OID_GEN_RCV_ERROR\r\n")));
break;
case OID_GEN_RCV_NO_BUFFER:
GenericULong = (UINT)(Adapter->MissedPackets);
DEBUGMSG(1, (TEXT("----> OID_GEN_RCV_NO_BUFFER\r\n")));
break;
case OID_802_3_RCV_ERROR_ALIGNMENT:
GenericULong = (UINT)(Adapter->FrameAlignmentErrors);
DEBUGMSG(1, (TEXT("----> OID_802_3_RCV_ERROR_ALIGNMENT\r\n")));
break;
case OID_802_3_XMIT_ONE_COLLISION:
GenericULong = (UINT)(Adapter->FramesXmitOneCollision);
DEBUGMSG(1, (TEXT("----> OID_802_3_XMIT_ONE_COLLISION\r\n")));
break;
case OID_802_3_XMIT_MORE_COLLISIONS:
GenericULong = (UINT)(Adapter->FramesXmitManyCollisions);
break;
case OID_GEN_MEDIA_CONNECT_STATUS:
GenericULong = NdisMediaStateConnected;
break;
case OID_GEN_MAXIMUM_SEND_PACKETS:
GenericULong = 1;
break;
case OID_GEN_VENDOR_DRIVER_VERSION:
GenericULong = (DRIVER_MAJOR_VERSION << 16) | DRIVER_MINOR_VERSION;
break;
default:
StatusToReturn = NDIS_STATUS_INVALID_OID;
break;
}
if (StatusToReturn == NDIS_STATUS_SUCCESS) {
if (MoveBytes > BytesLeft) {
//
// Not enough room in InformationBuffer. Punt
//
*BytesNeeded = MoveBytes;
StatusToReturn = NDIS_STATUS_INVALID_LENGTH;
} else {
//
// Store result.
//
CS8900_MOVE_MEM(InfoBuffer, MoveSource, MoveBytes);
(*BytesWritten) += MoveBytes;
}
}
DEBUGMSG(1, (TEXT("-CS8900:CS8900QueryInformation\r\n")));
return StatusToReturn;
}
extern
NDIS_STATUS
CS8900SetInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded
)
/*++
Routine Description:
CS8900SetInformation handles a set operation for a
single OID.
Arguments:
MiniportAdapterContext - Context registered with the wrapper, really
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
--*/
{
//
// Pointer to the adapter structure.
//
PCS8900_ADAPTER Adapter = (PCS8900_ADAPTER)MiniportAdapterContext;
//
// General Algorithm:
//
// Verify length
// Switch(Request)
// Process Request
//
UINT BytesLeft = InformationBufferLength;
PUCHAR InfoBuffer = (PUCHAR)(InformationBuffer);
//
// Variables for a particular request
//
UINT OidLength;
//
// Variables for holding the new values to be used.
//
ULONG LookAhead;
ULONG Filter;
//
// Status of the operation.
//
NDIS_STATUS StatusToReturn = NDIS_STATUS_SUCCESS;
DEBUGMSG(1,
(TEXT("+CS8900:CS8900SetInformation\r\n")));
//
// Get Oid and Length of request
//
OidLength = BytesLeft;
switch (Oid) {
case OID_802_3_MULTICAST_LIST:
DEBUGMSG(1, (TEXT("OID_802_3_MULTICAST_LIST\r\n")));
//
// Verify length
//
if ((OidLength % CS8900_LENGTH_OF_ADDRESS) != 0)
{
StatusToReturn = NDIS_STATUS_INVALID_LENGTH;
*BytesRead = 0;
*BytesNeeded = 0;
break;
}
//
// Set the new list on the adapter.
//
NdisMoveMemory(Adapter->Addresses, InfoBuffer, OidLength);
break;
case OID_GEN_CURRENT_PACKET_FILTER:
DEBUGMSG(1, (TEXT("OID_GEN_CURRENT_PACKET_FILTER\r\n")));
//
// Verify length
//
if (OidLength != 4 ) {
StatusToReturn = NDIS_STATUS_INVALID_LENGTH;
*BytesRead = 0;
*BytesNeeded = 0;
break;
}
CS8900_MOVE_MEM(&Filter, InfoBuffer, 4);
//
// Verify bits
//
if (Filter & (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
)) {
StatusToReturn = NDIS_STATUS_NOT_SUPPORTED;
*BytesRead = 4;
*BytesNeeded = 0;
break;
}
break;
case OID_GEN_CURRENT_LOOKAHEAD:
DEBUGMSG(1, (TEXT("OID_GEN_CURRENT_LOOKAHEAD\r\n")));
//
// Verify length
//
if (OidLength != 4) {
StatusToReturn = NDIS_STATUS_INVALID_LENGTH;
*BytesRead = 0;
*BytesNeeded = 0;
break;
}
//
// Store the new value.
//
CS8900_MOVE_MEM(&LookAhead, InfoBuffer, 4);
if (LookAhead <= CS8900_MAX_LOOKAHEAD) {
Adapter->MaxLookAhead = LookAhead;
} else {
StatusToReturn = NDIS_STATUS_INVALID_LENGTH;
}
break;
default:
StatusToReturn = NDIS_STATUS_INVALID_OID;
*BytesRead = 0;
*BytesNeeded = 0;
break;
}
if (StatusToReturn == NDIS_STATUS_SUCCESS) {
*BytesRead = BytesLeft;
*BytesNeeded = 0;
}
DEBUGMSG(1, (TEXT("-CS8900:CS8900SetInformation\r\n")));
return(StatusToReturn);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -