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

📄 vdevadap.cpp

📁 驱动设计文档
💻 CPP
📖 第 1 页 / 共 2 页
字号:

				for(UINT itmp = 0;itmp < size; itmp ++)
					T.Trace("[%02x]",Buffer[itmp]);
			}

		} else {
			T.Trace("VdevAdapter::Send Buffer is NULL !\n");
		}
		
		buf = buf.GetNext();
		if (buf == NULL){
			T.Trace("VdevAdapter::Send GetNext is NULL !\n");
			break;
		}
	}
	// TODO:	Manage the packet into the hardware. 
	// Return NDIS_STATUS_SUCCESS if the packet got submitted to the h/w and 
	// NDIS_STATUS_PENDING if it's been queued into m_TxQueue.
	//

	m_GenStats->xmit_ok++;
//	RWBufMutex.Release();

	return NDIS_STATUS_SUCCESS;
#endif
}

NTSTATUS  VdevAdapter::IoRead (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
	NTSTATUS Status = STATUS_SUCCESS;
	KIrp	I(Irp);

//	RWBufMutex.Wait();

	if (NicSendDataBufLength > 0)
	{
		if (I.BufferedReadDest() == NULL)
		{
			T.Trace("VdevAdapter::IoRead UserBuffer!\n");
			memcpy((PUCHAR)I.UserBuffer(),NicSendDataBuf,NicSendDataBufLength);
		}
		else
		{
			T.Trace("VdevAdapter::IoRead BufferedReadDest !\n");
			memcpy((PUCHAR)I.BufferedReadDest(),NicSendDataBuf,NicSendDataBufLength);
		}

		T.Trace("VdevAdapter::IoRead Size [%d]\n", NicSendDataBufLength);
	}
//	I.UserReadBuffer();

//	T.Trace("VdevAdapter::IoRead Size [%d]\n", I.ReadSize());
	
	I.Information() = NicSendDataBufLength;

	NicSendDataBufLength = 0;

//	RWBufMutex.Release();
	
	return I.Complete(Status);	
}
////////////////////////////////////////////////////////////////////
// VdevAdapter::ReturnPacket
//
// This method is called when NDIS returns a packet previuosly
// indicated by IndicateReceive() back to the miniport
//
// Parameters:
//		Packet 
//			Points to a packet descriptor specifying the packet 
// IRQL: 
//		DISPATCH_LEVEL
// Return Mode:
//		n/a
// NOTE:
//		The packet returns to the "free list" in the Rx area. 
//		Reclaim() does the necessary reset of the chained buffer
//		and OOB data if any.
VOID VdevAdapter::ReturnPacket(IN PNDIS_PACKET Packet)
{
	T.Trace("VdevAdapter::ReturnPacket() Entered \n");
	T << Packet;
#if 1
	// declare for convenience
//	KNdisPacket pkt(Packet);

	NDIS_STATUS status = NDIS_GET_PACKET_STATUS(Packet);
	
	if(status == NDIS_STATUS_SUCCESS)
	{
			T.Trace("VdevAdapter::Write GetNext ReturnPacket is NDIS_STATUS_SUCCESS!\n");
	}
	else if(status == NDIS_STATUS_PENDING)
	{
		T.Trace("VdevAdapter::Write GetNext ReturnPacket is NDIS_STATUS_PENDING!\n");
		
/*
				TRACE("status=%s","NDIS_STATUS_PENDING");
				NdisUnchainBufferAtFront(Packet,&ndisBuffer);
				if(ndisBuffer)
					NdisFreeBuffer(ndisBuffer);
				NdisReinitializePacket(Packet);*/
		
	}
	else
		T.Trace("VdevAdapter::Write GetNext ReturnPacket is NDIS_STATUS_RESOURCES!\n");
	
// 		TRACE("status=%s","NDIS_STATUS_RESOURCES");
	
	
// 	NdisUnchainBufferAtFront(m_OurPacket,&m_OurBuffer);
//	if(m_OurBuffer)
//		NdisFreeBuffer(m_OurBuffer);
	NdisFreePacket(Packet);
	// TODO:	Reclaim the packet back to an internal list
	//
#endif
}

////////////////////////////////////////////////////////////////////
// VdevAdapter::CheckForHang
//		Optional function that reports the state of the NIC or monitors
//		 the responsiveness of an underlying device driver.
// Parameters:
//		none
// IRQL: 
//		IRQL DISPATCH_LEVEL
// Return Mode:
//		Synchronous
// NOTE:
//		By default, the NDIS library calls MiniportCheckForHang 
//		approximately every two seconds. If MiniportCheckForHang returns
//		TRUE, NDIS then calls the driver's MiniportReset function. 
BOOLEAN VdevAdapter::CheckForHang()
{
	// TODO:	Check the h/w for hang
	return FALSE;
}

	

/////////////////////////
// I/O Dispatching
NTSTATUS VdevAdapter::IoDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
	NTSTATUS Status = STATUS_SUCCESS;
	KIrp	I(Irp);

	T.Trace("VdevAdapter::IoDispatch func 0x%02x \n", I.MajorFunction());

	switch (I.MajorFunction()) {
    case IRP_MJ_CREATE:			// TODO
    case IRP_MJ_CLOSE:			// TODO
    case IRP_MJ_CLEANUP:		// TODO
    case IRP_MJ_READ:			// TODO		
    case IRP_MJ_WRITE:			// TODO
    case IRP_MJ_DEVICE_CONTROL: // TODO
			I.Information() = 0;
			break;
	default: 
		Status = STATUS_UNSUCCESSFUL;

	};

	return I.Complete(Status);
}
NTSTATUS VdevAdapter::IoCreate (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
	NTSTATUS Status = STATUS_SUCCESS;
	KIrp	I(Irp);	
	
	DeviceObject->Flags |= DO_BUFFERED_IO;	
	//LsaNtStatusToWinError
	
	return I.Complete(Status);
}

NTSTATUS VdevAdapter::IoClose (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
	NTSTATUS Status = STATUS_SUCCESS;
	KIrp	I(Irp);	

	return I.Complete(Status);
}

NTSTATUS VdevAdapter::IoCleanup(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
	NTSTATUS Status = STATUS_SUCCESS;
	KIrp	I(Irp);	
	
	return I.Complete(Status);
}

#define SENDLENGTH 	56
UCHAR pWriteBuf[SENDLENGTH] = {
		0x00,0x11,0x22,0x33,0x44,0x55,
		0x00,0x07,0x95,0xa5,0x34,0x0f,
		0x00,0x28,
		0xff,0xff,
		0x00,0x27,
		0x00,0x00,
		
		0x00,0x00,0x00,0x10,
		0x00,0x11,0x22,0x33,0x44,0x55,
		0x0e,0x22,
		
		0x00,0x00,0x00,0x10,
		0x00,0x07,0x95,0xa5,0x34,0x0f,
		0x0e,0x22,
		
		0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,
		
		0xb1,0x00,0x00
};

NTSTATUS VdevAdapter::IoWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
	NTSTATUS Status = STATUS_SUCCESS;
	KIrp	I(Irp);	

	PNDIS_PACKET pNdisPacket;
	NDIS_STATUS	NStatus;

	PNDIS_BUFFER	pNdisDataBuffer;

	PVOID	pWBuf,pDataBuf;
	UINT uiBufLen;


	if (pphflag == -1)
	{
		I.Information() = -9;
		return I.Complete(Status);
	}
	if (bphflag == -1)
	{
		I.Information() = -8;
		return I.Complete(Status);
	}
//PVOID& 
	pWBuf = &(I.BufferedWriteSource());
	uiBufLen = I.WriteSize() ;
	if (uiBufLen <= 0)
	{
		I.Information() = 0;
		return I.Complete(Status);			
	}

	pDataBuf = ExAllocatePool(PagedPool,uiBufLen);
	if (pDataBuf == NULL)
	{
		I.Information() = -1;
		return I.Complete(Status);
	}

	memset(pDataBuf,0,uiBufLen);
	if (I.BufferedWriteSource() != NULL)
		memcpy(pDataBuf,I.BufferedWriteSource(),uiBufLen);
	else
		T.Trace("VdevAdapter::Write I.BufferedWriteSource() == NULL \n");
//		memcpy(pDataBuf,pWBuf,uiBufLen);
	
	NdisAllocatePacket(&NStatus,&pNdisPacket,PacketPoolHandle);
	if( NStatus != NDIS_STATUS_SUCCESS ) 
	{
		I.Information() = -2;
		return I.Complete(Status);
	} 
	else
	{
		I.Information() = 1;
	}

	NdisAllocateBuffer(&NStatus,&pNdisDataBuffer,BufferPoolHandle,pDataBuf,uiBufLen);
	if( NStatus != NDIS_STATUS_SUCCESS ) 
	{
		I.Information() = -3;
		return I.Complete(Status);
	} 
	else
	{
		I.Information() = 1;
	}


	NdisChainBufferAtFront(pNdisPacket, pNdisDataBuffer);
	
	NDIS_SET_PACKET_HEADER_SIZE(pNdisPacket,14);
//	NDIS_SET_PACKET_STATUS(pNdisPacket,NDIS_STATUS_RESOURCES);

#if 0
	KNdisPacket pkt(pNdisPacket);
	KNdisBuffer buf;
	UINT size;
	PUCHAR Buffer;
	
	buf = pkt.QueryFirstBuffer();
	T.Trace("VdevAdapter::Write  Start Display packet info! \n");
	while(buf.IsValid())
	{
		
		size = buf.Length();
		T.Trace("VdevAdapter::Write size is [%ud]\n",size);
		
		Buffer = (PUCHAR)buf.Address();
		if (Buffer != NULL) {
			if (size > 1){
				for(UINT itmp = 0;itmp < size; itmp ++)
					T.Trace("[%02x]",Buffer[itmp]);
			}
		} else {
			T.Trace("VdevAdapter::Write Buffer is NULL !\n");
		}
		
		buf = buf.GetNext();
		if (buf == NULL){
			T.Trace("VdevAdapter::Write GetNext is NULL !\n");
			break;
		}
	}
#endif 

	pThisVdevAdapter->IndicateReceive(pNdisPacket);
	pThisVdevAdapter->m_GenStats->rcv_ok ++;	
	
	NDIS_STATUS status = NDIS_GET_PACKET_STATUS(pNdisPacket);
	
	if(status != NDIS_STATUS_PENDING)
	{

		NdisUnchainBufferAtFront(pNdisPacket,&pNdisDataBuffer);
		NdisFreeBuffer(pNdisDataBuffer);
		NdisFreePacket(pNdisPacket);

		I.Information() = uiBufLen;

		if(Status == NDIS_STATUS_SUCCESS) {
			T.Trace("VdevAdapter::Write Status == NDIS_STATUS_SUCCESS!\n");
		} else {
			T.Trace("VdevAdapter::Write Status != NDIS_STATUS_SUCCESS!\n");
		}
		
		return I.Complete(Status);
	}

	T.Trace("VdevAdapter::Write Status == NDIS_STATUS_PENDING!\n");
	I.Information() = -4;
	
	ExFreePool(pDataBuf);

	return I.Complete(Status);
}

NDIS_STATUS VdevAdapter::TransferData(
										OUT PNDIS_PACKET			Packet,
										OUT PUINT					BytesTransferred,
										IN  PVOID					Lookahead, /* MiniportReceiveContext */
										IN	UINT					ByteOffset,
										IN	UINT					BytesToTransfer)
{
	T.Trace("VdevAdapter::Write TransferData!\n");
	
	return NDIS_STATUS_SUCCESS;
}
// end of file




















// end of file

⌨️ 快捷键说明

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