阅读:2239回复:5
IFS Kit下关于FastIo的OSR文档翻译(3)
FastIoQueryBasicInfo and FastIoQueryStandardInfo
这两个操作为标准的NtQueryInformationFile API操作提供了支持,而FastIoQueryBasicInfo也经常被用来处理NtCreateFile的特定操作。文件的基本属性包括创建时间、访问时间和修改时间,以及隐藏、文件夹或其它属性等。文件的标准属性包括文件占用的空间、文件的大小、文件的硬连接号、被请求删除的标志,是否是文件夹的标识。 由于这些信息经常在缓存中,所以它是FAST I/O操作的最佳候选。其实许多程序用这种方法来获取文件基本的信息,因为这种方法提高了操作的效率和程序的性能,如文件管理器程序(winfile.exe)。 这两个Fast I/O例程有相同的接口: typedef BOOLEAN (*PFAST_IO_QUERY_ABSIC_INFO)( IN struct _FILE_OBJECT *FileObject, IN BOOLEAN Wait, OUT PFILE_BASIC_INFORMATION Buffer, OUT PIO_STATUS_BLOCK IoStatus, IN struct _DEVICE_OBJECT *DeviceObject); Wait参数表示调用者是否阻塞以等待获取信息的返回,如果设置为FALSE,则调用要么立刻完成,要么返回FALSE,如果返回FALSE,则会生成一个包含整个操作必要的上下文件的IRP。有趣的是在NT3.51中当Wait设置为FALSE时这两个例程将不被调用,当然这在以后的版本中会修改。 这两个例程一但被调用,它们会查询文件对象第一次打开时保存的信息,这些信息也可能被实时变化,例如,文件的最近访问时间属性会被文件系统设置的当前的系统时间,当然设置这些属性取决于文件系统的实现。 FastIoLock,FastIoUnLockSingle,FastIoUnLockAll,and FastIoUnLockAllByKey 这些例程被用来控制特殊文件的加锁状态。对文件的加锁以字节为单位,所以可以对文件的多个字节进行加密。标准的NT文件系统使用文件系统运行时开发包(FsRtl函数)所提供的通用代码来验证锁权限并存储文件的加锁范围。锁状态通过调用NT API函数NtLockFile和NtUnLockFile来控制。 在Windows NT中有两种锁,一种是排它锁,是写锁,说明加锁的地放要进行修改;另一种是共享锁,是读锁,说明加锁的地放用来的读的。多个共享锁在重叠操作中可以被授权,并且一直保存到释放为止。将各种加锁的信息存储起来在访问这些信息的时候会提高速度。 FastIoLock的原型: Typedef BOOLEAN (*PFAST_IO_LOCK)( IN struct _FILE_OJBECT *FileObject, IN PLARGE_INTEGER FileOffset, IN PLARGE_INTEGER Length, PEPROCESS ProcessId, ULONG Key, BOOLEAN FailImmediately, BOOLEAN ExclusiveLock, OUT PIO_STATUS_BLOCK IoStatus, IN struct _DEVICE_OBJECT *DeviceObject ); FileOffset 和Length参数对应加锁的范围,ProcessId标识加锁的进程,如果进行退出,锁将会清除。Key参数提供一个非透明的值,用来关联多个锁,例如调用FastIoUnLockAllByKey可以快速访问多个锁。FailImmediately用来标识当锁无效时是立刻返回失败还是阻塞直到锁可用。对于FsRtl函数,如果是无效的锁则忽略FailImmediately参数,函数返回FALSE。ExclusiveLock参数用来标识是排它锁还是共享锁。 FastUnlockSingle例程被用来释放对文件的加锁,原型如下: Typedef BOOLEAN (*PFAST_IO_UNLOCK_SINGLE)( IN struct _FILE_OBJECT *FileObject, IN PLARGE_INTEGER FileOffset, IN PLARGE_INTEGER Length, PEPROCESS ProcessId, ULONG Key, OUT PIO_STATUS_BLOCK IoStatus, IN struct _DEVICE_OBJECT *DeviceObject ); 对大多文件系统来说,如果文件没有加锁,此例程总是返回TRUE,即使朝无效的锁,操作也会完成,因为用IRP来操作也同样会产生相同的错误。 如果这个解锁操作成功,那么FileOffset,Length,ProcessId,和Key必须和相应的锁信息匹配,否则操作会返回错误STATUS_RANGE_NOT_LOCKED。FastIoUnlockAll例程用来释放特殊文件所有的锁,函数原型如下: typedef BOOLEAN(*PFAST_IO_UNLOCK_ALL)( IN struct _FILE_OBJECT *FileObject, PEPROCESS ProcessId, OUT PIO_STATUS_BLOCK IoStatus, IN struct _DEVICE_OBJECT *DeviceObject ); 在这种情况下,Fast I/O例程查找进程ProcessId所操作的文件所有的锁,并删除,无论是排它锁还是共享锁。这个例程常用在当系统由于关掉程序或终止程序而调用NtCloseFile时。 FastIoUnlockAllByKey操作用来通过一些特殊的键值来删除一系列锁。原型如下: Typedef BOOLEAN (*PFAST_IO_UNLOCK_ALL_BY_KEY)( IN struct _FILE_OBJECT *FileObject, PVOID ProcessId, ULONG Key, OUT PIO_STATUS_BLOCK_IoStatus, IN struct _DEVICE_OBJECT *DeviceObject ); 提供这个例程是为了便于文件服务如SRV。在NT3.51的I/O管理器中没有出现这个调用。键值用来文件服务给远程客户机文件加锁时分配的。因为许多远程客户端,仅有ProcessId是远远不够的。同样,对于多文件服务器,仅使用键值也会在其它的文件服务器释放时导致错误。二者同时使用以确保正确操作并允许远程加锁。 |
|
最新喜欢:hbnhbn... |
沙发#
发布于:2004-11-16 17:50
好
|
|
板凳#
发布于:2004-11-17 12:34
go no
|
|
|
地板#
发布于:2004-11-22 09:27
好东东,不过还请附加E文为更好。
|
|
地下室#
发布于:2004-11-22 09:52
为何没有了下文呢?老大翻译了一半,后面的一半怎么就不翻译了啊?大伙都等着续集啊:)有劳大虾了
|
|
5楼#
发布于:2004-11-22 13:14
不错,大虾辛苦了
|
|