📄 file.c
字号:
BOOL FAT_ReadFilePagein(
PFHANDLE pfh,
LPVOID buffer,
DWORD nBytesToRead,
LPDWORD lpNumBytesRead,
LPOVERLAPPED lpOverlapped)
{
#ifdef DEMAND_PAGING
PDSTREAM pstm;
DWORD dwError;
pstm = pfh->fh_pstm;
ASSERT(pstm);
if (buffer == NULL && nBytesToRead == 0) {
if (pstm->s_pvol->v_pdsk->d_diActive.di_flags & DISK_INFO_FLAG_PAGEABLE) {
pstm->s_flags |= STF_DEMANDPAGED;
return TRUE; // yes, Pagein requests are supported
}
DEBUGMSG(TRUE,(DBGTEXT("FATFS!FAT_ReadFilePagein: driver declines to demand-page '%.11hs'\n"), pstm->s_achOEM));
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE; // but this little piggy cried all the way home
}
DEBUGMSG(ZONE_APIS,(DBGTEXT("FATFS!FAT_ReadFilePagein(0x%x,0x%x bytes,position 0x%x)\n"), pfh, nBytesToRead, pfh->fh_pos));
ASSERT(pstm->s_flags & STF_DEMANDPAGED);
if (dwError = FATFSReadFile(pfh, buffer, nBytesToRead, lpNumBytesRead, lpOverlapped, NULL, NULL))
SetLastError(dwError);
DEBUGMSG(ZONE_APIS || ZONE_ERRORS && dwError,
(DBGTEXT("FATFS!FAT_ReadFilePagein(0x%x) returned 0x%x (%d, 0x%x bytes, pos 0x%x, size 0x%x)\n"), pfh, dwError == ERROR_SUCCESS, dwError, *lpNumBytesRead, pfh->fh_pos, pstm->s_size));
return dwError == ERROR_SUCCESS;
#else
DEBUGMSG(TRUE,(DBGTEXT("FATFS!FAT_ReadFilePagein(0x%x,0x%x bytes,position 0x%x) is hard-coded to FAIL!\n"), pfh, nBytesToRead, pfh->fh_pos));
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
#endif
}
#endif
BOOL FAT_ReadFile(
PFHANDLE pfh,
LPVOID buffer,
DWORD nBytesToRead,
LPDWORD lpNumBytesRead,
LPOVERLAPPED lpOverlapped)
{
PDSTREAM pstm;
DWORD dwError;
pstm = pfh->fh_pstm;
ASSERT(pstm);
DEBUGMSG(ZONE_APIS,(DBGTEXT("FATFS!FAT_ReadFile(0x%x,0x%x bytes,position 0x%x)\n"), pfh, nBytesToRead, pfh->fh_pos));
if (!FATEnter(NULL, LOGID_NONE)) {
DEBUGMSG(ZONE_APIS || ZONE_ERRORS,(DBGTEXT("FATFS!FAT_ReadFile bailing...\n")));
return FALSE;
}
if (buffer)
LockPages(buffer,nBytesToRead,0,LOCKFLAG_WRITE);
if (dwError = FATFSReadFile(pfh, buffer, nBytesToRead, lpNumBytesRead, lpOverlapped, NULL, NULL))
SetLastError(dwError);
if (buffer)
UnlockPages(buffer,nBytesToRead);
FATExit(LOGID_NONE);
DEBUGMSG(ZONE_APIS || ZONE_ERRORS && dwError,
(DBGTEXT("FATFS!FAT_ReadFile(0x%x) returned 0x%x (%d, 0x%x bytes, pos 0x%x, size 0x%x)\n"), pfh, dwError == ERROR_SUCCESS, dwError, *lpNumBytesRead, pfh->fh_pos, pstm->s_size));
return dwError == ERROR_SUCCESS;
}
#if NUM_FILE_APIS > 13
BOOL FAT_ReadFileWithSeek(
PFHANDLE pfh,
LPVOID buffer,
DWORD nBytesToRead,
LPDWORD lpNumBytesRead,
LPOVERLAPPED lpOverlapped,
DWORD dwLowOffset,
DWORD dwHighOffset)
{
#ifdef DEMAND_PAGING
PDSTREAM pstm;
DWORD dwError;
pstm = pfh->fh_pstm;
ASSERT(pstm);
DEBUGMSG(ZONE_APIS,(DBGTEXT("FATFS!FAT_ReadFileWithSeek(0x%x,0x%x bytes,position 0x%x)\n"), pfh, nBytesToRead, dwLowOffset));
if (buffer == NULL && nBytesToRead == 0) {
if (pstm->s_pvol->v_pdsk->d_diActive.di_flags & DISK_INFO_FLAG_PAGEABLE) {
pstm->s_flags |= STF_DEMANDPAGED;
return TRUE; // yes, Pagein requests are supported
}
DEBUGMSG(TRUE,(DBGTEXT("FATFS!FAT_ReadFileWithSeek: driver declines to demand-page '%.11hs'\n"), pstm->s_achOEM));
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE; // but this little piggy cried all the way home
}
if (buffer)
LockPages(buffer,nBytesToRead,0,LOCKFLAG_WRITE);
do {
if (!FATEnter(NULL, LOGID_NONE))
return FALSE;
if ((pfh->fh_flags & FHF_FAILUI)){
FATExit(LOGID_NONE);
break;
}
dwError = FATFSReadFile(pfh, buffer, nBytesToRead, lpNumBytesRead, lpOverlapped, &dwLowOffset, &dwHighOffset);
FATExit(LOGID_NONE);
if (!dwError) {
// If the read was successful make sure the UI is (re)enabled.
pfh->fh_flags &= ~FHF_FAILUI;
break;
}
if (!WarnErrorVolume(pstm->s_pvol, dwError)) {
// The user said no...make sure we don't ask him again as it may take several
// trips through the unwinder before we clean up the mess.
pfh->fh_flags |= FHF_FAILUI;
SetLastError(dwError);
break;
}
} while (TRUE);
if (buffer)
UnlockPages(buffer,nBytesToRead);
DEBUGMSG(ZONE_APIS || ZONE_ERRORS && dwError,
(DBGTEXT("FATFS!FAT_ReadFileWithSeek(0x%x) returned 0x%x (%d, 0x%x bytes, size 0x%x)\n"), pfh, dwError == ERROR_SUCCESS, dwError, *lpNumBytesRead, pstm->s_size));
return dwError == ERROR_SUCCESS;
#else
DEBUGMSG(TRUE,(DBGTEXT("FATFS!FAT_ReadFileWithSeek(0x%x,0x%x bytes,position 0x%x) is hard-coded to FAIL!\n"), pfh, nBytesToRead, pfh->fh_pos));
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
#endif
}
#endif
BOOL FAT_WriteFile(
PFHANDLE pfh,
LPCVOID buffer,
DWORD nBytesToWrite,
LPDWORD lpNumBytesWritten,
LPOVERLAPPED lpOverlapped)
{
PDSTREAM pstm;
DWORD dwError;
pstm = pfh->fh_pstm;
ASSERT(pstm);
DEBUGMSG(ZONE_APIS,(DBGTEXT("FATFS!FAT_WriteFile(0x%x,0x%x bytes,position 0x%x)\n"), pfh, nBytesToWrite, pfh->fh_pos));
if (!FATEnter(pfh->fh_pstm->s_pvol, LOGID_WRITEFILE))
return FALSE;
if (buffer)
LockPages((LPVOID)buffer,nBytesToWrite,0,LOCKFLAG_READ);
if (dwError = FATFSWriteFile(pfh, buffer, nBytesToWrite, lpNumBytesWritten, lpOverlapped, NULL, NULL)) {
SetLastError(dwError);
}
UnlockPages((LPVOID)buffer,nBytesToWrite);
FATExit(LOGID_WRITEFILE);
DEBUGMSG(ZONE_APIS || ZONE_ERRORS && dwError,
(DBGTEXT("FATFS!FAT_WriteFile(0x%x) returned 0x%x (%d, 0x%x bytes, pos 0x%x, size 0x%x)\n"), pfh, dwError == ERROR_SUCCESS, dwError, *lpNumBytesWritten, pfh->fh_pos, pstm->s_size));
return dwError == ERROR_SUCCESS;
}
#if NUM_FILE_APIS > 13
BOOL FAT_WriteFileWithSeek(
PFHANDLE pfh,
LPCVOID buffer,
DWORD nBytesToWrite,
LPDWORD lpNumBytesWritten,
LPOVERLAPPED lpOverlapped,
DWORD dwLowOffset,
DWORD dwHighOffset)
{
#ifdef DEMAND_PAGING
PDSTREAM pstm;
DWORD dwError;
pstm = pfh->fh_pstm;
ASSERT(pstm);
DEBUGMSG(ZONE_APIS,(DBGTEXT("FATFS!FAT_WriteFileWithSeek(0x%x,0x%x bytes,position 0x%x)\n"), pfh, nBytesToWrite, dwLowOffset));
if (buffer)
LockPages((LPVOID)buffer,nBytesToWrite,0,LOCKFLAG_READ);
do {
if (!FATEnter(pfh->fh_pstm->s_pvol, LOGID_WRITEFILE)) {
if (buffer)
UnlockPages((LPVOID)buffer,nBytesToWrite);
return FALSE;
}
dwError = FATFSWriteFile(pfh, buffer, nBytesToWrite, lpNumBytesWritten, lpOverlapped, &dwLowOffset, &dwHighOffset);
FATExit(LOGID_WRITEFILE);
if (!dwError)
break;
if (!WarnErrorVolume(pstm->s_pvol, dwError)) {
SetLastError(dwError);
break;
}
} while (TRUE);
if (buffer)
UnlockPages((LPVOID)buffer,nBytesToWrite);
DEBUGMSG(ZONE_APIS || ZONE_ERRORS && dwError,
(DBGTEXT("FATFS!FAT_WriteFileWithSeek(0x%x) returned 0x%x (%d, 0x%x bytes, size 0x%x)\n"), pfh, dwError == ERROR_SUCCESS, dwError, *lpNumBytesWritten, pstm->s_size));
return dwError == ERROR_SUCCESS;
#else
DEBUGMSG(TRUE,(DBGTEXT("FATFS!FAT_WriteFileWithSeek(0x%x,0x%x bytes,position 0x%x) is hard-coded to FAIL!\n"), pfh, nBytesToWrite, pfh->fh_pos));
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
#endif
}
#endif
DWORD FAT_SetFilePointer(
PFHANDLE pfh,
LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod)
{
__int64 newPos;
PDSTREAM pstm;
DWORD dwError;
DWORD dwReturn = (DWORD)-1;
DEBUGMSG(ZONE_APIS,(DBGTEXT("FATFS!FAT_SetFilePointer(0x%x,offset 0x%x,method %d)\n"), pfh, lDistanceToMove, dwMoveMethod));
FATEnterQuick();
if (pfh->fh_flags & (FHF_VOLUME | FHF_UNMOUNTED)) {
dwError = ERROR_ACCESS_DENIED;
goto exit;
}
pstm = pfh->fh_pstm;
ASSERT(pstm);
dwError = ERROR_SUCCESS;
__try {
if (lpDistanceToMoveHigh) {
SetLastError(NO_ERROR);
newPos = (__int64)*lpDistanceToMoveHigh<<32 | (DWORD)lDistanceToMove;
*lpDistanceToMoveHigh = 0;
} else {
// As per the Win32 spec, if the FILE_BEGIN method is specified,
// the distance to move is interpreted as 32 (or 64)-bit UNSIGNED
// value, hence the DWORD cast to insure that the upper 32 bits
// of the __int64 newPos don't get set due to bogus sign-extension.
if (dwMoveMethod == FILE_BEGIN)
newPos = (DWORD)lDistanceToMove;
else
newPos = lDistanceToMove;
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
dwError = ERROR_INVALID_PARAMETER;
goto exit;
}
switch (dwMoveMethod) {
case FILE_BEGIN:
break;
case FILE_CURRENT:
newPos += pfh->fh_pos;
break;
case FILE_END:
newPos += pstm->s_size;
break;
default:
newPos = -1;
break;
}
if ((newPos >> 32) != 0)
dwError = ERROR_NEGATIVE_SEEK;
else
dwReturn = pfh->fh_pos = (DWORD)newPos;
exit:
if (dwError)
SetLastError(dwError);
FATExitQuick();
DEBUGMSG(ZONE_APIS || ZONE_ERRORS && dwError,(DBGTEXT("FATFS!FAT_SetFilePointer returned 0x%x (%d)\n"), dwReturn, dwError));
return dwReturn;
}
DWORD FAT_GetFileSize(PFHANDLE pfh, LPDWORD lpFileSizeHigh)
{
PDSTREAM pstm;
DWORD dwError;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -