⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 我自己编译的armv4i wince60模拟器的bps源文件,已经验证可以使用,欢迎下载
💻 C
📖 第 1 页 / 共 3 页
字号:
            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 + -