itek_init.c
来自「win9x下的一个网卡驱动程序。」· C语言 代码 · 共 1,398 行 · 第 1/3 页
C
1,398 行
break;
case OID_GEN_DRIVER_VERSION:
InfoUSHORT = (ITEK_DRIVER_MAJOR << 8) | ITEK_DRIVER_MINOR;
InfoSource = (PVOID)&InfoUSHORT;
InfoSize = sizeof(InfoUSHORT);
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_DRIVER_VERSION=0x%x\n", InfoUSHORT);
#endif
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_MAXIMUM_TOTAL_SIZE, not yet supported!\n");
#endif
break;
case OID_GEN_PROTOCOL_OPTIONS:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_PROTOCOL_OPTIONS, not yet supported!\n");
#endif
break;
case OID_GEN_MAC_OPTIONS:
InfoULONG = (ULONG)(NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |
NDIS_MAC_OPTION_RECEIVE_SERIALIZED |
NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |
NDIS_MAC_OPTION_NO_LOOPBACK );
//NDIS_MAC_OPTION_FULL_DUPLEX);
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_MAC_OPTIONS =%u\n", InfoULONG);
#endif
break;
//General Statistics Charateristics
case OID_GEN_XMIT_OK:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_XMIT_OK, not yet supported!\n");
#endif
break;
case OID_GEN_RCV_OK:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_RCV_OK, not yet supported!\n");
#endif
break;
case OID_GEN_XMIT_ERROR:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_XMIT_ERROR, not yet supported!\n");
#endif
break;
case OID_GEN_RCV_ERROR:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_RCV_ERROR, not yet supported!\n");
#endif
break;
case OID_GEN_RCV_NO_BUFFER:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_RCV_NO_BUFFER, not yet supported!\n");
#endif
break;
case OID_GEN_DIRECTED_BYTES_XMIT:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_DIRECTED_BYTES_XMIT, not yet supported!\n");
#endif
break;
case OID_GEN_DIRECTED_FRAMES_XMIT:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_DIRECTED_FRAMES_XMIT, not yet supported!\n");
#endif
break;
case OID_GEN_MULTICAST_BYTES_XMIT:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_MULTICAST_BYTES_XMIT, not yet supported!\n");
#endif
break;
case OID_GEN_MULTICAST_FRAMES_XMIT:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_MULTICAST_FRAMES_XMIT, not yet supported!\n");
#endif
break;
case OID_GEN_BROADCAST_BYTES_XMIT:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_BROADCAST_BYTES_XMIT, not yet supported!\n");
#endif
break;
case OID_GEN_BROADCAST_FRAMES_XMIT:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_BROADCAST_FRAMES_XMIT, not yet supported!\n");
#endif
break;
case OID_GEN_DIRECTED_BYTES_RCV:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_DIRECTED_BYTES_RCV, not yet supported!\n");
#endif
break;
case OID_GEN_DIRECTED_FRAMES_RCV:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_DIRECTED_FRAMES_RCV, not yet supported!\n");
#endif
break;
case OID_GEN_MULTICAST_BYTES_RCV:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_MULTICAST_BYTES_RCV, not yet supported!\n");
#endif
break;
case OID_GEN_MULTICAST_FRAMES_RCV:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_MULTICAST_FRAMES_RCV, not yet supported!\n");
#endif
break;
case OID_GEN_BROADCAST_BYTES_RCV:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_BROADCAST_BYTES_RCV, not yet supported!\n");
#endif
break;
case OID_GEN_BROADCAST_FRAMES_RCV:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_BROADCAST_FRAMES_RCV, not yet supported!\n");
#endif
break;
case OID_GEN_RCV_CRC_ERROR:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_RCV_CRC_ERROR, not yet supported!\n");
#endif
break;
case OID_GEN_TRANSMIT_QUEUE_LENGTH:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_TRANSMIT_QUEUE_LENGTH, not yet supported!\n");
#endif
break;
//Ethernet Operational Charateristics
case OID_802_3_PERMANENT_ADDRESS:
InfoSource = (PVOID)pITekAdapter->PermanentAddress;
InfoSize = sizeof(pITekAdapter->PermanentAddress);
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_802_3_PERMANENT_ADDRESS=%x:%x:%x:%x:%x:%x\n", (UCHAR)pITekAdapter->PermanentAddress[0]
, (UCHAR)pITekAdapter->PermanentAddress[1], (UCHAR)pITekAdapter->PermanentAddress[2]
, (UCHAR)pITekAdapter->PermanentAddress[3], (UCHAR)pITekAdapter->PermanentAddress[4]
, (UCHAR)pITekAdapter->PermanentAddress[5]);
#endif
break;
case OID_802_3_CURRENT_ADDRESS:
InfoSource = (PVOID)pITekAdapter->CurrentAddress;
InfoSize = sizeof(pITekAdapter->CurrentAddress);
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_802_3_CURRENT_ADDRESS=%x:%x:%x:%x:%x:%x\n", (UCHAR)pITekAdapter->CurrentAddress[0]
, (UCHAR)pITekAdapter->CurrentAddress[1], (UCHAR)pITekAdapter->CurrentAddress[2]
, (UCHAR)pITekAdapter->CurrentAddress[3], (UCHAR)pITekAdapter->CurrentAddress[4]
, (UCHAR)pITekAdapter->CurrentAddress[5]);
#endif
break;
case OID_802_3_MAXIMUM_LIST_SIZE:
InfoULONG = pITekAdapter->MulticastListMax;
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_802_3_MAXIMUM_LIST_SIZE=%u\n", InfoULONG);
#endif
break;
case OID_802_3_MULTICAST_LIST:
#ifdef DEBUG
Debug_Printf("Query OID_802_3_MULTICAST_LIST, not yet supported\n");
#endif
break;
//Ethernet Statistics
case OID_802_3_RCV_ERROR_ALIGNMENT:
#ifdef DEBUG
Debug_Printf("Query OID_802_3_RCV_ERROR_ALIGNMENT, not yet supported\n");
#endif
break;
case OID_802_3_XMIT_ONE_COLLISION:
#ifdef DEBUG
Debug_Printf("Query OID_802_3_XMIT_ONE_COLLISION, not yet supported\n");
#endif
break;
case OID_802_3_XMIT_MORE_COLLISIONS:
#ifdef DEBUG
Debug_Printf("Query OID_802_3_XMIT_MORE_COLLISIONS, not yet supported\n");
#endif
break;
case OID_802_3_XMIT_DEFERRED:
#ifdef DEBUG
Debug_Printf("Query OID_802_3_XMIT_DEFERRED, not yet supported\n");
#endif
break;
case OID_802_3_XMIT_MAX_COLLISIONS:
#ifdef DEBUG
Debug_Printf("Query OID_802_3_XMIT_MAX_COLLISIONS, not yet supported\n");
#endif
break;
case OID_802_3_RCV_OVERRUN:
#ifdef DEBUG
Debug_Printf("Query OID_802_3_RCV_OVERRUN, not yet supported\n");
#endif
break;
case OID_802_3_XMIT_UNDERRUN:
#ifdef DEBUG
Debug_Printf("Query OID_802_3_XMIT_UNDERRUN, not yet supported\n");
#endif
break;
case OID_802_3_XMIT_HEARTBEAT_FAILURE:
#ifdef DEBUG
Debug_Printf("Query OID_802_3_XMIT_HEARTBEAT_FAILURE, not yet supported\n");
#endif
break;
case OID_802_3_XMIT_TIMES_CRS_LOST:
#ifdef DEBUG
Debug_Printf("Query OID_802_3_XMIT_TIMES_CRS_LOST, not yet supported\n");
#endif
break;
case OID_802_3_XMIT_LATE_COLLISIONS:
#ifdef DEBUG
Debug_Printf("Query OID_802_3_XMIT_LATE_COLLISIONS, not yet supported\n");
#endif
break;
default:
#ifdef DEBUG
Debug_Printf("Qeury Unknown\n");
#endif
NdisStatus = NDIS_STATUS_INVALID_OID;
break;
} //switch(Oid)
if(NdisStatus == NDIS_STATUS_SUCCESS){
if (InfoSize > InformationBufferLength){
*BytesNeeded = InfoSize;
NdisStatus = NDIS_STATUS_INVALID_LENGTH;
} else {
memcpy(InformationBuffer, InfoSource, InfoSize);
(*BytesWritten) += InfoSize;
}
}
#ifdef DEBUG
Debug_Printf("ITEK:ITekQueryInformation() Return with %x\n",NdisStatus);
#endif
return (NdisStatus);
}
///////////////////////////////////////////////////////////////////////////
// ITekSetInformation
//
NDIS_STATUS NDIS_API
ITekSetInformation(
IN NDIS_HANDLE ITekAdapterContext,
IN NDIS_HANDLE ITekOpenContext,
IN PNDIS_REQUEST NdisRequest,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded
)
{
PITEK_ADAPTER pITekAdapter = (PITEK_ADAPTER)ITekAdapterContext;
PITEK_OPEN pITekOpen = (PITEK_OPEN)ITekOpenContext;
NDIS_STATUS NdisStatus = NDIS_STATUS_NOT_SUPPORTED;
ULONG PacketFilter;
PUCHAR InfoSource;
#ifdef DEBUG
Debug_Printf("ITEK:ITekSetInformation() Entry\n");
#endif
InfoSource = (PUCHAR)InformationBuffer;
//we don't need these objects at all.
switch(Oid) {
// General Operational Charateristics
case OID_GEN_CURRENT_PACKET_FILTER:
if(InformationBufferLength != 4) {
NdisStatus = NDIS_STATUS_INVALID_LENGTH;
*BytesRead = 0;
*BytesNeeded = 0;
#ifdef DEBUG
Debug_Printf("Set OID_GEN_CURRENT_PACKET_FILTER - INVALID_LENGTH\n");
#endif
break;
}
PacketFilter = *(PULONG)InformationBuffer;
if(PacketFilter &(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)) {
NdisStatus = NDIS_STATUS_NOT_ACCEPTED;
*BytesRead = 4;
*BytesNeeded = 0;
#ifdef DEBUG
Debug_Printf("Set OID_GEN_CURRENT_PACKET_FILTER - NOT_ACCEPTED\n");
#endif
break;
} else if(PacketFilter > 0x8000) {
NdisStatus = NDIS_STATUS_INVALID_DATA;
*BytesRead = 4;
*BytesNeeded = 0;
#ifdef DEBUG
Debug_Printf("Set OID_GEN_CURRENT_PACKET_FILTER - INVALID_DATA\n");
#endif
break;
}
NdisAcquireSpinLock(&pITekAdapter->Lock);
NdisStatus = EthFilterAdjust(
pITekAdapter->FilterDB,
pITekOpen->NdisFilterHandle,
NdisRequest,
PacketFilter,
TRUE);
NdisReleaseSpinLock(&pITekAdapter->Lock);
pITekOpen->PacketFilter = PacketFilter;
#ifdef DEBUG
Debug_Printf("Set OID_GEN_CURRENT_PACKET_FILTER=0x%x with status=0x%x\n",
PacketFilter, NdisStatus);
#endif
break;
case OID_GEN_CURRENT_LOOKAHEAD:
//NdisStatus = NDIS_STATUS_NOT_ACCEPTED;
NdisStatus = NDIS_STATUS_SUCCESS;
pITekOpen->MaxLookAhead = *(PULONG)InformationBuffer;
#ifdef DEBUG
Debug_Printf("Set OID_GEN_CURRENT_LOOKAHEAD(%u), accepted\n",
pITekOpen->MaxLookAhead);
#endif
break;
case OID_GEN_PROTOCOL_OPTIONS:
NdisStatus = NDIS_STATUS_NOT_ACCEPTED;
#ifdef DEBUG
Debug_Printf("Set OID_GEN_PROTOCOL_OPTIONS, not accepted\n");
#endif
break;
// Ethernet Operational Characteristics
case OID_802_3_MULTICAST_LIST:
//NdisStatus = NDIS_STATUS_NOT_ACCEPTED;
NdisStatus = NDIS_STATUS_SUCCESS;
if((InformationBufferLength % ETH_LENGTH_OF_ADDRESS) != 0) {
NdisStatus = NDIS_STATUS_INVALID_LENGTH;
*BytesRead = 0;
*BytesNeeded = 0;
#ifdef DEBUG
Debug_Printf("Set OID_802_3_MULTICAST_LIST-INVALID LENGTH(%u)\n",
InformationBufferLength);
#endif
} else {
NdisAcquireSpinLock(&pITekAdapter->Lock);
NdisStatus = EthChangeFilterAddresses(
pITekAdapter->FilterDB,
pITekOpen->NdisFilterHandle,
NdisRequest,
(UINT)(InformationBufferLength/ETH_LENGTH_OF_ADDRESS),
InformationBuffer,
TRUE);
NdisReleaseSpinLock(&pITekAdapter->Lock);
#ifdef DEBUG
Debug_Printf("Set OID_802_3_MULTICAST_LIST(%u Addresses), accepted\n",
(UINT)(InformationBufferLength/ETH_LENGTH_OF_ADDRESS));
#endif
}
break;
default:
#ifdef DEBUG
Debug_Printf("Set Unknwon Oid\n");
#endif
NdisStatus = NDIS_STATUS_INVALID_OID;
*BytesRead = 0;
*BytesNeeded = 0;
break;
} // switch(Oid)
if(NdisStatus == NDIS_STATUS_SUCCESS) {
*BytesRead = InformationBufferLength;
*BytesNeeded = 0;
}
#ifdef DEBUG
Debug_Printf("ITEK:ITekSetInformation() Return with 0x%x\n",NdisStatus);
#endif
return (NdisStatus);
}
NDIS_STATUS NDIS_API
ITekAddressChangeAction(
IN UINT OldFilterCount,
IN CHAR OldAddresses[][ETH_LENGTH_OF_ADDRESS],
IN UINT NewFilterCount,
IN CHAR NewAddresses[][ETH_LENGTH_OF_ADDRESS],
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_REQUEST NdisRequest,
IN BOOLEAN Set
)
{
NDIS_STATUS NdisStatus;
#ifdef DEBUG
Debug_Printf("ITEK:ITekAddressChangeAction(MacBindingHandle=0x%x) Entry\n",
MacBindingHandle);
#endif
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("ITEK:ITekAddressChangeAction() Return\n");
#endif
return (NdisStatus);
}
NDIS_STATUS NDIS_API
ITekFilterChangeAction(
IN UINT OldFilterClasses,
IN UINT NewFilterClasses,
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_REQUEST NdisRequest,
IN BOOLEAN Set
)
{
NDIS_STATUS NdisStatus;
#ifdef DEBUG
Debug_Printf("ITEK:ITekFilterChangeAction(OldFilterClasses=0x%x, NewFilterClasses=0x%x, MacBindingHandle=0x%x) Entry\n",
OldFilterClasses, NewFilterClasses, MacBindingHandle);
#endif
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("ITEK:ITekFilterChangeAction() Return\n");
#endif
return (NdisStatus);
}
VOID NDIS_API
ITekCloseAction(
IN NDIS_HANDLE MacBindingHandle
)
{
PITEK_OPEN pITekOpen = (PITEK_OPEN)MacBindingHandle;
#ifdef DEBUG
Debug_Printf("ITEK:ITekCloseAction(MacBindingHandle=0x%x) Entry\n",
MacBindingHandle);
#endif
pITekOpen->ReferenceCount--;
#ifdef DEBUG
Debug_Printf("pITekOpen->ReferenceCount=%u\n", pITekOpen->ReferenceCount);
#endif
#ifdef DEBUG
Debug_Printf("ITEK:ITekCloseAction Return\n");
#endif
return;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?