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

📄 fifo.c

📁 win2000下ISA接口的串口板卡的驱动程序
💻 C
字号:
//Fifo.c
//与Fifo相关的函数
#include <ntddk.h>
#include "def.h"
#include "Fifo.h"
NTSTATUS 
BufInit	(
	PFIFOBUF FifoBuf				
	)
{
	if(FifoBuf->Buf != NULL) 
		ExFreePool((PVOID)FifoBuf->Buf);
	FifoBuf->Buf = (UCHAR*)ExAllocatePool(NonPagedPool,FIFOSIZE);
	if(FifoBuf->Buf == NULL) 
	{
		FifoBuf->Number    = 0;
		FifoBuf->PtrHeader = 0;
		FifoBuf->PtrTailer = 0;
		FifoBuf->MaxSize   = 0;
		return STATUS_INSUFFICIENT_RESOURCES;
	}
	FifoBuf->Number    = 0;
	FifoBuf->PtrHeader = 0;
	FifoBuf->PtrTailer = 0;
	FifoBuf->MaxSize   = FIFOSIZE;
	return STATUS_SUCCESS;
}
NTSTATUS 
BufRelease(
	PFIFOBUF FifoBuf
	)
{
	FifoBuf->Number    = 0;
	FifoBuf->PtrHeader = 0;
	FifoBuf->PtrTailer = 0;
	FifoBuf->MaxSize   = 0;
	if(FifoBuf->Buf == NULL) 
		return STATUS_SUCCESS;
	ExFreePool(FifoBuf->Buf);
	return STATUS_SUCCESS;
}
UCHAR 
BufGetAt(
	PFIFOBUF FifoBuf,
	int i			
	)
{
	if(i >= (int)FifoBuf->Number ) return 0x00;
	return FifoBuf->Buf[(FifoBuf->PtrHeader + i)%FifoBuf->MaxSize];
}
NTSTATUS 
BufPopByte(
	PFIFOBUF FifoBuf,		
	UCHAR* Data
	)
{
	if((int)FifoBuf->Number > 0)
	{
		*Data = FifoBuf->Buf[FifoBuf->PtrHeader ];
		FifoBuf->Number --;
		FifoBuf->PtrHeader = (FifoBuf->PtrHeader + 1) % FifoBuf->MaxSize ;
		return STATUS_SUCCESS;
	}
	else	
		return STATUS_INSUFFICIENT_RESOURCES;
}
int  
BufPopBytes(
	PFIFOBUF FifoBuf,
	int PopSize
	)
{
	int RealSize,i;
	UCHAR TempByte;
	if(FifoBuf->Number == 0) return 0 ;

	RealSize = PopSize < (int)FifoBuf->Number ? 
			   PopSize : (int)FifoBuf->Number ;
	for(i = 0;i < RealSize;i++)
		BufPopByte(FifoBuf,&TempByte);
	return RealSize;
}
NTSTATUS 
BufPushByte(
	PFIFOBUF FifoBuf,
	UCHAR  Data
	)
{
	if(FifoBuf->Number < FifoBuf->MaxSize)
	{
		FifoBuf->Buf [FifoBuf->PtrTailer ] = Data;
		FifoBuf->Number ++;
		FifoBuf->PtrTailer = (FifoBuf->PtrTailer + 1) % FifoBuf->MaxSize ;
		return STATUS_SUCCESS;
	}
	else	
		return STATUS_INSUFFICIENT_RESOURCES;
}
ULONG 
BufReadBytes(
	PFIFOBUF FifoBuf,	
	UCHAR* Buf, 
	int ReadLen
	)
{
	int RealSize,i;
	if(FifoBuf->Number == 0) return 0 ;

	RealSize = ReadLen < (int)FifoBuf->Number ? ReadLen : (int)FifoBuf->Number ;
	for(i = 0;i < RealSize;i++)
		BufPopByte(FifoBuf,&Buf[i]);
	return RealSize;
}
ULONG 
BufWriteBytes(
	PFIFOBUF FifoBuf,	
	UCHAR* Buf, 
	int WriteLen
	)
{
	int RealSize,i;
	if(WriteLen > (int)(FifoBuf->MaxSize - FifoBuf->Number)) return 0 ;

	RealSize = WriteLen < (int)(FifoBuf->MaxSize - FifoBuf->Number) ? 
			   WriteLen : (int)(FifoBuf->MaxSize - FifoBuf->Number) ;
	for(i = 0;i < RealSize;i++)
		BufPushByte(FifoBuf,Buf[i]);
	return RealSize;
}

//Fifo函数定义结束

⌨️ 快捷键说明

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