DEVICE device;
WCHAR* path;
+ BOOL automount;
UINT32 PathLength;
wListDictionary* files;
case ERROR_NOT_READY:
rc = STATUS_NO_SUCH_DEVICE;
- break;
+ break;
case ERROR_FILE_EXISTS:
case ERROR_ALREADY_EXISTS:
if (!drive || !irp || !irp->devman || !irp->Complete)
return ERROR_INVALID_PARAMETER;
- if (Stream_GetRemainingLength(irp->input) < 6*4+8)
+ if (Stream_GetRemainingLength(irp->input) < 6 * 4 + 8)
return ERROR_INVALID_DATA;
Stream_Read_UINT32(irp->input, DesiredAccess);
Stream_Read_UINT32(irp->input, CreateDisposition);
Stream_Read_UINT32(irp->input, CreateOptions);
Stream_Read_UINT32(irp->input, PathLength);
+
if (Stream_GetRemainingLength(irp->input) < PathLength)
return ERROR_INVALID_DATA;
{
void* key;
DRIVE_FILE* file;
+
if (!drive || !irp || !irp->Complete || !irp->output)
return ERROR_INVALID_PARAMETER;
Stream_Read_UINT32(irp->input, Length);
Stream_Read_UINT64(irp->input, Offset);
-
file = drive_get_file_by_id(drive, irp->FileId);
+
if (!file)
{
irp->IoStatus = STATUS_UNSUCCESSFUL;
else
{
BYTE* buffer = Stream_Pointer(irp->output) + sizeof(UINT32);
+
if (!drive_file_read(file, buffer, &Length))
{
irp->IoStatus = drive_map_windows_err(GetLastError());
Stream_Read_UINT32(irp->input, Length);
Stream_Read_UINT64(irp->input, Offset);
Stream_Seek(irp->input, 20); /* Padding */
-
file = drive_get_file_by_id(drive, irp->FileId);
+
if (!file)
{
irp->IoStatus = STATUS_UNSUCCESSFUL;
return ERROR_INVALID_DATA;
Stream_Read_UINT32(irp->input, FsInformationClass);
-
file = drive_get_file_by_id(drive, irp->FileId);
+
if (!file)
{
irp->IoStatus = STATUS_UNSUCCESSFUL;
Stream_Read_UINT32(irp->input, FsInformationClass);
Stream_Read_UINT32(irp->input, Length);
Stream_Seek(irp->input, 24); /* Padding */
-
file = drive_get_file_by_id(drive, irp->FileId);
+
if (!file)
{
irp->IoStatus = STATUS_UNSUCCESSFUL;
return ERROR_INVALID_DATA;
Stream_Read_UINT32(irp->input, FsInformationClass);
-
Stream_Write_UINT32(irp->output, 0); /* Length */
return irp->Complete(irp);
}
Stream_Read_UINT32(irp->input, PathLength);
Stream_Seek(irp->input, 23); /* Padding */
path = (WCHAR*) Stream_Pointer(irp->input);
-
file = drive_get_file_by_id(drive, irp->FileId);
+
if (file == NULL)
{
irp->IoStatus = STATUS_UNSUCCESSFUL;
static UINT drive_process_irp(DRIVE_DEVICE* drive, IRP* irp)
{
UINT error;
+
if (!drive || !irp)
return ERROR_INVALID_PARAMETER;
DRIVE_DEVICE* drive = (DRIVE_DEVICE*) arg;
UINT error = CHANNEL_RC_OK;
- if(!drive)
+ if (!drive)
{
error = ERROR_INVALID_PARAMETER;
goto fail;
}
fail:
+
if (error && drive && drive->rdpcontext)
setChannelError(drive->rdpcontext, error, "drive_thread_func reported an error");
static UINT drive_free_int(DRIVE_DEVICE* drive)
{
UINT error = CHANNEL_RC_OK;
+
if (!drive)
return ERROR_INVALID_PARAMETER;
* @return 0 on success, otherwise a Win32 error code
*/
static UINT drive_register_drive_path(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints,
- char* name, char* path)
+ const char* name, const char* path, BOOL automount)
{
size_t i, length;
DRIVE_DEVICE* drive;
drive->device.IRPRequest = drive_irp_request;
drive->device.Free = drive_free;
drive->rdpcontext = pEntryPoints->rdpcontext;
+ drive->automount = automount;
length = strlen(name);
drive->device.data = Stream_New(NULL, length + 1);
for (i = 0; i <= length; i++)
Stream_Write_UINT8(drive->device.data, name[i] < 0 ? '_' : name[i]);
- if ((pathLength > 1) && (path[pathLength-1] == '/'))
- pathLength --;
+ if ((pathLength > 1) && (path[pathLength - 1] == '/'))
+ pathLength --;
if (ConvertToUnicode(sys_code_page, 0, path, pathLength, &drive->path, 0) <= 0)
{
}
}
- error = drive_register_drive_path(pEntryPoints, drive->Name, drive->Path);
+ error = drive_register_drive_path(pEntryPoints, drive->Name, drive->Path, drive->automount);
#else
sys_code_page = GetACP();