itek_init.c

来自「win9x下的一个网卡驱动程序。」· C语言 代码 · 共 1,398 行 · 第 1/3 页

C
1,398
字号
        }
		pTempOpen->NextOpen = pITekOpen->NextOpen;
	}
	//pITekOpen->NextOpen = NULL;

    NdisStatus = EthDeleteFilterOpenAdapter(
						pITekAdapter->FilterDB,
						pITekOpen->NdisFilterHandle,
						NULL);

	if(NdisStatus != NDIS_STATUS_SUCCESS) {
			pITekOpen->Closing = TRUE;
#ifdef	DEBUG
			Debug_Printf("ITEK:EthDeleteFilterOpenAdapter() pending...\n");
#endif
			return	(NDIS_STATUS_PENDING);
	}

	pITekOpen->ReferenceCount--;
	pITekAdapter->ReferenceCount--;

	if(pITekOpen->ReferenceCount == 0) {
#ifdef	DEBUG
		Debug_Printf("Free Open Instance(0x%x)\n", MacBindingHandle);
#endif
        ITekFreeMemory((PVOID)pITekOpen);
	}

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekCloseAdapter() Return\n");
#endif

	return	(NdisStatus);
}

///////////////////////////////////////////////////////////////////////////
//  ITekReset
//
NDIS_STATUS	NDIS_API
ITekReset(
    IN NDIS_HANDLE MacBindingHandle
    )
{
	NDIS_STATUS         NdisStatus;
	PITEK_OPEN		pITekOpen = (PITEK_OPEN)MacBindingHandle;
	PITEK_ADAPTER	pITekAdapter;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekReset(MacBindingHandle=0x%x) Entry\n", MacBindingHandle);
#endif

	NdisStatus = NDIS_STATUS_FAILURE;
	pITekAdapter = pITekOpen->pITekAdapter;

	if(pITekAdapter->NicStatus == NIC_RESETTING) {
#ifdef	DEBUG
		Debug_Printf("Resetting already progressing\n");
#endif
		NdisStatus = NDIS_STATUS_RESET_IN_PROGRESS;
		
	} else {
		//???
	}

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekReset() Return\n");
#endif

	return	(NdisStatus);
}


///////////////////////////////////////////////////////////////////////////
//  ITekRequest
//
NDIS_STATUS	NDIS_API
ITekRequest(
    IN NDIS_HANDLE MacBindingHandle,
    IN PNDIS_REQUEST NdisRequest
    )
{
	NDIS_STATUS		NdisStatus;
	PITEK_OPEN		pITekOpen = (PITEK_OPEN)MacBindingHandle;
	PITEK_ADAPTER	pITekAdapter;
	ULONG			BytesWritten, BytesRead, BytesNeeded;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekRequest(MacBindingHandle=0x%x) Entry\n", MacBindingHandle);
#endif

	pITekAdapter = pITekOpen->pITekAdapter;
	BytesWritten = 0;
	BytesRead = 0;
	BytesNeeded = 0;

	if(NdisRequest->RequestType == NdisRequestQueryInformation) {
		NdisStatus = ITekQueryInformation(
						pITekAdapter,
						pITekOpen,
						NdisRequest->DATA.QUERY_INFORMATION.Oid,
						NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
						NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
						&BytesWritten,
						&BytesNeeded);
		
		NdisRequest->DATA.QUERY_INFORMATION.BytesWritten = (UINT)BytesWritten;
		NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded = (UINT)BytesNeeded;
    } else if (NdisRequest->RequestType == NdisRequestSetInformation) {
		NdisStatus = ITekSetInformation(
						pITekAdapter,
						pITekOpen,
						NdisRequest,
						NdisRequest->DATA.SET_INFORMATION.Oid,
						NdisRequest->DATA.SET_INFORMATION.InformationBuffer,
						NdisRequest->DATA.SET_INFORMATION.InformationBufferLength,
						&BytesRead,
						&BytesNeeded);
		
		NdisRequest->DATA.SET_INFORMATION.BytesRead = (UINT)BytesRead;
		NdisRequest->DATA.SET_INFORMATION.BytesNeeded = (UINT)BytesNeeded;
    } else {
		NdisStatus = NDIS_STATUS_NOT_RECOGNIZED;
    }

	//NdisCompleteRequest(
	//	pITekOpen->NdisBindingContext,
	//	NdisRequest,
	//	NDIS_STATUS_SUCCESS
	//	);
 
#ifdef	DEBUG
	Debug_Printf("ITEK:ITekRequest() Return\n");
#endif

	return	(NdisStatus);
}

///////////////////////////////////////////////////////////////////////////
//  ITekQueryGlobalStatistics
//
NDIS_STATUS	NDIS_API
ITekQueryGlobalStatistics(
    IN NDIS_HANDLE MacBindingHandle,
    IN PNDIS_REQUEST NdisRequest
    )
{
	NDIS_STATUS		NdisStatus;
	PITEK_OPEN		pITekOpen = (PITEK_OPEN)MacBindingHandle;
	PITEK_ADAPTER	pITekAdapter;
	ULONG			BytesWritten, BytesNeeded;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekQueryGlobalStatistics() Entry\n");
#endif

	pITekAdapter = pITekOpen->pITekAdapter;
	BytesWritten = 0;
	BytesNeeded = 0;

	NdisStatus = NDIS_STATUS_FAILURE;
	NdisStatus = ITekQueryInformation(
					pITekAdapter,
					pITekOpen,
					NdisRequest->DATA.QUERY_INFORMATION.Oid,
					NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
					NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
					&BytesWritten,
					&BytesNeeded);
		
	NdisRequest->DATA.QUERY_INFORMATION.BytesWritten = (UINT)BytesWritten;
	NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded = (UINT)BytesNeeded;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekQueryGlobalStatistics() Return(0x%x)\n",
					NdisStatus);
#endif

	return	(NdisStatus);
}

///////////////////////////////////////////////////////////////////////////
//  ITekUnload
//
VOID	NDIS_API
ITekUnload(
    IN NDIS_HANDLE MacMacContext
    )
{
	NDIS_STATUS		NdisStatus;
	PDRIVER_BLOCK	pMacContext = (PDRIVER_BLOCK)MacMacContext;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekUnload(MacMacContext=0x%x) Entry\n",
					MacMacContext);
#endif

	NdisDeregisterMac(
		&NdisStatus,
		pMacContext->NdisMacHandle
		);

	NdisTerminateWrapper(
		pMacContext->NdisWrapperHandle,
		NULL
		);

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekUnload() Return\n");
#endif
	return;
}

///////////////////////////////////////////////////////////////////////////
//  ITekTransferData
//
NDIS_STATUS	NDIS_API
ITekTransferData(
    IN NDIS_HANDLE MacBindingHandle,
    IN NDIS_HANDLE MacReceiveContext,
    IN UINT ByteOffset,
    IN UINT BytesToTransfer,
    OUT PNDIS_PACKET Packet,
    OUT PUINT BytesTransferred
    )
{
	NDIS_STATUS         NdisStatus;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekTransferData() Entry\n");
#endif

	NdisStatus = NDIS_STATUS_FAILURE;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekTransferData() Return\n");
#endif

	return	(NdisStatus);
}

///////////////////////////////////////////////////////////////////////////
//  ITekSend
//
NDIS_STATUS	NDIS_API
ITekSend(
    IN NDIS_HANDLE MacBindingHandle,
    IN PNDIS_PACKET Packet
    )
{
	NDIS_STATUS		NdisStatus;
	PITEK_OPEN		pITekOpen = (PITEK_OPEN)MacBindingHandle;
	PITEK_ADAPTER	pITekAdapter;
	PNDIS_BUFFER	pNdisBuffer;
	UINT			PhysicalBufferCount;
	UINT			BufferCount, BufferLength;
	UINT			TotalPacketLength;
	PCHAR			pHdrData;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekSend(MacBindingHandle=0x%x) Entry\n", MacBindingHandle);
#endif

	NdisStatus = NDIS_STATUS_SUCCESS;
	pITekAdapter = pITekOpen->pITekAdapter;

	if(pITekOpen->Closing == TRUE) {
#ifdef	DEBUG
		Debug_Printf("ITEK:Closing...\n");
#endif
		return	(NDIS_STATUS_CLOSING);
	}

	NdisQueryPacket(
		Packet,
		&PhysicalBufferCount,
		&BufferCount,
		&pNdisBuffer,
		&TotalPacketLength);

	NdisQueryBuffer(
		pNdisBuffer,
		(PVOID *)&pHdrData,
		&BufferLength);

	if(BufferLength < ITEK_PDU_HDRSIZE) {
		NdisStatus = NDIS_STATUS_FAILURE;
		return	(NdisStatus);
	}

	ITEK_RESERVED(Packet)->pITekOpen = pITekOpen;

	if(pITekAdapter->pHeadPacket == NULL) {
		pITekAdapter->pHeadPacket = Packet;
	} else {
		ITEK_RESERVED(pITekAdapter->pTailPacket)->pNextPacket = Packet;
	}

	ITEK_RESERVED(Packet)->pNextPacket = NULL;
	pITekAdapter->pTailPacket = Packet;

	//ITekNextSend(pITekAdapter);

        //NdisStatus = NDIS_STATUS_PENDING;
        NdisStatus = NDIS_STATUS_SUCCESS;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekSend() return\n");
#endif

	return  (NdisStatus);
}


///////////////////////////////////////////////////////////////////////////
//  ITekQueryInformation
//
NDIS_STATUS NDIS_API 
ITekQueryInformation(
		IN  NDIS_HANDLE ITekAdapterContext,
		IN	NDIS_HANDLE	ITekOpenContext,
		IN  NDIS_OID    Oid,
		IN  PVOID       InformationBuffer,
		IN  ULONG       InformationBufferLength,
		OUT PULONG      BytesWritten,
		OUT PULONG      BytesNeeded
		)
{
	PITEK_ADAPTER      pITekAdapter = (PITEK_ADAPTER)ITekAdapterContext;
	PITEK_OPEN			pITekOpen = (PITEK_OPEN)ITekOpenContext;
	NDIS_STATUS			NdisStatus;
	ULONG				InfoSize;
	ULONG				InfoULONG;
	USHORT				InfoUSHORT;
	PVOID				InfoSource;
	NDIS_HARDWARE_STATUS	NicStatus;
	NDIS_MEDIUM			NicMedium;

	InfoSource = (PVOID)&InfoULONG;
	InfoSize = 4;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekQueryInformation() Entry\n");
#endif

	NdisStatus = NDIS_STATUS_NOT_SUPPORTED;

	switch(Oid) {
	//General Operational Charateristics
	case	OID_GEN_SUPPORTED_LIST:
			InfoSource = (PVOID)ITEKSupportedOids;
			InfoSize = sizeof(ITEKSupportedOids);
			NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_SUPPORTED_LIST=size(%u bytes)\n", InfoSize);
#endif
			break;
	case	OID_GEN_HARDWARE_STATUS:
			if(pITekAdapter->NicStatus == NIC_DISABLED) {
				//NicStatus = NdisHardwareStatusNotReady;
				NicStatus = NdisHardwareStatusInitializing;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_HARDWARE_STATUS=Initializing\n");
#endif
			} else {
				NicStatus = NdisHardwareStatusReady;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_HARDWARE_STATUS=Ready\n");
#endif
			}
			InfoSource = (PVOID)&NicStatus;
			InfoSize = sizeof(NDIS_HARDWARE_STATUS);
			NdisStatus = NDIS_STATUS_SUCCESS;
			break;
	case	OID_GEN_MEDIA_SUPPORTED:
	case	OID_GEN_MEDIA_IN_USE:
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_MEDIA_SUPPORTED or OID_GEN_MEDIA_IN_USE=802.3(Ethernet)\n");
#endif
			NicMedium = NdisMedium802_3;
			InfoSource = (PVOID)&NicMedium;
			InfoSize = sizeof(NDIS_MEDIUM);
			NdisStatus = NDIS_STATUS_SUCCESS;
			break;
	case	OID_GEN_MAXIMUM_LOOKAHEAD:
			InfoULONG = ITEK_MAX_LOOKAHEAD;
			NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_MAXIMUM_LOOKAHEAD=%u\n",InfoULONG);
#endif
			break;
	case	OID_GEN_MAXIMUM_FRAME_SIZE:
			InfoULONG = ITEK_SDU_MAXSIZE;	// not equal to Ethernet MTU size (1514-14)
			NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_MAXIMUM_FRAME_SIZE=%u\n", InfoULONG);
#endif
			break;
	case	OID_GEN_LINK_SPEED:
			InfoULONG = 100000;	// 25Mbps
			NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_LINK_SPEED=%u bps\n", InfoULONG*100);
#endif
			break;
	case	OID_GEN_TRANSMIT_BUFFER_SPACE:
			InfoULONG = ITEK_TX_MAXSIZE;
			NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_TRANSMIT_BUFFER_SPACE=%u bytes\n", InfoULONG);
#endif
			break;
	case	OID_GEN_RECEIVE_BUFFER_SPACE:
			InfoULONG = 1520;
			NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_RECEIVE_BUFFER_SPACE=%u\n", InfoULONG);
#endif
			break;
	case	OID_GEN_TRANSMIT_BLOCK_SIZE:
			InfoULONG = ITEK_TX_MINSIZE;
			NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_TRANSMIT_BLOCK_SIZE=%u bytes(Min.),%u bytes(Max.)\n",InfoULONG, ITEK_TX_MAXSIZE);
#endif
			break;
	case	OID_GEN_RECEIVE_BLOCK_SIZE:
			InfoULONG = 1520;
			NdisStatus = NDIS_STATUS_SUCCESS;
			//InfoULONG =	ITEK_SDU_MAXSIZE;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_RECEIVE_BLOCK_SIZE=%u\n", InfoULONG);
#endif
			break;
	case	OID_GEN_VENDOR_ID:
			InfoULONG = ITEK_VENDOR_ID;
			NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_VENDOR_ID=0x%x\n", InfoULONG);
#endif
			break;
	case	OID_GEN_VENDOR_DESCRIPTION:
			InfoSource = (PVOID)ITEK_DESCRIPTION;
			InfoSize = strlen(ITEK_DESCRIPTION);
			NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_VENDOR_DESCRIPTION=%s(%u)\n", ITEK_DESCRIPTION, InfoSize);
#endif
			break;
//	case	OID_GEN_VENDOR_DRIVER_VERSION:
//#ifdef	DEBUG
//			Debug_Printf("Query OID_GEN_VENDOR_DRIVER_VERSION\n");
//#endif
//			break;
	case	OID_GEN_CURRENT_PACKET_FILTER:
			InfoULONG = pITekOpen->PacketFilter;
			NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_CURRENT_PACKET_FILTER=0x%x\n",InfoULONG);
#endif
			break;
	case	OID_GEN_CURRENT_LOOKAHEAD:
			InfoULONG = ITEK_MAX_LOOKAHEAD;
			NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef	DEBUG
			Debug_Printf("Query OID_GEN_CURRENT_LOOKAHEAD=%u bytes\n", InfoULONG);
#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?