阅读:1346回复:4
关于filepointer等概念的问题
我在看关于读写的例程时,对其中的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在驱动中有什么作用? |
|
沙发#
发布于:2003-06-09 20:26
filepointer的确是文件指针,不过不是c中指针的意思,只是一个代表当前offset的偏移整数量。下面针对你的注释来回答:
1.和buffersize比较,我想,你没明白chris cant的意思,他这个wdm2的例子里面没有实际的硬件,只是申请来一个buffer来模拟IO。 用filepointer来和buffersize比较就是看该指针有没有越界。 2.就是你说更糊涂那个部分,如果你想读取的内容超出了buffer的范围,就截掉超出的。 关键就是,要知道buffer事实上不是“缓冲区”,是模拟硬件来接受io。 |
|
板凳#
发布于: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的含义!! |
|
地板#
发布于: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,呵呵,基本就是这样。 |
|
地下室#
发布于:2003-06-11 09:01
谢谢windyguy大侠的解答
|
|