// Writes data to a file (asynchronous overload). AKRESULT CAkDefaultIOHookDeferred::Write( AkFileDesc & in_fileDesc, // File descriptor. const AkIoHeuristics & /*in_heuristics*/, // Heuristics for this data transfer (not used in this implementation). AkAsyncIOTransferInfo & io_transferInfo // Platform-specific asynchronous IO operation info. ) { assert( in_fileDesc.hFile != INVALID_HANDLE_VALUE && io_transferInfo.uRequestedSize > 0 ); // If this assert comes up, it might be beacause this hook's GetBlockSize() return value is incompatible // with the system's handling of file reading for this specific file handle. // Are you using the File Package Low-Level I/O with incompatible block size? (check -blocksize argument in the File Packager command line) assert( io_transferInfo.uFilePosition % WIN32_NO_BUFFERING_BLOCK_SIZE == 0 || !"Requested file position for I/O transfer is inconsistent with block size" ); OVERLAPPED * pOverlapped = GetFreeOverlapped( &io_transferInfo ); // Set file offset in OVERLAPPED structure. pOverlapped->Offset = (DWORD)( io_transferInfo.uFilePosition & 0xFFFFFFFF ); pOverlapped->OffsetHigh = (DWORD)( ( io_transferInfo.uFilePosition >> 32 ) & 0xFFFFFFFF ); // File was open with asynchronous flag. // Read overlapped. if ( ::WriteFileEx( in_fileDesc.hFile, io_transferInfo.pBuffer, io_transferInfo.uRequestedSize, pOverlapped, CAkDefaultIOHookDeferred::FileIOCompletionRoutine ) ) { return AK_Success; } return AK_Fail; }
// Reads data from a file (asynchronous overload). AKRESULT CAkDefaultIOHookDeferred::Read( AkFileDesc & in_fileDesc, // File descriptor. const AkIoHeuristics & /*in_heuristics*/, // Heuristics for this data transfer (not used in this implementation). AkAsyncIOTransferInfo & io_transferInfo // Asynchronous data transfer info. ) { AKASSERT( in_fileDesc.hFile != INVALID_HANDLE_VALUE && io_transferInfo.uRequestedSize > 0 && io_transferInfo.uBufferSize >= io_transferInfo.uRequestedSize ); // If this assert comes up, it might be beacause this hook's GetBlockSize() return value is incompatible // with the system's handling of file reading for this specific file handle. // If you are using the File Package extension, did you create your package with a compatible // block size? It should be a multiple of WIN32_NO_BUFFERING_BLOCK_SIZE. (check -blocksize argument in the File Packager command line) AKASSERT( ( io_transferInfo.uFilePosition % WIN32_NO_BUFFERING_BLOCK_SIZE ) == 0 || !"Requested file position for I/O transfer is inconsistent with block size" ); OVERLAPPED * pOverlapped = GetFreeOverlapped( &io_transferInfo ); // Set file offset in OVERLAPPED structure. pOverlapped->Offset = (DWORD)( io_transferInfo.uFilePosition & 0xFFFFFFFF ); pOverlapped->OffsetHigh = (DWORD)( ( io_transferInfo.uFilePosition >> 32 ) & 0xFFFFFFFF ); // File was open with asynchronous flag. // Read overlapped. // Note: With a file handle opened with FILE_FLAG_NO_BUFFERING, ::ReadFileEx() supports read sizes that go beyond the end // of file. However, it does not support read sizes that are not a multiple of the drive's sector size. // Since the buffer size is always a multiple of the block size, let's use io_transferInfo.uBufferSize // instead of io_transferInfo.uRequestedSize. if ( ::ReadFileEx( in_fileDesc.hFile, io_transferInfo.pBuffer, io_transferInfo.uBufferSize, pOverlapped, CAkDefaultIOHookDeferred::FileIOCompletionRoutine ) ) { return AK_Success; } ReleaseOverlapped( pOverlapped ); return AK_Fail; }