阅读:2440回复:5
postwrite IRQL太高怎么办
我想在postwirte里获得文件写入过后的长度,并且将值存入streamcontext中,在修改 streamcontext内容时用ExAcquireResourceExclusiveLite 保证独占性。。
可是postwrite当前的irql 是 2,我该怎么做呢,或者我可以在其他地方得到文件修改后的长度呢,pre操作里得到的值觉得不保险。。 |
|
沙发#
发布于:2009-10-10 11:22
Caution To avoid deadlocks, FltDoCompletionProcessingWhenSafe cannot be called for I/O operations that can be directly completed by a driver in the storage stack, such as the following:
IRP_MJ_READ IRP_MJ_WRITE IRP_MJ_FLUSH_BUFFERS wdk里这么说的,不过swapbuffer的例子还是在postread里用了FltDoCompletionProcessingWhenSafe ,这个有什么要注意的么? |
|
板凳#
发布于:2009-10-10 11:58
我也想知道在postwrite 如何得到文件修改后的长度?
|
|
地板#
发布于:2009-10-10 12:49
1. IRQL = DISPATCH_LEVEL时请使用自旋锁KSPIN_LOCK进行同步;
2. 文件Size信息可以从FCB中获得,或者自行计算; 3. 自行计算的方法: 首先Paging-IO不会改变文件Size, 如果是其它类型的IO, 则可以根据IO前的文件Size, 本次IO的Offset以及本次IO的最终Length(PIO_STATUS_BLOCK.Information) 判断出本次IO操作是否扩展了文件的Size,如果扩展了文件的Size则更新你的上下文,否则文件Size保持不变; |
|
|
地下室#
发布于:2009-10-10 14:33
知道了,我之前是在postcreate通过读fcb获得文件原始大小的,多谢版主了。。
|
|
5楼#
发布于:2009-10-12 10:30
非常感谢devia版主分享关于同步的信息。
|
|
|