⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver.cpp

📁 网络控制器dm9000的wince5.0驱动源码-network controller dm9000 the driving source wince5.0
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	NDIS_STATUS NIC_DRIVER_OBJECT::DriverSetInformation(	IN NDIS_OID		Oid,	IN PVOID		InfoBuffer, 	IN ULONG		InfoBufferLength, 	OUT PULONG		BytesRead,	OUT PULONG		BytesNeeded){	NDIS_STATUS	status = NDIS_STATUS_SUCCESS;	// pass to lower object, to see if it can handle this request,	// if it can, return TRUE and set status.	if(m_pLower->DeviceSetInformation(		&status,		Oid,		InfoBuffer,		InfoBufferLength,		BytesRead,		BytesNeeded)) return status;	switch (Oid)	{		HANDLE_SET( OID_GEN_CURRENT_PACKET_FILTER,sizeof(U32));				case OID_802_3_MULTICAST_LIST:			NdisMoveMemory(				&m_pLower->m_szMulticastList[0][0],				InfoBuffer,				InfoBufferLength);			m_pLower->m_nMulticasts = 				InfoBufferLength / ETH_ADDRESS_LENGTH;			m_pLower->DeviceOnSetupFilter(				m_pLower->m_szCurrentSettings[SID_GEN_CURRENT_PACKET_FILTER]				| NDIS_PACKET_TYPE_MULTICAST);			break;		// don't care oids		case OID_GEN_CURRENT_LOOKAHEAD:			break;		case OID_GEN_NETWORK_LAYER_ADDRESSES:		default:			status = NDIS_STATUS_INVALID_OID;			} // of switch Oid		return status;}void	NIC_DRIVER_OBJECT::DriverEnableInterrupt(void){	m_pLower->DeviceEnableInterrupt();}void	NIC_DRIVER_OBJECT::DriverDisableInterrupt(void){	m_pLower->DeviceDisableInterrupt();}BOOL	NIC_DRIVER_OBJECT::DriverCheckForHang(void){	if(m_bSystemHang) return TRUE;	return m_pLower->DeviceCheckForHang();}VOID	NIC_DRIVER_OBJECT::DriverHalt(void){	m_pLower->DeviceHalt();}NDIS_STATUS NIC_DRIVER_OBJECT::DriverReset(	OUT PBOOLEAN	pbAddressingReset){	// Reset activities	// 1. Abort all current tx and rx.	// 2. Cleanup waiting and standby queues.	// 3. Re-init tx and rx descriptors.	// 4. Softreset MAC, PHY and set registers angain.	*pbAddressingReset = TRUE;#ifndef	IMPL_RESET	return	NDIS_STATUS_SUCCESS;#endif	m_pLower->DeviceReset();	DriverStart();	m_bSystemHang = 0;	m_bOutofResources = 0;	return NDIS_STATUS_SUCCESS;}NDIS_STATUS	NIC_DRIVER_OBJECT::DriverSend(	IN PNDIS_PACKET	pPacket,	IN UINT			uFlags){#if !defined(IMPL_TX_QUEUE)		if(!m_pLower->DeviceQueryTxResources())		return NDIS_STATUS_RESOURCES;	#endif	PCQUEUE_GEN_HEADER	pobj;		if(!(pobj = m_TQueue.Dequeue())) 	{		m_bOutofResources = 1;		DEBUG_PRINT((TEXT("<DM9:m_bOutofResources\n")));		return NDIS_STATUS_RESOURCES;	}		PNDIS_BUFFER	pndisFirstBuffer;	UINT			uPhysicalBufferCount;	UINT			uBufferCount;	UINT			uTotalPacketLength;	PNDIS_BUFFER	pndisCurrBuffer;	PU8		pcurr = (PU8)CQueueGetUserPointer(pobj);	PVOID	ptrBuffer;	UINT	nBuffer;	U32		idx,check;	NdisQueryPacket(		pPacket, 		&uPhysicalBufferCount, 		&uBufferCount,		&pndisFirstBuffer,        &uTotalPacketLength);    if (uTotalPacketLength > ETH_MAX_FRAME_SIZE) {        return NDIS_STATUS_FAILURE;    }	uPhysicalBufferCount &= 0xFFFF;	for(idx=0,check=0,pndisCurrBuffer=pndisFirstBuffer;		idx < uBufferCount;		idx++, pndisCurrBuffer = pndisCurrBuffer->Next)	{		NdisQueryBuffer(			pndisCurrBuffer,			&ptrBuffer,			&nBuffer);		if(!nBuffer) continue;				NdisMoveMemory(pcurr, ptrBuffer, nBuffer);		pcurr += nBuffer;		check += nBuffer;        	} // of for gathering buffer	if(uTotalPacketLength != check) return NDIS_STATUS_FAILURE;	pobj->pPacket = (PVOID)pPacket;	pobj->uFlags = uFlags;	pobj->nLength = uTotalPacketLength;		m_pLower->DeviceSend(pobj);	#ifdef	IMPL_SEND_INDICATION	return NDIS_STATUS_PENDING;#else	return NDIS_STATUS_SUCCESS;#endif}void	NIC_DRIVER_OBJECT::DriverReceiveIndication(	int		nCurr,	PVOID	pVoid,	int		nLength){	NdisMEthIndicateReceive(		m_NdisHandle,		(PNDIS_HANDLE)nCurr,		(char*)pVoid,		ETH_HEADER_SIZE,		((char*)pVoid + ETH_HEADER_SIZE),		nLength - ETH_HEADER_SIZE,		nLength - ETH_HEADER_SIZE);		NdisMEthIndicateReceiveComplete(m_NdisHandle);	return;}	void	NIC_DRIVER_OBJECT::DriverSendCompleted(	PCQUEUE_GEN_HEADER	pObject){	m_TQueue.Enqueue(pObject);	#ifdef	IMPL_SEND_INDICATION	NdisMSendResourcesAvailable(m_NdisHandle);	NdisMSendComplete(				m_NdisHandle,				(PNDIS_PACKET)(pObject->pPacket),				NDIS_STATUS_SUCCESS);#endif}	/******************************************************************************************** * * Trunk Functions * ********************************************************************************************/#ifdef	__cplusplusextern "C" {	// miniport driver trunk functions#endifNDIS_STATUS MiniportInitialize(	OUT PNDIS_STATUS OpenErrorStatus,	OUT PUINT SelectedMediaIndex, 	IN PNDIS_MEDIUM MediaArray, 	IN UINT MediaArraySize,    IN NDIS_HANDLE MiniportHandle, 	IN NDIS_HANDLE WrapperConfigHandle){		PUTS(("<DM9:++MiniportIntialize>\n"));	NIC_DRIVER_OBJECT	*pnic;	if(!(pnic = new NIC_DRIVER_OBJECT(		MiniportHandle,WrapperConfigHandle)))			return	NDIS_STATUS_FAILURE;	C_Exception	*pexp;	TRY	{		pnic->EDriverInitialize(			OpenErrorStatus,			SelectedMediaIndex, 			MediaArray, 			MediaArraySize);		pnic->DriverStart();			FI;	}	CATCH(pexp)	{		pexp->PrintErrorMessage();		CLEAN(pexp);		delete pnic;		return NDIS_STATUS_FAILURE;	}		PUTS(("<DM9:--MiniportInitialize>\n"));	return NDIS_STATUS_SUCCESS;}void MiniportISRHandler(		OUT PBOOLEAN InterruptRecognized, 		OUT PBOOLEAN QueueInterrupt,		IN  NDIS_HANDLE MiniportContext){	((NIC_DRIVER_OBJECT*)MiniportContext)->DriverIsr(		InterruptRecognized,		QueueInterrupt);}VOID	MiniportInterruptHandler(	IN NDIS_HANDLE  MiniportContext){	((NIC_DRIVER_OBJECT*)MiniportContext)->DriverInterruptHandler();}NDIS_STATUS MiniportQueryInformation(	IN NDIS_HANDLE	MiniportContext,	IN NDIS_OID		Oid,	IN PVOID		InfoBuffer, 	IN ULONG		InfoBufferLength, 	OUT PULONG		BytesWritten,	OUT PULONG		BytesNeeded){	return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverQueryInformation(			Oid,			InfoBuffer, 			InfoBufferLength, 			BytesWritten,			BytesNeeded);}NDIS_STATUS MiniportSetInformation(	IN NDIS_HANDLE	MiniportContext, 	IN NDIS_OID		Oid,	IN PVOID		InfoBuffer, 	IN ULONG		InfoBufferLength, 	OUT PULONG		BytesRead,	OUT PULONG		BytesNeeded){	return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverSetInformation(			Oid,			InfoBuffer, 			InfoBufferLength, 			BytesRead,			BytesNeeded);}VOID	MiniportEnableInterrupt(	IN NDIS_HANDLE  MiniportContext){	((NIC_DRIVER_OBJECT*)MiniportContext)->DriverEnableInterrupt();}VOID	MiniportDisableInterrupt(	IN NDIS_HANDLE  MiniportContext){	((NIC_DRIVER_OBJECT*)MiniportContext)->DriverDisableInterrupt();}BOOLEAN	MiniportCheckForHang(	IN NDIS_HANDLE  MiniportContext){	return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverCheckForHang();} VOID	MiniportHalt(	IN NDIS_HANDLE  MiniportContext){	((NIC_DRIVER_OBJECT*)MiniportContext)->DriverHalt();} NDIS_STATUS MiniportReset(    OUT PBOOLEAN  AddressingReset,    IN NDIS_HANDLE  MiniportContext){	return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverReset(AddressingReset);}NDIS_STATUS	MiniportSend(	IN NDIS_HANDLE	MiniportContext,	IN PNDIS_PACKET	Packet,	IN UINT			Flags){	return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverSend(Packet,Flags);}#ifdef	__cplusplus   }	// of miniport trunk functions#endif/******************************************************************************************** * * DriverEntry * ********************************************************************************************/extern "C" NTSTATUS DriverEntry(	IN PDRIVER_OBJECT	pDriverObject, 	IN PUNICODE_STRING	pRegistryPath){	NDIS_STATUS		status;	NDIS_HANDLE		hwrapper;	NDIS40_MINIPORT_CHARACTERISTICS	ndischar;	PUTS(("<Davicom DM9000/9000A/9010 driver v3.04 for WinCE 4.2/5.0/6.0>\r\n"));	NdisMInitializeWrapper(		&hwrapper, 		pDriverObject,		pRegistryPath,		NULL);	memset((void*)&ndischar,0,sizeof(ndischar));        ndischar.Ndis30Chars.MajorNdisVersion = PRJ_NDIS_MAJOR_VERSION;	ndischar.Ndis30Chars.MinorNdisVersion = PRJ_NDIS_MINOR_VERSION;    	ndischar.Ndis30Chars.InitializeHandler = MiniportInitialize;    ndischar.Ndis30Chars.ResetHandler      = MiniportReset;    ndischar.Ndis30Chars.CheckForHangHandler = MiniportCheckForHang;    ndischar.Ndis30Chars.HaltHandler         = MiniportHalt;    ndischar.Ndis30Chars.HandleInterruptHandler   = MiniportInterruptHandler;    ndischar.Ndis30Chars.ISRHandler               = MiniportISRHandler;    ndischar.Ndis30Chars.QueryInformationHandler  = MiniportQueryInformation;    ndischar.Ndis30Chars.SetInformationHandler	  = MiniportSetInformation;    ndischar.Ndis30Chars.SendHandler              = MiniportSend;	if((status = NdisMRegisterMiniport(		hwrapper,		(PNDIS_MINIPORT_CHARACTERISTICS)&ndischar,		sizeof(ndischar)) != NDIS_STATUS_SUCCESS))	{		NdisTerminateWrapper(hwrapper,NULL);		return status;	}#ifndef	IMPL_DLL_ENTRY		INIT_EXCEPTION();#endif    return NDIS_STATUS_SUCCESS;}

⌨️ 快捷键说明

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