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

📄 driver.cpp

📁 DM9000 WinCE.net Driver v3.2.7 Release
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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){	PERF_PROBE_ON(PROBE_SEND);#if	defined(PERF_TEST)	return	NDIS_STATUS_SUCCESS;#else	PCQUEUE_GEN_HEADER	pobj;		//DEBUG_PRINT((TEXT("TQ size=%d"), m_TQueue.Size()));		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;	PERF_PROBE_ON(PROBE_SEND+1);	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;#if	0 || defined(PATCH_001)	/* do it twice */	dummy_copy((PU8)CQueueGetUserPointer(pobj), uTotalPacketLength);#endif	PERF_PROBE_OFF(PROBE_SEND+1);		pobj->pPacket = (PVOID)pPacket;	pobj->uFlags = uFlags;	pobj->nLength = uTotalPacketLength;		m_pLower->DeviceSend(pobj);		PERF_PROBE_OFF(PROBE_SEND);#ifdef	IMPL_SEND_INDICATION	return NDIS_STATUS_PENDING;#else	return NDIS_STATUS_SUCCESS;#endif#endif	// of !PERF_TEST}void	NIC_DRIVER_OBJECT::DriverReceiveIndication(	int		nCurr,	PVOID	pVoid,	int		nLength){#if !defined(PERF_TEST)	PERF_PROBE_ON(PROBE_RECV);	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);	PERF_PROBE_OFF(PROBE_RECV);	return;		#elif	defined(PERF_TX_MODE)	m_pLower->DeviceDisableReceive();		return;#elif	defined(PERF_ECHO_MODE)	PCQUEUE_GEN_HEADER	pobj;		if(!(pobj = m_TQueue.Dequeue())) return;	PU8		pcurr;		pcurr = (PU8)CQueueGetUserPointer(pobj);	memcpy((void*)pcurr,pVoid,pobj->nLength=nLength);	PU16	pshort;	pshort = (PU16)pcurr;	// save SA to tmp	U16		sa0,sa1,sa2;	sa0 = *(pshort+0);	sa1 = *(pshort+1);	sa2 = *(pshort+2);	// copy DA to SA		*(pshort+0) = *(pshort+3);	*(pshort+1) = *(pshort+4);	*(pshort+2) = *(pshort+5);		// restore DA from tmp	*(pshort+3) = sa0;	*(pshort+4) = sa1;	*(pshort+5) = sa2;	m_pLower->DeviceSend(pobj);		return;	#endif}	void	NIC_DRIVER_OBJECT::DriverSendCompleted(	PCQUEUE_GEN_HEADER	pObject){#if defined(PERF_TX_MODE)	m_pLower->DeviceSend(pObject);	return;#endif	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"));#if	defined(DM9601)		USB_NIC_DRIVER	*pnic;	if(!(pnic = new USB_NIC_DRIVER(		MiniportHandle,		WrapperConfigHandle,		ghDevice,		glpUsbFuncs,		glpUsbDevice,		glpInterface)))		return	NDIS_STATUS_FAILURE;	glpUsbFuncs->lpRegisterNotificationRoutine(		ghDevice,		(LPDEVICE_NOTIFY_ROUTINE)USBNotificationRoutine,		(LPVOID)pnic);#else	NIC_DRIVER_OBJECT	*pnic;	if(!(pnic = new NIC_DRIVER_OBJECT(		MiniportHandle,WrapperConfigHandle)))			return	NDIS_STATUS_FAILURE;#endif	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 * ********************************************************************************************/DWORD MesurePerformance(	DWORD	nLoop){	/* performance evaluation */		LARGE_INTEGER freq;	LARGE_INTEGER listart, listop;	DWORD	dwstart, dwstop;		QueryPerformanceFrequency(&freq);		DWORD	i,j;	WORD	sum, sz[1512];		memset((void*)sz, 0x5a, sizeof(sz));		dwstart  =  GetTickCount();	QueryPerformanceCounter(&listart);		for(i=0;i<nLoop;i++)		for(j=0,sum=0;j<1512;j++)			sum += sz[j];		QueryPerformanceCounter(&listop);	dwstop  =  GetTickCount();		return (listop.LowPart - listart.LowPart);}extern "C" NTSTATUS DriverEntry(	IN PDRIVER_OBJECT	pDriverObject, 	IN PUNICODE_STRING	pRegistryPath){	NDIS_STATUS		status;	NDIS_HANDLE		hwrapper;	NDIS40_MINIPORT_CHARACTERISTICS	ndischar;#if	defined(DM9000)	PUTS(("<Davicom DM9000 driver v3.2.7 for WinCE 4.2/5.0>\r\n"));#elif defined(DM9102)	PUTS(("<Davicom DM9102 driver v3.2.7 for WinCE 4.2/5.0>\r\n"));#elif defined(DM9601)	PUTS(("<Davicom DM9601 driver v3.2.7 for WinCE 4.2/5.0>\r\n"));#endif	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	defined(DM9601)	if((status = NdisIMRegisterLayeredMiniport(		hwrapper,		(PNDIS_MINIPORT_CHARACTERISTICS)&ndischar,		sizeof(ndischar),		&ghNdisIntermediateHandle ) != NDIS_STATUS_SUCCESS))#else	if((status = NdisMRegisterMiniport(		hwrapper,		(PNDIS_MINIPORT_CHARACTERISTICS)&ndischar,		sizeof(ndischar)) != NDIS_STATUS_SUCCESS))#endif	{		NdisTerminateWrapper(hwrapper,NULL);		return status;	}#ifndef	IMPL_DLL_ENTRY		INIT_EXCEPTION();#endif    return NDIS_STATUS_SUCCESS;}#if	defined(DM9601)#include	<usb100.h>#include	<usbdi.h>#include	<usbtypes.h>LPCWSTR		glpcwstrDriverID =	TEXT("DavicomUsb");extern "C" BOOL USBInstallDriver(	LPCWSTR		lpcwstrDriverName){	int		ret;		// register unique client driver identifier	ret = RegisterClientDriverID(			glpcwstrDriverID);					// sets up the LoadClients registry keys	USB_DRIVER_SETTINGS	settings;		settings.dwCount = sizeof(settings);	settings.dwVendorId = 0x0A46;	settings.dwProductId = 0x9601;	settings.dwReleaseNumber = 0x0101;	settings.dwDeviceClass = USB_NO_INFO;//USB_DEVICE_CLASS_COMMUNICATIONS;	settings.dwDeviceSubClass = USB_NO_INFO;	settings.dwDeviceProtocol = USB_NO_INFO;	settings.dwInterfaceClass = USB_NO_INFO;//USB_DEVICE_CLASS_COMMUNICATIONS;	settings.dwInterfaceSubClass = USB_NO_INFO;//0x06;	// Ethernet model	settings.dwInterfaceProtocol = USB_NO_INFO;//0x00;	// no class specific		ret = RegisterClientSettings(		lpcwstrDriverName,		glpcwstrDriverID,		NULL,		&settings);		if(!ret) return FALSE;			return	TRUE;}extern "C" BOOL USBUnInstallDriver(void){	return	TRUE;}extern "C" NTSTATUS PostDriverEntry(	USB_HANDLE 				hDevice, 	LPCUSB_FUNCS			lpUsbFuncs, 	LPCUSB_DEVICE			lpUsbDevice,	LPCUSB_INTERFACE 		lpInterface){	if(!ghNdisIntermediateHandle) return NDIS_STATUS_FAILURE;		ghDevice = hDevice;	glpUsbFuncs = lpUsbFuncs;	glpUsbDevice = lpUsbDevice;	glpInterface = lpInterface;		NDIS_STATUS		status;	if((status = NdisIMInitializeDeviceInstanceEx(		ghNdisIntermediateHandle,		&guniRegistryPath,		NULL		) != NDIS_STATUS_SUCCESS))	{		return status;	}    return NDIS_STATUS_SUCCESS;}extern "C" BOOL USBDeviceAttach(	USB_HANDLE 				hDevice, 	LPCUSB_FUNCS			lpUsbFuncs, 	LPCUSB_INTERFACE 		lpInterface, 	LPCWSTR 				szUniqueDriverId, 	LPBOOL 					fAcceptControl, 	LPCUSB_DRIVER_SETTINGS 	lpDriverSettings, 	DWORD 					dwUnused ){	*fAcceptControl = TRUE;	LPCUSB_DEVICE		pusbdev;	LPCUSB_INTERFACE	pusbif;		// retrive device and interface information	for(pusbif=lpInterface;!pusbif;)	{		if(!(pusbdev = lpUsbFuncs->lpGetDeviceInfo(hDevice)))			return FALSE;		if(!(pusbif = lpUsbFuncs->lpFindInterface(pusbdev,0,0)))			return FALSE;	} // of for pusbif		// check vendor and product IDs	if( (pusbdev->Descriptor.idVendor != 0x0A46) ||		(pusbdev->Descriptor.idProduct != 0x9601)) return FALSE;	unsigned short	wsz[512];	wsprintf(wsz,TEXT("%s%d"),szUniqueDriverId,++gnInstance);	NdisInitUnicodeString(		&guniRegistryPath, wsz);	if(PostDriverEntry(hDevice,lpUsbFuncs,pusbdev,pusbif)		!= NDIS_STATUS_SUCCESS) 		return (*fAcceptControl=FALSE);	return *fAcceptControl;		}#endif#if 0/* performance result * *  * Pentium-S 133 MHz * 	1,000,000 times, 163,472,385 uS * */LARGE_INTEGER lp1, lp2, lp;DWORD	dw1, dw2;DWORD	q1;DWORD	iloops = 10*1000;dw1 = MesurePerformance(iloops);q1 = dw1 / iloops;QueryPerformanceFrequency(  &lp);dw1 =  GetTickCount();QueryPerformanceCounter(&lp1);NdisMSleep(2*1000*1000);if(0){	int i;	for(i=0;i<0x70000000;i++);}dw2 =  GetTickCount();	QueryPerformanceCounter(&lp2);DWORD delta=dw2-dw1;DWORD deltap = lp2.LowPart - lp1.LowPart;DWORD deltah =  lp2.HighPart - lp1.HighPart;#endif

⌨️ 快捷键说明

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