📄 file.c
字号:
LongToFileTime( gvpServerPB->fFileTimeDate, &changeInfo.ftModified );
changeInfo.nFileSize = gvpServerPB->fSize;
if( gpnShellNotify != NULL )
gpnShellNotify( &changeInfo );
}
gvpServerPB->fOpenMode = kOpenShareCompatibility;
switch ( dwAccess )
{
case GENERIC_READ | GENERIC_WRITE:
gvpServerPB->fOpenMode |= kOpenAccessReadWrite;
break;
case GENERIC_READ:
gvpServerPB->fOpenMode |= kOpenAccessReadOnly;
break;
case GENERIC_WRITE:
gvpServerPB->fOpenMode |= kOpenAccessWriteOnly;
break;
default:
break;
}
switch( dwShareMode )
{
case FILE_SHARE_READ | FILE_SHARE_WRITE:
gvpServerPB->fOpenMode |= kOpenShareDenyNone;
break;
case FILE_SHARE_READ:
gvpServerPB->fOpenMode |= kOpenShareDenyWrite;
break;
case FILE_SHARE_WRITE:
gvpServerPB->fOpenMode |= kOpenShareDenyRead;
break;
default :
gvpServerPB->fOpenMode |= kOpenShareDenyReadWrite;
break;
}
if( ServerOpen( gvpServerPB ) == 0 )
{
// Allocate and initialize a FileData struct
pFileData = AllocFileData();
if( pFileData )
{
pFileData->fResHandle =( void* )pVolumeState;
pFileData->fHandle = gvpServerPB->fHandle;
pFileData->fPosition = 0;
pFileData->fSize = gvpServerPB->fSize;
pFileData->fWritten = FALSE;
lstrcpyW( pFileData->fFileName, lpFileName );
if( create &&( dwFlagsAndAttributes & FILE_ATTRIBUTE_READONLY ) )
pFileData->fSetAttrOnClose = TRUE;
else
pFileData->fSetAttrOnClose = FALSE;
pFileData->fFileAttributes = ( gvpServerPB->fFileAttributes & 0xFFFF );
pFileData->fFileTimeDate = gvpServerPB->fFileTimeDate;
pFileData->fFileCreateTimeDate = gvpServerPB->fFileCreateTimeDate;
pFileData->pVolumeState = pVolumeState;
}
else
{
ServerClose( gvpServerPB );
}
}
else
{
error = ERROR_ACCESS_DENIED;
}
}
// If we failed, zero all the return items
if( error == NO_ERROR )
{
hFile = FSDMGR_CreateFileHandle( pVolumeState->vs_Handle, hProc,( ulong )pFileData );
SetLastError( NO_ERROR );
}
else
{
SetLastError( error );
}
LeaveCriticalSection(&g_csMain);
DEBUGMSG( ZONE_APIS,( TEXT( "VCEFSD: -FSD_CreateFileW\n" ) ) );
return hFile;
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
BOOL VCEFSD_CloseFile( FileData* pFileData )
{
VolumeState* pVolumeState;
int error = -1;
FILECHANGEINFO changeInfo;
WCHAR fullFilePathname[MAX_PATH];
DEBUGMSG( ZONE_APIS,( TEXT( "VCEFSD: +FSD_CloseFile\n" ) ) );
EnterCriticalSection(&g_csMain);
// Verify the file handle
if( ValidateFileHandle( pFileData ) == FALSE )
goto Done;
pVolumeState =( VolumeState* )pFileData->fResHandle;
// Fill in the parameter block for the ServerSetAttributes call
memset( gvpServerPB, 0, sizeof(ServerPB));
gvpServerPB->fStructureSize = sizeof(ServerPB);
gvpServerPB->fHandle = pFileData->fHandle;
error = ServerGetFCBInfo( gvpServerPB );
if( error == 0 )
{
// Close the file
gvpServerPB->fHandle = pFileData->fHandle;
error = ServerClose( gvpServerPB );
// If we need to update the attributes, do so
if( error == 0 && ( pFileData->fWritten || pFileData->fSetAttrOnClose ) )
{
gvpServerPB->fFileTimeDate = pFileData->fFileTimeDate;
gvpServerPB->fFileCreateTimeDate = pFileData->fFileCreateTimeDate;
gvpServerPB->fFileAttributes =( BYTE ) pFileData->fFileAttributes;
ServerSetAttributes( gvpServerPB );
// Set up notify...
changeInfo.cbSize = sizeof( FILECHANGEINFO );
changeInfo.wEventId = SHCNE_UPDATEITEM;
changeInfo.uFlags = SHCNF_PATH|SHCNF_FLUSHNOWAIT;
// Get full file path name...
FSDMGR_GetVolumeName( pFileData->pVolumeState->vs_Handle, fullFilePathname, MAX_PATH );
wcscat( fullFilePathname, pFileData->fFileName );
changeInfo.dwItem1 = (DWORD)fullFilePathname;
changeInfo.dwItem2 = (DWORD)NULL;
changeInfo.dwAttributes = gvpServerPB->fFileAttributes;
LongToFileTime( gvpServerPB->fFileTimeDate, &changeInfo.ftModified );
changeInfo.nFileSize = gvpServerPB->fSize;
if( gpnShellNotify != NULL )
gpnShellNotify( &changeInfo );
}
// Destroy the file data
FreeFileData( pFileData );
}
Done:;
LeaveCriticalSection(&g_csMain);
DEBUGMSG( ZONE_APIS,( TEXT( "VCEFSD: -FS_Close" ) ) );
return( error == 0 );
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
BOOL VCEFSD_ReadFile( FileData* pFileData,
PBYTE pBuffer,
DWORD cbRead,
PDWORD pNumBytesRead,
LPOVERLAPPED lpOverlapped )
{
VolumeState* pVolumeState;
ULONG xferCount;
ULONG totalCount = 0;
ULONG countLeft = 0;
int error = -1;
PBYTE fDTAPtr;
DEBUGMSG( ZONE_APIS,( TEXT( "VCEFSD: +FS_ReadFile" ) ) );
EnterCriticalSection(&g_csMain);
*pNumBytesRead = 0;
// Verify the file handle
if( ValidateFileHandle( pFileData ) == FALSE )
goto Done;
pVolumeState =( VolumeState* )pFileData->fResHandle;
// Fill in the parameter block...
memset( gvpServerPB, 0, sizeof(ServerPB));
gvpServerPB->fStructureSize = sizeof(ServerPB);
gvpServerPB->fHandle = pFileData->fHandle;
// Make sure we do not read beyond the file
if( pFileData->fPosition >= pFileData->fSize )
{
countLeft = 0;
error = 0; // return non-error on read past EOF
}
else if( ( pFileData->fPosition + cbRead ) > pFileData->fSize )
{
countLeft = pFileData->fSize - pFileData->fPosition;
}
else
{
countLeft = cbRead;
}
if( countLeft )
{
fDTAPtr = pBuffer;
//WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!!
gvpServerPB->fDTAPtr = gpReadWriteBuffer; // store physical addr. of our global data buffer
gvpServerPB->fPosition = pFileData->fPosition;
// Read the data
while( countLeft )
{
if( countLeft > kMaxReadWriteSize )
xferCount = kMaxReadWriteSize;
else
xferCount = countLeft;
gvpServerPB->fSize = xferCount;
error = ServerRead( gvpServerPB );
if( error != 0 )
break;
gvpServerPB->fPosition += gvpServerPB->fSize;
memcpy( fDTAPtr, gvpReadWriteBuffer, gvpServerPB->fSize );
fDTAPtr += gvpServerPB->fSize;
totalCount += gvpServerPB->fSize;
countLeft -= gvpServerPB->fSize;
if( gvpServerPB->fSize < xferCount )
break;
}
} else {
// 0-byte read request should return success.
// Otherwise, Pocket Excel is unable to open its files.
error = 0;
}
Done:
LeaveCriticalSection(&g_csMain);
DEBUGMSG( ZONE_APIS,( TEXT( "VCEFSD: -FS_ReadFile" ) ) );
pFileData->fPosition += totalCount;
// Return bytes read...
*pNumBytesRead = totalCount;
return( error == 0 );
}
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
BOOL VCEFSD_WriteFile( FileData* pFileData,
LPCVOID pBuffer,
DWORD cbWrite,
PDWORD pNumBytesWritten,
LPOVERLAPPED lpOverlapped )
{
VolumeState* pVolumeState;
ULONG xferCount;
ULONG totalCount = 0;
ULONG countLeft = 0;
int error = -1;
PBYTE fDTAPtr;
DEBUGMSG( ZONE_APIS,( TEXT( "VCEFSD: +FSD_WriteFile" ) ) );
EnterCriticalSection(&g_csMain);
*pNumBytesWritten = 0;
// Verify the file handle
if( ValidateFileHandle( pFileData ) == FALSE )
goto Done;
pVolumeState =( VolumeState* )pFileData->fResHandle;
// Fill in the parameter block...
memset( gvpServerPB, 0, sizeof(ServerPB));
gvpServerPB->fStructureSize = sizeof(ServerPB);
gvpServerPB->fHandle = pFileData->fHandle;
countLeft = cbWrite;
gvpServerPB->fPosition = pFileData->fPosition;
// Write or set EOF...
if( countLeft == 0 )
{
error = ServerSetEOF( gvpServerPB );
if( error == 0 )
{
pFileData->fSize = pFileData->fPosition;
}
else
{
goto Done;
}
}
else if( countLeft )
{
//WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!!
gvpServerPB->fDTAPtr = gpReadWriteBuffer; // store physical addr.
fDTAPtr = ( LPVOID )( pBuffer );
// Read the data...
while( countLeft )
{
if( countLeft > kMaxReadWriteSize )
xferCount = kMaxReadWriteSize;
else
xferCount = countLeft;
gvpServerPB->fSize = xferCount;
memcpy( gvpReadWriteBuffer, fDTAPtr, gvpServerPB->fSize );
error = ServerWrite( gvpServerPB );
if( error != 0 )
break;
pFileData->fWritten = TRUE;
gvpServerPB->fPosition += gvpServerPB->fSize;
fDTAPtr += gvpServerPB->fSize;
totalCount += gvpServerPB->fSize;
countLeft -= gvpServerPB->fSize;
if( gvpServerPB->fSize < xferCount )
break;
}
}
// Set new size if required...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -