Hi Team,

Findings on the below issue is as follows :-

I went ahead read about the shared access from *File System Behavior in the
Microsoft Windows Environment* DOCS
in which there is description of OPLOCK SEMANTICS.

Oplock Semantics
> 2.1 Overview
>
>> Opportunistic locks, or oplocks, provide a mechanism that allows file
>> server clients (such as those utilizing the SMB and SMB2 protocols) to
>> dynamically alter buffering strategy for a given file or stream in a
>> consistent manner to increase performance and to reduce network use. To
>> increase the network performance for remote file operations, a client can
>> locally buffer file data, which reduces or eliminates the need to send and
>> receive network packets. For example, a client may not have to write
>> information into a file on a remote server if the client knows that no
>> other process is accessing the data. Likewise, the client may buffer
>> read-ahead data from the remote file if the client knows that no other
>> process is writing data to the remote file. Applications and drivers can
>> also use oplocks to transparently access files without affecting other
>> applications that might need to use those files.
>> Oplocks are granted on stream handles, meaning that the operations apply
>> to the given open stream of a file and, in general, operations on one
>> stream do not affect oplocks on a different stream. There are exceptions to
>> this, which are explicitly listed below.
>> There are currently eight different types of oplocks:
>>
>>> 1. A Level 2 (or shared) oplock indicates that there are multiple
>>> readers of a stream and no writers. This supports client read caching.
>>> 2. A Level 1 (or exclusive) oplock allows a client to open a stream for
>>> exclusive access and allows the client to perform arbitrary buffering. This
>>> supports client read caching and write caching.
>>> 3. A Batch oplock (also exclusive) allows a client to keep a stream
>>> open on the server even though the local accessor on the client machine has
>>> closed the stream. This supports scenarios where the client needs to
>>> repeatedly open and close the same file, such as during batch script
>>> execution. This supports client read caching, write caching, and handle
>>> caching.
>>> 4. A Filter oplock (also exclusive) allows applications and file system
>>> filters (including minifilters), which open and read stream data, a way to
>>> “back out” when other applications, clients, or both try to access the same
>>> stream. This supports client read caching and write caching.
>>> 5. A Read (R) oplock (shared) indicates that there are multiple readers
>>> of a stream and no writers. This supports client read caching.
>>> 6. A Read-Handle (RH) oplock (shared) indicates that there are multiple
>>> readers of a stream, no writers, and that a client can keep a stream open
>>> on the server even though the local accessor on the client machine has
>>> closed the stream. This supports client read caching and handle caching.
>>> 7. A Read-Write (RW) oplock (exclusive) allows a client to open a stream
>>> for exclusive access and allows the client to perform arbitrary buffering.
>>> This supports client read caching and write caching.
>>> 8. A Read-Write-Handle (RWH) oplock (exclusive) allows a client to keep
>>> a stream open on the server even though the local accessor on the client
>>> machine has closed the stream. This supports client read caching, write
>>> caching, and handle caching.
>>> Level 1, Level 2, and Batch oplocks were implemented in Windows NT 3.1.
>>> The Filter oplock was added in Windows 2000. R, RH, RW, and RWH oplocks
>>> have been added in Windows 7.
>>
>>
Link of the above doc :
*http://download.microsoft.com/download/4/3/8/43889780-8d45-4b2e-9d3a-c696a890309f/file%20system%20behavior%20overview.pdf
<http://download.microsoft.com/download/4/3/8/43889780-8d45-4b2e-9d3a-c696a890309f/file%20system%20behavior%20overview.pdf>*

Guacamole VIRTUAL FILE DRIVE REDIRECTION hasn't implented it whereas
FreeRDP 2.0.0 has implemented it.

*Guacamole Code :*

> void guac_rdpdr_fs_process_create(guac_rdpdr_device* device,
>         wStream* input_stream, int completion_id) {
>     wStream* output_stream;
>     int file_id;
>     int desired_access, file_attributes, sharedAccess;
>     int create_disposition, create_options, path_length;
>     char path[GUAC_RDP_FS_MAX_PATH];
>     /* Read "create" information */
>     Stream_Read_UINT32(input_stream); /* Desired Access */
>     Stream_Seek_UINT64(input_stream); /* allocation size */
>     Stream_Read_UINT32(input_stream, file_attributes);
>     Stream_Read_UINT32(input_stream, sharedAccess); /* shared access */
>     Stream_Read_UINT32(input_stream, create_disposition);
>     Stream_Read_UINT32(input_stream, create_options);
>     Stream_Read_UINT32(input_stream, path_length);
> }

*FreeRDP 2.0.0 Code while creating or opening a file:-*

>
>         if (dwShareMode & FILE_SHARE_READ)
>                 lock.l_type = F_RDLCK;
>         if (dwShareMode & FILE_SHARE_WRITE)
>                 lock.l_type = F_RDLCK;
> #else
>         if (dwShareMode & FILE_SHARE_READ)
>                 lock = LOCK_SH;
>         if (dwShareMode & FILE_SHARE_WRITE)
>                 lock = LOCK_EX;
> #endif
>         if (dwShareMode & (FILE_SHARE_READ | FILE_SHARE_WRITE))
>         {
> #ifdef __sun
>                 if (fcntl(fileno(pFile->fp), F_SETLKW, &lock) == -1)
> #else
>                 if (flock(fileno(pFile->fp), lock) < 0)
> #endif
>                 {
> #ifdef __sun
>                         WLog_ERR(TAG, "F_SETLKW failed with %s [0x%08X]",
> #else
>                         WLog_ERR(TAG, "flock failed with %s [0x%08X]",
> #endif
>                                  strerror(errno), errno);
>                         SetLastError(map_posix_err(errno));
>                         FileCloseHandle(pFile);
>                         return INVALID_HANDLE_VALUE;
>                 }


I have tried mstsc and redirected the shared drive and tried to save the
file in it and it works whereas it fails in Guacamole Server Shared Drive [
For Info : I tried everywhere including download and outside the download
folder as well.]


I tried another solution also which provides RDP on browser and it works
fine.

I will try with *FreeRDP 2.0.0* and *FreeRDP 1.0.2*  client on windows as
well and update with you the same.

Thanks,
Amarjeet Singh




>
> On Wed, Feb 6, 2019 at 1:43 PM Amarjeet Singh <[email protected]>
> wrote:
>
>> If you are attempting to save the file directly into the "Download"
>>> folder,
>>> it is likely that the application is repeatedly closing and reopening the
>>> file over the course of saving things. As Guacamole will automatically
>>> delete the file and begin downloading once the file is closed, an
>>> application which behaves in this way will not work correctly. You will
>>> need to save the file elsewhere and then move it to the "Download"
>>> folder.
>>
>>
>> Thanks Mike for helping me out with this.
>>
>> I have tried to save the file instead of downloading in the Download
>> folder and got the same error.
>>
>> Thanks,
>> Amarjeet Singh
>>
>>
>>
>> On Wed, Feb 6, 2019 at 12:11 AM Mike Jumper <[email protected]> wrote:
>>
>>> On Tue, Feb 5, 2019 at 9:50 AM Amarjeet Singh <[email protected]>
>>> wrote:
>>>
>>> > ...
>>> > While trying to download pdf and rtf files in the local operating
>>> system [
>>> > Windows 10 ], I am getting the below error :-
>>> >
>>> > Report Builder *REP-0081* error during file i/o operation scaba 16
>>> >
>>> >
>>> > ... It is only writing *10 bytes* and corrupted pdf file is downloaded.
>>> >
>>>
>>> If you are attempting to save the file directly into the "Download"
>>> folder,
>>> it is likely that the application is repeatedly closing and reopening the
>>> file over the course of saving things. As Guacamole will automatically
>>> delete the file and begin downloading once the file is closed, an
>>> application which behaves in this way will not work correctly. You will
>>> need to save the file elsewhere and then move it to the "Download"
>>> folder.
>>>
>>> - Mike
>>>
>>

Reply via email to