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

📄 write.c

📁 WinCE 系统下
💻 C
字号:
#include <windows.h>
#include "packet.h"


/*
** Function does nothing. Writing of packet is handled by IO Control
*/
extern DWORD PKT_Write(DWORD dwContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
	return 0;
}


BOOL PKTWrite (POPEN_INSTANCE pOI, PVOID pBufIn, DWORD dwLenIn, PDWORD pdwActualOut)
{
	NDIS_STATUS		Status;
	PNDIS_PACKET	pPacket;
	PNDIS_BUFFER	pNdisBuffer;

	// check if the length of the packet is zero
	if (dwLenIn == 0) {
		return TRUE;
	}

	// mark io pending
	pOI->Status = NDIS_STATUS_PENDING;

	// allocate packet
	NdisAllocatePacket (&Status, &pPacket, pOI->PacketPool);
	if (Status != NDIS_STATUS_SUCCESS) {
		SAFE_SET (pdwActualOut, 0);
		return FALSE;
	}

	// allocate the buffer
	NdisAllocateBuffer (&Status, &pNdisBuffer, pOI->BufferPool, pBufIn, dwLenIn);
	if (Status != NDIS_STATUS_SUCCESS)	{

		NdisReinitializePacket(pPacket);
		NdisFreePacket(pPacket);

		SAFE_SET (pdwActualOut, 0);
		return FALSE;
	}

	// add the buffer to the buffer chain
	NdisChainBufferAtFront (pPacket, pNdisBuffer);

	// send the packet on the network
//	NdisResetEvent(&pOI->SendEvent);
	NdisSend (&Status, pOI->AdapterHandle, pPacket);

	if (Status == NDIS_STATUS_PENDING) {
		SuspendExecution (pOI);
//		NdisWaitEvent(&pOI->SendEvent, 0);
//		Status = pOI->Status;
	} else {
		PacketWriteComplete (pOI, pPacket, Status);
	}

	if (pOI->Status != NDIS_STATUS_SUCCESS) {
		return FALSE;
	}

	return TRUE;
}


VOID PacketWriteComplete(IN NDIS_HANDLE   ProtocolBindingContext,
						 IN PNDIS_PACKET  pPacket,
						 IN NDIS_STATUS   Status)
{
	PNDIS_BUFFER 		pNdisBuffer;
	POPEN_INSTANCE		pOI;

	pOI = (POPEN_INSTANCE) ProtocolBindingContext;

	// un chain the buffer
	NdisUnchainBufferAtFront (pPacket, &pNdisBuffer);
	if (pNdisBuffer) {
		// return to the pool
		NdisFreeBuffer (pNdisBuffer);
	}

	// reinit the packet
	NdisReinitializePacket (pPacket);
		
	// release the packet to he pool
	NdisFreePacket (pPacket);

	// set the status
	ResumeExecution (pOI, Status);
//	NdisSetEvent(&pOI->SendEvent);
	return;
}



BOOL PKTRequest (POPEN_INSTANCE pOI, DWORD dwFunctionCode, PVOID pBufIn, DWORD dwLenIn, 
				 PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
	PPACKET_OID_DATA	pOidData;
	NDIS_STATUS			Status;
	
	pOidData = (PPACKET_OID_DATA)(pBufIn);
	
	if (! ((dwLenIn == dwLenOut) && 
		(dwLenIn >= sizeof(PACKET_OID_DATA) - 1 + pOidData->Length)))
	{
		// parameters not correct 
		SAFE_SET(pdwActualOut, 0);
		return FALSE;
	}
	
	switch (dwFunctionCode) {
		
		// code to set the data
	case PIOC_SETOID: 
		pOI->Request.RequestType									= NdisRequestSetInformation;
		pOI->Request.DATA.SET_INFORMATION.Oid						= pOidData->Oid;
		pOI->Request.DATA.SET_INFORMATION.InformationBufferLength	= pOidData->Length;
		pOI->Request.DATA.SET_INFORMATION.InformationBuffer			= pOidData->Data;
		break;
		
	case PIOC_QUERYOID:
		pOI->Request.RequestType									= NdisRequestQueryInformation;
		pOI->Request.DATA.QUERY_INFORMATION.Oid						= pOidData->Oid;
		pOI->Request.DATA.QUERY_INFORMATION.InformationBufferLength	= pOidData->Length;
		pOI->Request.DATA.QUERY_INFORMATION.InformationBuffer		= pOidData->Data;
		break;
		
	default:
		pOI->Request.RequestType									= NdisRequestGeneric1;
		pOI->Request.DATA.QUERY_INFORMATION.Oid						= pOidData->Oid;
		pOI->Request.DATA.QUERY_INFORMATION.InformationBufferLength	= pOidData->Length;
		pOI->Request.DATA.QUERY_INFORMATION.InformationBuffer		= pOidData->Data;
	}
	
	NdisRequest (&Status, pOI->AdapterHandle, &pOI->Request);
	if (Status == NDIS_STATUS_PENDING) {
		SuspendExecution (pOI);
		Status = pOI->Status;
	} else {
		PacketRequestComplete (pOI, &pOI->Request, Status);
	}

	if (pOI->Status == NDIS_STATUS_SUCCESS) {
		SAFE_SET (pdwActualOut, pOI->Request.DATA.SET_INFORMATION.BytesRead);
	} else {
		// if there is an error length contains the type of error
		SAFE_SET (pdwActualOut, 0);
		pOidData->Length = pOI->Status;
		return FALSE;
	}
	
	return TRUE;
}

VOID PacketRequestComplete(IN NDIS_HANDLE   ProtocolBindingContext,
						   IN PNDIS_REQUEST NdisRequest,
						   IN NDIS_STATUS   Status)
{
	POPEN_INSTANCE		pOI;

	pOI		= (POPEN_INSTANCE)ProtocolBindingContext;

	if (Status == NDIS_STATUS_SUCCESS) {
	} else {
	}

	// resume
	ResumeExecution (pOI, Status);

	return;
}

⌨️ 快捷键说明

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