MyFSD_WriteFileWithSeek (Compact 2013)
3/26/2014
This function writes data to a file in an installable file system. The function starts writing data at a specified position in the file indicated by the caller. After the write operation has completed, the file pointer is adjusted by the number of bytes written. This function is exported by an implementation of a files system driver (FSD) and is called indirectly by File System Disk Manager (FSDMGR).
Syntax
BOOL MyFSD_WriteFileWithSeek(
PFILE pFile,
PCVOID pBuffer,
DWORD cbWrite,
PDWORD pcbWritten,
OVERLAPPED* pOverlapped,
DWORD dwLowOffset,
DWORD dwHighOffset
);
Parameters
- pFile
[in] Pointer to the value that an FSD passes to the FSDMGR_CreateFileHandle function when creating the file handle.
- pBuffer
[in] Pointer to the buffer containing the data to be written to the file.
cbWrite
[in] Number of bytes to write to the file.A value of zero specifies a null write operation. A null write operation does not write any bytes, but does change the time stamp.
- pcbWritten
[out] Pointer to the number of bytes written by this function call. The WriteFile function sets this value to zero before doing any work or error checking. This parameter cannot be set to NULL.
- pOverlapped
Not supported.
- dwLowOffset
[in] Low-order part of a 64-bit address that identifies the start position for the write operation.
- dwHighOffset
[in] High-order part of the 64-bit address that identifies the start position of the write operation. Together, dwLowOffsetand dwHighOffsetform the 64-bit address to begin the write operation.
Return Value
Nonzero indicates success. Zero indicates failure. To get extended error information, call GetLastError.
Remarks
The OS does not support asynchronous write operations. The lpOverlappedparameter is ignored and should be set to NULL before calling WriteFile.
If an FSD supports paging from the file system, this function must be implemented. If it is implemented, the pager and memory-mapped file support utilize this function. If an FSD does not supported paging from the file system, the fallback position is to page the entire file into memory when it is a module or a file that is being mapped.
The kernel determines whether an FSD can support paging by making the following call: ReadFileWithSeek(oeptr->hf,0,0,0,0,0,0)
. If the FSD returns TRUE, paging is supported for this file.
The kernel determines whether an FSD supports write operations for use with memory-mapped files by making the following call:
WriteFileWithSeek(hFile,&testbyte,1,&len,0,0,0)
An FSD returns TRUE if write operations are allowed on the file. An FSD returns FALSE if write operations are not permitted on the file. If WriteFileWithSeek is not supported, WriteFile is used to determine whether an FSD supports write operations on memory-mapped files.
FSDMGR is a DLL that manages all OS interaction with installable files systems. Each installable file system requires an FSD, which is a DLL that supports an installable file system. The name of the DLL and the names of the functions it exports start with the name of the associated installable file system. For example, if the name of file system is MyFSD, its DLL is MyFSD.dll, and its exported functions are prefaced with MyFSD_*.
FSDMGR provides services to FSDs. The FSDMGR_RegisterVolume, the FSDMGR_CreateFileHandle, and the FSDMGR_CreateSearchHandle functions record a DWORD of volume-specific data that an FSD associates with a volume. This volume-specific data is passed as the first parameter of these three functions.
Applications that access an installable file system use standard Win32 functions. For example, when an application creates a folder on a device that contains an installable file system, it calls the CreateDirectory function. FSDMGR recognizes that the path is to a device containing an installable file system and calls the appropriate function, which in the case of the FAT file system is FATFSD_CreateDirectoryW. In other words, the application calls CreateDirectory, causing FSDMGR to call FATFSD_CreateDirectoryW.
An application must meet the following requirements when working with files opened with FILE_FLAG_NO_BUFFERING:
- File access must begin at byte offsets within the file that are integer multiples of the volume's sector size. To determine a volume's sector size, call the GetDiskFreeSpaceEx function.
- File access must be for numbers of bytes that are integer multiples of the volume's sector size. For example, if the sector size is 512 bytes, an application can request reads and writes of 512, 1024, or 2048 bytes, but not of 335, 981, or 7171 bytes.
- Buffer addresses for read and write operations must be sector-aligned on addresses in memory that are integer multiples of the volume's sector size. One way to sector-align buffers is to use the VirtualAlloc function to allocate the buffers. This function allocates memory that is aligned on addresses that are integer multiples of the system's page size. Because both page and volume sector sizes are powers of 2, memory aligned by multiples of the system's page size is also aligned by multiples of the volume's sector size.
The implementation of FILE_FLAG_NO_BUFFERING is optional and is determined by an FSD.
If part of the file is locked by another process and the write operation overlaps the locked portion, this function fails.
Accessing the output buffer while a write operation is using the buffer can corrupt the data written from that buffer. Applications must not read from, write to, reallocate, or free the output buffer that a write operation is using until the write operation completes.
The system interprets zero bytes to write as specifying a null write operation, and WriteFile does not truncate or extend the file. To truncate or extend a file, use the SetEndOfFile function.
Requirements
Header |
fsdmgr.h |
Library |
Fsdmgr.lib |
See Also
Reference
MyFSD Functions
CreateDirectory
CreateFile
FSDMGR_CreateFileHandle
FSDMGR_CreateSearchHandle
FSDMGR_RegisterVolume
ReadFile
SetEndOfFile
WriteFile