MyFSD_ReadFile

This function reads data from a file, starting at the position indicated by the file pointer. After the read operation has been completed, the file pointer is adjusted by the number of bytes actually read. The application does not call this function directly. Instead, use the corresponding standard Win32 function ReadFile. The file system driver (FSD) Manager determines the file system type and calls the MyFSD_ReadFile implementation of the function.

At a Glance

Header file: Fsdmgr.h
Windows CE versions: 2.10 and later

Syntax

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

Parameters

pFile

Pointer to the value that the file system driver (FSD) passes to the FSDMGR_CreateFileHandle function when creating the file handle.

pBuffer

Pointer to the buffer that receives the data read from the file.

cbRead

Number of bytes to be read from the file.

pcbRead

Pointer to the number of bytes read. ReadFile sets this value to zero before doing any work or error checking. This parameter cannot be NULL.

pOverlapped

Unsupported; set to NULL.

Return Values

The ReadFile function returns when one of the following is true: the number of bytes requested has been read or 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

Windows CE does not support asynchronous read operations on files.

An FSD exports this function if it wants to support the ReadFile function. All FSD functions can be called reentryly, therefore, FSD developers must take this into account when developing an FSD.

The Fsdmgr component is a dynamic-link library (DLL) that manages all operating system 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 the 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.That is, 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 certain requirements when working with files opened with FILE_FLAG_NO_BUFFERING:

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. For more information about communication time-outs, see COMMTIMEOUTS.

When a synchronous read operation reaches the end of a file, ReadFile returns TRUE and sets *lpNumberOfBytesRead to zero. The following sample code 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, ) 
{ 
    // we’re at the end of the file 
} 
 

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

See Also

FSDMGR_CreateFileHandle, MyFSD_CreateFileW, MyFSD_WriteFile