void guac_rdpdr_fs_process_query_basic_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream; guac_rdp_fs_file* file; /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; GUAC_RDP_DEBUG(2, "[file_id=%i]", file_id); output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 40); Stream_Write_UINT32(output_stream, 36); Stream_Write_UINT64(output_stream, file->ctime); /* CreationTime */ Stream_Write_UINT64(output_stream, file->atime); /* LastAccessTime */ Stream_Write_UINT64(output_stream, file->mtime); /* LastWriteTime */ Stream_Write_UINT64(output_stream, file->mtime); /* ChangeTime */ Stream_Write_UINT32(output_stream, file->attributes); /* FileAttributes */ /* Reserved field must not be sent */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }
void guac_rdpdr_fs_process_query_standard_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream; guac_rdp_fs_file* file; BOOL is_directory = FALSE; /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; GUAC_RDP_DEBUG(2, "[file_id=%i]", file_id); if (file->attributes & FILE_ATTRIBUTE_DIRECTORY) is_directory = TRUE; output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 26); Stream_Write_UINT32(output_stream, 22); Stream_Write_UINT64(output_stream, file->size); /* AllocationSize */ Stream_Write_UINT64(output_stream, file->size); /* EndOfFile */ Stream_Write_UINT32(output_stream, 1); /* NumberOfLinks */ Stream_Write_UINT8(output_stream, 0); /* DeletePending */ Stream_Write_UINT8(output_stream, is_directory); /* Directory */ /* Reserved field must not be sent */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }
void guac_rdpdr_fs_process_set_end_of_file_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length) { int result; UINT64 size; wStream* output_stream; /* Read new size */ Stream_Read_UINT64(input_stream, size); /* AllocationSize */ GUAC_RDP_DEBUG(2, "[file_id=%i] size=%" PRIu64, file_id, (uint64_t) size); /* Truncate file */ result = guac_rdp_fs_truncate((guac_rdp_fs*) device->data, file_id, size); if (result < 0) output_stream = guac_rdpdr_new_io_completion(device, completion_id, guac_rdp_fs_get_status(result), 4); else output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); Stream_Write_UINT32(output_stream, length); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }
void guac_rdpdr_fs_process_query_attribute_tag_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream; guac_rdp_fs_file* file; /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; GUAC_RDP_DEBUG(2, "[file_id=%i]", file_id); output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 12); Stream_Write_UINT32(output_stream, 8); Stream_Write_UINT32(output_stream, file->attributes); /* FileAttributes */ Stream_Write_UINT32(output_stream, 0); /* ReparseTag */ /* Reserved field must not be sent */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }
void guac_rdpdr_fs_process_set_rename_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length) { int result; int filename_length; wStream* output_stream; char destination_path[GUAC_RDP_FS_MAX_PATH]; /* Read structure */ Stream_Seek_UINT8(input_stream); /* ReplaceIfExists */ Stream_Seek_UINT8(input_stream); /* RootDirectory */ Stream_Read_UINT32(input_stream, filename_length); /* FileNameLength */ /* Convert name to UTF-8 */ guac_rdp_utf16_to_utf8(Stream_Pointer(input_stream), filename_length/2, destination_path, sizeof(destination_path)); GUAC_RDP_DEBUG(2, "[file_id=%i] destination_path=\"%s\"", file_id, destination_path); /* If file moving to \Download folder, start stream, do not move */ if (strncmp(destination_path, "\\Download\\", 10) == 0) { guac_rdp_fs_file* file; /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; /* Initiate download, pretend move succeeded */ guac_rdpdr_start_download(device, file->absolute_path); output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); } /* Otherwise, rename as requested */ else { result = guac_rdp_fs_rename((guac_rdp_fs*) device->data, file_id, destination_path); if (result < 0) output_stream = guac_rdpdr_new_io_completion(device, completion_id, guac_rdp_fs_get_status(result), 4); else output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); } Stream_Write_UINT32(output_stream, length); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }
void guac_rdpdr_start_download(guac_rdpdr_device* device, const char* path) { /* Get client and stream */ guac_client* client = device->rdpdr->client; int file_id = guac_rdp_fs_open((guac_rdp_fs*) device->data, path, ACCESS_FILE_READ_DATA, 0, DISP_FILE_OPEN, 0); /* If file opened successfully, start stream */ if (file_id >= 0) { guac_rdp_stream* rdp_stream; const char* basename; int i; char c; /* Associate stream with transfer status */ guac_stream* stream = guac_client_alloc_stream(client); stream->data = rdp_stream = malloc(sizeof(guac_rdp_stream)); stream->ack_handler = guac_rdp_download_ack_handler; rdp_stream->type = GUAC_RDP_DOWNLOAD_STREAM; rdp_stream->download_status.file_id = file_id; rdp_stream->download_status.offset = 0; /* Get basename from absolute path */ i=0; basename = path; do { c = path[i]; if (c == '/' || c == '\\') basename = &(path[i+1]); i++; } while (c != '\0'); GUAC_RDP_DEBUG(2, "Initiating download of \"%s\"", path); /* Begin stream */ guac_protocol_send_file(client->socket, stream, "application/octet-stream", basename); guac_socket_flush(client->socket); } else guac_client_log(client, GUAC_LOG_ERROR, "Unable to download \"%s\"", path); }
void guac_rdpdr_fs_process_set_basic_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length) { wStream* output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); /* Currently do nothing, just respond */ Stream_Write_UINT32(output_stream, length); GUAC_RDP_DEBUG(2, "[file_id=%i] IGNORED", file_id); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }
void guac_rdpdr_fs_process_query_device_info(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_RDP_DEBUG(2, "[file_id=%i]", file_id); Stream_Write_UINT32(output_stream, 8); Stream_Write_UINT32(output_stream, FILE_DEVICE_DISK); /* DeviceType */ Stream_Write_UINT32(output_stream, 0); /* Characteristics */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }
void guac_rdpdr_fs_process_query_volume_info(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_RDP_DEBUG(2, "[file_id=%i]", 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); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }
void guac_rdpdr_fs_process_query_size_info(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_RDP_DEBUG(2, "[file_id=%i]", 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 */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }
void guac_rdpdr_fs_process_set_disposition_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id, int length) { wStream* output_stream; /* Delete file */ int result = guac_rdp_fs_delete((guac_rdp_fs*) device->data, file_id); if (result < 0) output_stream = guac_rdpdr_new_io_completion(device, completion_id, guac_rdp_fs_get_status(result), 4); else output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 4); GUAC_RDP_DEBUG(2, "[file_id=%i]", file_id); Stream_Write_UINT32(output_stream, length); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }
void guac_rdpdr_fs_process_query_attribute_info(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, 16 + GUAC_FILESYSTEM_NAME_LENGTH); GUAC_RDP_DEBUG(2, "[file_id=%i]", file_id); Stream_Write_UINT32(output_stream, 12 + GUAC_FILESYSTEM_NAME_LENGTH); 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, GUAC_FILESYSTEM_NAME_LENGTH); Stream_Write(output_stream, GUAC_FILESYSTEM_NAME, GUAC_FILESYSTEM_NAME_LENGTH); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }