MyFSD_ReadFileWithSeek (Windows CE 5.0)

Send Feedback

This function reads data from a file, starting at the position indicated by the caller. After the read operation has been completed, the file pointer is adjusted by the number of bytes actually read. This function is called only by the OS to implement paging services on your file system.

BOOL MyFSD_ReadFileWithSeek( PFILE pFile, PVOID pBuffer, DWORD cbRead, PDWORD pcbRead, OVERLAPPED* pOverlapped, DWORD dwLowOffset, DWORDdwHighOffset); 

Parameters

  • pFile
    [in] Pointer to the value that an FSD passes to the FSDMGR_CreateFileHandle function when creating the file handle.
  • pBuffer
    [out] Pointer to the buffer that receives the data read from the file.
  • cbRead
    [in] Number of bytes to be read from the file.
  • pcbRead
    [out] Pointer to the number of bytes read. The ReadFile function sets this value to zero before doing any work or error checking. This parameter cannot be NULL.
  • pOverlapped
    Not supported.
  • dwLowOffset
    [in] Low part of a 64-bit address that identifies the start position for the read.
  • dwHighOffset
    [in] High part of the 64bit address that identifies the start position of the read. Together the dwLowOffset and dwHighOffset form the 64bit address to begin the read.

Return Values

ReadFile returns when the number of bytes requested has been read or when an error occurs.

Nonzero indicates success. If the return value is nonzero and the number of bytes read is zero, the file pointer was beyond the current end of the file at the time of the read operation. Zero indicates failure. To get extended error information, call GetLastError.

Remarks

The lpOverlapped parameter must be set to NULL. The OS does not allow files to be created with the overlapped attribute.

The OS does not support asynchronous read operations on files.

The hFile parameter cannot be a socket handle.

If an FSD needs to support paging from the file system then this function must be implemented. If it is implemented, the pager and memory mapped file support utilize this function. If an FSD does not support paging from the file system, then 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 your FSD can support paging by making the following call: ReadFileWithSeek(oeptr->hf,0,0,0,0,0,0). If an FSD returns TRUE, then paging is supported for the file; otherwise, paging is not supported.

The Fsdmgr component is a DLL that manages all OS interaction with installable files systems. Each installable file system requires an FSD, which is a DLL that exports an API needed to support 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, then its DLL is MyFSD.dll and its exported functions are prefaced with MyFSD_*.

Fsdmgr provides services to FSDs. The FSDMGR_RegisterVolume, FSDMGR_CreateFileHandle, and FSDMGR_CreateSearchHandle functions record a DWORD of volume-specific data an FSD needs to keep associated with 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 wants to create a folder on a device that contains an installable file system, it calls CreateDirectory. 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.

If part of the file is locked by another process and the read operation overlaps the locked portion, this function fails.

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.

Accessing the input buffer while a read operation is using the buffer may lead to corruption of the data read into that buffer. Applications must not read from, write to, reallocate, or free the input buffer that a read operation is using until the read operation completes.

When reading from a communications device, the behavior of ReadFile is governed by the current communication time-outs as set and retrieved using the SetCommTimeouts and GetCommTimeouts functions. Unpredictable results can occur, if you fail to set the time-out values.

When a synchronous read operation reaches the end of a file, ReadFile returns TRUE and sets *lpNumberOfBytesRead to zero. The following code sample tests for end-of-file for a synchronous read operation.

// Attempt a synchronous read operation. 
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, NULL) ; 
// Check for end of file. 
if (bResult &&  nBytesRead == 0, ) 
{ 
    // The end of the file. 
} 

An asynchronous read operation can encounter the end of a file during the initiating call to ReadFile, or during subsequent asynchronous operation.

If end of file (EOF) is detected at ReadFile time for an asynchronous read operation, ReadFile returns FALSE and GetLastError returns ERROR_HANDLE_EOF.

Requirements

OS Versions: Windows CE 2.10 and later.
Header: Fsdmgr.h.
Link Library: Fsdmgr.lib.

See Also

CreateDirectory | FSDMGR_CreateFileHandle | FSDMGR_CreateSearchHandle | FSDMGR_RegisterVolume | GetCommTimeouts | MyFSD_CreateFileW | MyFSD_WriteFile | ReadFile | SetCommTimeouts | VirtualAlloc

Send Feedback on this topic to the authors

Feedback FAQs

© 2006 Microsoft Corporation. All rights reserved.