147 lines
5.5 KiB
C
147 lines
5.5 KiB
C
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "channels/rdpdr/rdpdr-messages.h"
|
|
#include "channels/rdpdr/rdpdr.h"
|
|
#include "fs.h"
|
|
|
|
#include <guacamole/unicode.h>
|
|
#include <winpr/file.h>
|
|
#include <winpr/stream.h>
|
|
#include <winpr/wtypes.h>
|
|
|
|
void guac_rdpdr_fs_process_query_volume_info(guac_rdp_common_svc* svc,
|
|
guac_rdpdr_device* device, wStream* input_stream, int file_id,
|
|
int completion_id) {
|
|
|
|
wStream* output_stream = guac_rdpdr_new_io_completion(device,
|
|
completion_id, STATUS_SUCCESS, 21 + GUAC_FILESYSTEM_LABEL_LENGTH);
|
|
|
|
guac_client_log(svc->client, GUAC_LOG_DEBUG,
|
|
"%s: [file_id=%i]",
|
|
__func__, file_id);
|
|
|
|
Stream_Write_UINT32(output_stream, 17 + GUAC_FILESYSTEM_LABEL_LENGTH);
|
|
Stream_Write_UINT64(output_stream, 0); /* VolumeCreationTime */
|
|
Stream_Write_UINT32(output_stream, 0); /* VolumeSerialNumber */
|
|
Stream_Write_UINT32(output_stream, GUAC_FILESYSTEM_LABEL_LENGTH);
|
|
Stream_Write_UINT8(output_stream, FALSE); /* SupportsObjects */
|
|
/* Reserved field must not be sent */
|
|
Stream_Write(output_stream, GUAC_FILESYSTEM_LABEL, GUAC_FILESYSTEM_LABEL_LENGTH);
|
|
|
|
guac_rdp_common_svc_write(svc, output_stream);
|
|
|
|
}
|
|
|
|
void guac_rdpdr_fs_process_query_size_info(guac_rdp_common_svc* svc,
|
|
guac_rdpdr_device* device, wStream* input_stream, int file_id,
|
|
int completion_id) {
|
|
|
|
guac_rdp_fs_info info = {0};
|
|
guac_rdp_fs_get_info((guac_rdp_fs*) device->data, &info);
|
|
|
|
wStream* output_stream = guac_rdpdr_new_io_completion(device,
|
|
completion_id, STATUS_SUCCESS, 28);
|
|
|
|
guac_client_log(svc->client, GUAC_LOG_DEBUG,
|
|
"%s: [file_id=%i]",
|
|
__func__, file_id);
|
|
|
|
Stream_Write_UINT32(output_stream, 24);
|
|
Stream_Write_UINT64(output_stream, info.blocks_total); /* TotalAllocationUnits */
|
|
Stream_Write_UINT64(output_stream, info.blocks_available); /* AvailableAllocationUnits */
|
|
Stream_Write_UINT32(output_stream, 1); /* SectorsPerAllocationUnit */
|
|
Stream_Write_UINT32(output_stream, info.block_size); /* BytesPerSector */
|
|
|
|
guac_rdp_common_svc_write(svc, output_stream);
|
|
|
|
}
|
|
|
|
void guac_rdpdr_fs_process_query_device_info(guac_rdp_common_svc* svc,
|
|
guac_rdpdr_device* device, wStream* input_stream, int file_id,
|
|
int completion_id) {
|
|
|
|
wStream* output_stream = guac_rdpdr_new_io_completion(device,
|
|
completion_id, STATUS_SUCCESS, 12);
|
|
|
|
guac_client_log(svc->client, GUAC_LOG_DEBUG,
|
|
"%s: [file_id=%i]",
|
|
__func__, file_id);
|
|
|
|
Stream_Write_UINT32(output_stream, 8);
|
|
Stream_Write_UINT32(output_stream, FILE_DEVICE_DISK); /* DeviceType */
|
|
Stream_Write_UINT32(output_stream, 0); /* Characteristics */
|
|
|
|
guac_rdp_common_svc_write(svc, output_stream);
|
|
|
|
}
|
|
|
|
void guac_rdpdr_fs_process_query_attribute_info(guac_rdp_common_svc* svc,
|
|
guac_rdpdr_device* device, wStream* input_stream, int file_id,
|
|
int completion_id) {
|
|
|
|
int name_len = guac_utf8_strlen(device->device_name);
|
|
|
|
wStream* output_stream = guac_rdpdr_new_io_completion(device,
|
|
completion_id, STATUS_SUCCESS, 16 + name_len);
|
|
|
|
guac_client_log(svc->client, GUAC_LOG_DEBUG,
|
|
"%s: [file_id=%i]",
|
|
__func__, file_id);
|
|
|
|
Stream_Write_UINT32(output_stream, 12 + name_len);
|
|
Stream_Write_UINT32(output_stream,
|
|
FILE_UNICODE_ON_DISK
|
|
| FILE_CASE_SENSITIVE_SEARCH
|
|
| FILE_CASE_PRESERVED_NAMES); /* FileSystemAttributes */
|
|
Stream_Write_UINT32(output_stream, GUAC_RDP_FS_MAX_PATH ); /* MaximumComponentNameLength */
|
|
Stream_Write_UINT32(output_stream, name_len);
|
|
Stream_Write(output_stream, device->device_name, name_len);
|
|
|
|
guac_rdp_common_svc_write(svc, output_stream);
|
|
|
|
}
|
|
|
|
void guac_rdpdr_fs_process_query_full_size_info(guac_rdp_common_svc* svc,
|
|
guac_rdpdr_device* device, wStream* input_stream, int file_id,
|
|
int completion_id) {
|
|
|
|
guac_rdp_fs_info info = {0};
|
|
guac_rdp_fs_get_info((guac_rdp_fs*) device->data, &info);
|
|
|
|
wStream* output_stream = guac_rdpdr_new_io_completion(device,
|
|
completion_id, STATUS_SUCCESS, 36);
|
|
|
|
guac_client_log(svc->client, GUAC_LOG_DEBUG,
|
|
"%s: [file_id=%i]",
|
|
__func__, file_id);
|
|
|
|
Stream_Write_UINT32(output_stream, 32);
|
|
Stream_Write_UINT64(output_stream, info.blocks_total); /* TotalAllocationUnits */
|
|
Stream_Write_UINT64(output_stream, info.blocks_available); /* CallerAvailableAllocationUnits */
|
|
Stream_Write_UINT64(output_stream, info.blocks_available); /* ActualAvailableAllocationUnits */
|
|
Stream_Write_UINT32(output_stream, 1); /* SectorsPerAllocationUnit */
|
|
Stream_Write_UINT32(output_stream, info.block_size); /* BytesPerSector */
|
|
|
|
guac_rdp_common_svc_write(svc, output_stream);
|
|
|
|
}
|
|
|