Using the Current File Position
When you create or open a file, you can cause the I/O manager to create a current file-position pointer that is associated with the file handle. Once you have done so, you can read and write data to the current file position, and the I/O manager will automatically update the position by the number of bytes that were read or written.
By default, the I/O manager does not maintain a current file-position pointer. This default provides efficiency—because correctly maintaining the current file position requires the I/O manager to synchronize every read and write operation on the file object.
To create a handle that has an associated current file-position pointer, specify the SYNCHRONIZE access right in the DesiredAccess parameter to ZwCreateFile, IoCreateFile, or ZwOpenFile, and either FILE_SYNCHRONOUS_IO_ALERT or FILE_SYNCHRONOUS_IO_NONALERT in the CreateOptions or OpenOptions parameter. Be sure that you do not also specify the FILE_APPEND_DATA access right.
ZwReadFile and ZwWriteFile automatically update the current file-position pointer so that it points just beyond the data affected by the operation. For example, if you read 20 bytes starting at byte offset 101, ZwReadFile will update the current file position to 121.
You can examine or change the current file position by calling ZwQueryInformationFile or ZwSetInformationFile, respectively. In either case, set the FileInformationClass parameter to FilePositionInformation.