📄 file.c
字号:
if( gvpServerPB->fPosition > pFileData->fSize )
pFileData->fSize = gvpServerPB->fPosition;
Done:;
LeaveCriticalSection(&g_csMain);
DEBUGMSG( ZONE_APIS,( TEXT( "VCEFSD: -FSD_WriteFile" ) ) );
pFileData->fPosition += totalCount;
// Return bytes written...
*pNumBytesWritten = totalCount;
return( error == 0 );
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
DWORD VCEFSD_SetFilePointer( FileData* pFileData,
LONG lDistanceToMove,
PLONG pDistanceToMoveHigh,
DWORD dwMoveMethod )
{
LONG lPos = -1;
DEBUGMSG( ZONE_APIS,( TEXT( "VCEFSD: +FSD_SetFilePointer" ) ) );
EnterCriticalSection(&g_csMain);
// Why? Don't ask me...
if( pDistanceToMoveHigh )
*pDistanceToMoveHigh = 0;
// Verify the file handle
if( ValidateFileHandle( pFileData ) == FALSE )
goto Done;
// Compute the new position based on move method...
switch( dwMoveMethod )
{
case FILE_BEGIN:
{
lPos = pFileData->fPosition = lDistanceToMove;
break;
}
case FILE_CURRENT:
{
lPos = pFileData->fPosition += lDistanceToMove;
break;
}
case FILE_END :
{
lPos = pFileData->fPosition = pFileData->fSize - lDistanceToMove;
break;
}
default:
{
SetLastError(ERROR_INVALID_PARAMETER);
break;
}
}
SetLastError(NO_ERROR);
Done:;
LeaveCriticalSection(&g_csMain);
DEBUGMSG( ZONE_APIS,( TEXT( "VCEFSD: -FSD_SetFilePointer\n" ) ) );
return( lPos );
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
BOOL VCEFSD_ReadFileWithSeek( FileData* pFileData,
PBYTE pBuffer,
DWORD cbRead,
PDWORD pNumBytesRead,
LPOVERLAPPED lpOverlapped,
DWORD dwLowOffset,
DWORD dwHighOffset )
{
BOOL bRet;
DWORD lPos;
DEBUGCHK(pFileData != NULL);
// If pBuffer and cbRead are both zero we are supposed to return TRUE or FALSE
// to indicate whether we do or do not support paging.
if (pBuffer == NULL && cbRead == 0) {
return TRUE; // indicate that we support demand paging
}
EnterCriticalSection(&g_csMain);
lPos = VCEFSD_SetFilePointer( pFileData, dwLowOffset, NULL, FILE_BEGIN );
*pNumBytesRead = 0;
if (lPos == -1) {
bRet = FALSE;
} else {
bRet = VCEFSD_ReadFile( pFileData, pBuffer, cbRead, pNumBytesRead, NULL );
}
LeaveCriticalSection(&g_csMain);
return bRet;
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
BOOL VCEFSD_WriteFileWithSeek( FileData* pFileData,
PBYTE pBuffer,
DWORD cbWrite,
PDWORD pNumBytesWritten,
LPOVERLAPPED lpOverlapped,
DWORD dwLowOffset,
DWORD dwHighOffset )
{
BOOL bRet;
DWORD lPos;
DEBUGMSG(ZONE_APIS, (TEXT("VCEFSD: FSD_WriteFileWithSeek\n")));
*pNumBytesWritten = 0;
EnterCriticalSection(&g_csMain);
lPos = VCEFSD_SetFilePointer( pFileData, dwLowOffset, NULL, FILE_BEGIN );
if( lPos == -1 ) {
bRet = FALSE;
} else {
bRet = VCEFSD_WriteFile( pFileData, pBuffer, cbWrite, pNumBytesWritten, NULL );
}
LeaveCriticalSection(&g_csMain);
return bRet;
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
DWORD VCEFSD_GetFileSize( FileData* pFileData,
PDWORD pFileSizeHigh)
{
LONG lSize;
DEBUGMSG(ZONE_APIS, (TEXT("VCEFSD: FSD_GetFileSize\n")));
EnterCriticalSection(&g_csMain);
lSize = pFileData->fSize;
LeaveCriticalSection(&g_csMain);
if (pFileSizeHigh) // Gack!
*pFileSizeHigh = 0;
return lSize;
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
BOOL VCEFSD_GetFileInformationByHandle( FileData* pFileData,
PBY_HANDLE_FILE_INFORMATION pFileInfo)
{
DEBUGMSG(ZONE_APIS, (TEXT("VCEFSD: FSD_GetFileInformationByHandle\n")));
memset(pFileInfo, 0, sizeof(*pFileInfo));
pFileInfo->dwFileAttributes = pFileData->fFileAttributes;
pFileInfo->dwVolumeSerialNumber = (DWORD)pFileData->pVolumeState;
pFileInfo->nFileSizeLow = pFileData->fSize;
pFileInfo->nNumberOfLinks = 1;
pFileInfo->dwOID = (DWORD)INVALID_HANDLE_VALUE;
return TRUE;
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
BOOL VCEFSD_FlushFileBuffers( FileData* pFileData )
{
return TRUE;
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
BOOL VCEFSD_GetFileTime( FileData* pFileData,
PFILETIME pCreation,
PFILETIME pLastAccess,
PFILETIME pLastWrite )
{
BOOL fSuccess = FALSE;
DEBUGMSG(ZONE_APIS, (TEXT("VCEFSD: FSD_GetFileTime\n")));
EnterCriticalSection(&g_csMain);
if( pCreation != NULL )
{
LongToFileTime( pFileData->fFileCreateTimeDate, pCreation );
fSuccess = TRUE;
}
if( pLastAccess != NULL )
{
LongToFileTime( pFileData->fFileTimeDate, pLastAccess );
fSuccess = TRUE;
}
if( pLastWrite != NULL )
{
LongToFileTime( pFileData->fFileTimeDate, pLastWrite );
fSuccess = TRUE;
}
LeaveCriticalSection(&g_csMain);
return fSuccess;
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
BOOL VCEFSD_SetFileTime( FileData* pFileData,
PFILETIME pCreation,
PFILETIME pLastAccess,
PFILETIME pLastWrite )
{
BOOL fSuccess = FALSE;
DEBUGMSG(ZONE_APIS, (TEXT("VCEFSD: FSD_SetFileTime\n")));
EnterCriticalSection(&g_csMain);
if( pCreation != NULL )
{
pFileData->fFileCreateTimeDate = FileTimeToLong( pCreation );
fSuccess = TRUE;
}
if( pLastWrite != NULL )
{
pFileData->fFileTimeDate = FileTimeToLong( pLastWrite );
fSuccess = TRUE;
}
LeaveCriticalSection(&g_csMain);
return fSuccess;
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
BOOL VCEFSD_SetEndOfFile( FileData* pFileData )
{
VolumeState* pVolumeState;
BOOL fSuccess = FALSE;
DEBUGMSG(ZONE_APIS, (TEXT("VCEFSD: FSD_SetEndOfFile\n")));
EnterCriticalSection(&g_csMain);
pVolumeState =( VolumeState* )pFileData->fResHandle;
// Init PB
memset( gvpServerPB, 0, sizeof(ServerPB) );
gvpServerPB->fStructureSize = sizeof(ServerPB);
gvpServerPB->fHandle = pFileData->fHandle;
gvpServerPB->fPosition = pFileData->fPosition;
gvpServerPB->fSize = pFileData->fSize;
if( ServerSetEOF( gvpServerPB ) == 0 ) {
fSuccess = TRUE;
pFileData->fSize = gvpServerPB->fSize;
}
LeaveCriticalSection(&g_csMain);
return fSuccess;
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
BOOL LongToFileTime( LONG longTime, PFILETIME pft )
{
FILETIME ft;
SYSTEMTIME st;
WORD dosDate;
WORD dosTime;
dosTime = LOWORD(longTime);
dosDate = HIWORD(longTime);
st.wYear = (dosDate >> 9) + 1980;
st.wMonth = (dosDate >> 5) & 0xf;
st.wDayOfWeek = 0;
st.wDay = dosDate & 0x1f;
st.wHour = dosTime >> 11;
st.wMinute = (dosTime >> 5) & 0x3f;
st.wSecond = (dosTime & 0x1f) << 1;
st.wMilliseconds = 0;
if (SystemTimeToFileTime(&st, &ft))
{
if (LocalFileTimeToFileTime(&ft, pft))
{
return TRUE;
}
}
return FALSE;
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
LONG FileTimeToLong( PFILETIME pft )
{
FILETIME ft;
SYSTEMTIME st;
WORD dosDate;
WORD dosTime;
LONG outTime = 0;
if( FileTimeToLocalFileTime(pft, &ft) )
{
if( FileTimeToSystemTime(&ft, &st) )
{
dosDate = ((st.wYear-1980) << 9) | (st.wMonth << 5) | (st.wDay);
dosTime = (st.wHour << 11) | (st.wMinute << 5) | (st.wSecond >> 1);
outTime = MAKELONG(dosTime,dosDate);
}
}
return outTime;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -