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 + -
显示快捷键?