kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1346回复:4

关于filepointer等概念的问题

楼主#
更多 发布于:2003-06-09 19:23
我在看关于读写的例程时,对其中的filepointer等概念不太理解,例程如下:
NTSTATUS Wdm2Read( IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
PWDM2_DEVICE_EXTENSION dx = (PWDM2_DEVICE_EXTENSION)fdo->DeviceExtension;
if( dx->IODisabled)
return CompleteIrp( Irp, STATUS_DEVICE_NOT_CONNECTED, 0);
if (!LockDevice(dx))
return CompleteIrp( Irp, STATUS_DELETE_PENDING, 0);

NTSTATUS status = PowerUpDevice(fdo);
if( !NT_SUCCESS(status))
return CompleteIrp(Irp, status, 0);

PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
LONG BytesTxd = 0;

// Get call parameters
LONGLONG FilePointer = IrpStack->Parameters.Read.ByteOffset.QuadPart;
ULONG ReadLen = IrpStack->Parameters.Read.Length;
DebugPrint(\"Read %d bytes from file pointer %d\",(int)ReadLen,(int)FilePointer);

// Get access to the shared buffer
KIRQL irql;
KeAcquireSpinLock(&BufferLock,&irql);

// Check file pointer
if( FilePointer<0)
status = STATUS_INVALID_PARAMETER;
if( FilePointer>=(LONGLONG)BufferSize)
              ~~~~~~~~~~~~~
                                        这个filepointer是反映的文件的句柄?指针?他怎么可以和buffersize进行比较那?
status = STATUS_END_OF_FILE;

if( status==STATUS_SUCCESS)
{
// Get transfer count
if( ((ULONG)FilePointer)+ReadLen>BufferSize)
{
BytesTxd = BufferSize - (ULONG)FilePointer;
if( BytesTxd<0) BytesTxd = 0;
}
else
BytesTxd = ReadLen;

// Read from shared buffer
if( BytesTxd>0 && Buffer!=NULL)
RtlCopyMemory( Irp->AssociatedIrp.SystemBuffer, Buffer+FilePointer, BytesTxd);
}

// Release shared buffer
KeReleaseSpinLock(&BufferLock,irql);

DebugPrint(\"Read: %d bytes returned\",(int)BytesTxd);

// Complete IRP
CompleteIrp(Irp,status,BytesTxd);
UnlockDevice(dx);
return status;
}
除了上面的那个地方不理解之外,对下面这部分更糊涂了
if( ((ULONG)FilePointer)+ReadLen>BufferSize)
{
BytesTxd = BufferSize - (ULONG)FilePointer;
if( BytesTxd<0) BytesTxd = 0;
}
else
BytesTxd = ReadLen
这儿我对readlen理解是要读的总字节数,buffersize是缓冲区的大小,由于有时候readlen大于buffersize,故需要分几次传输,可是这的filepointer是什么那?是存放文件指针的那部分所占的空间?难道每次传输都有把文件指针穿过去吗?
filepoiter在驱动中有什么作用?
windyguy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-07
  • 最后登录2004-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-09 20:26
filepointer的确是文件指针,不过不是c中指针的意思,只是一个代表当前offset的偏移整数量。下面针对你的注释来回答:
1.和buffersize比较,我想,你没明白chris cant的意思,他这个wdm2的例子里面没有实际的硬件,只是申请来一个buffer来模拟IO。
用filepointer来和buffersize比较就是看该指针有没有越界。
2.就是你说更糊涂那个部分,如果你想读取的内容超出了buffer的范围,就截掉超出的。

关键就是,要知道buffer事实上不是“缓冲区”,是模拟硬件来接受io。
kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-10 09:28
首先感谢大侠!不过有点更加不清楚了
-----―――――――――――――――――――――――――
filepointer的确是文件指针,不过不是c中指针的意思,只是一个代表当前offset的偏移整数量。下面针对你的注释来回答:
   ~~~~~~~~~~~~~~~~~~offset?谁的offset?

1.和buffersize比较,我想,你没明白chris cant的意思,他这个wdm2的例子里面没有实际的硬件,只是申请来一个buffer来模拟IO。
用filepointer来和buffersize比较就是看该指针有没有越界。
   ~~~~~~~~~~~~~~这儿说的io是io端口?指针有没有越界。不明白    

2.就是你说更糊涂那个部分,如果你想读取的内容超出了buffer的范围,就截掉超出的。

关键就是,要知道buffer事实上不是“缓冲区”,是模拟硬件来接受io。
――――――――――――――――――――――――――――――
      ~~~~~~~~~~~~~~~~~~关键我还是不明白filepointer的含义!!


windyguy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-07
  • 最后登录2004-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-10 19:17
简单来说,filepointer是一个ulong int,比如我要打开一个文件,文件的开始指针我有了,假设是startpointer,然后我要读距离文件开始100字节处的东西,这时filepointer=100,startpointer+filepointer就等于我要读取的数据的地址了。

至于Chris Cant的本意,也许我没有说清楚,我说模拟是这个意思:App端发来一个write irp,可是wdm这个例子并不对应实际的硬件,那么怎么处理这个请求呢?你要么忽略这个请求,要么就随便找个地方把数据写进去,当作完成了请求。Cant选择了申请一个buffer来把那些数据写入,这样当一个read irp来到时,再读出这个buffer的内容来完成read irp。这样,即便没有任何硬件,你也可以成功地完成irp,呵呵,基本就是这样。
kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-11 09:01
谢谢windyguy大侠的解答
游客

返回顶部