📄 fifo.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 + -