return error;
}
-IRP* irp_new(DEVMAN* devman, wStream* s)
+IRP* irp_new(DEVMAN* devman, wStream* s, UINT* error)
{
IRP* irp;
DEVICE* device;
UINT32 DeviceId;
+ if (!Stream_EnsureRemainingCapacity(s, 20))
+ {
+ if (error)
+ *error = CHANNEL_RC_NO_BUFFER;
+ return NULL;
+ }
+
Stream_Read_UINT32(s, DeviceId); /* DeviceId (4 bytes) */
device = devman_get_device_by_id(devman, DeviceId);
if (!device)
{
- WLog_ERR(TAG, "devman_get_device_by_id failed!");
+ WLog_WARN(TAG, "devman_get_device_by_id failed!");
+ if (error)
+ *error = CHANNEL_RC_OK;
+
return NULL;
};
if (!irp)
{
WLog_ERR(TAG, "_aligned_malloc failed!");
+ if (error)
+ *error = CHANNEL_RC_NO_MEMORY;
return NULL;
}
{
WLog_ERR(TAG, "Stream_New failed!");
_aligned_free(irp);
+ if (error)
+ *error = CHANNEL_RC_NO_MEMORY;
return NULL;
}
Stream_Write_UINT16(irp->output, RDPDR_CTYP_CORE); /* Component (2 bytes) */
irp->thread = NULL;
irp->cancelled = FALSE;
+ if (error)
+ *error = CHANNEL_RC_OK;
+
return irp;
}
free(drive->Path);
free(drive->Name);
free(drive);
- error = CHANNEL_RC_NO_MEMORY;
goto cleanup;
}
}
if (!Stream_EnsureRemainingCapacity(s, 20 + data_len))
{
WLog_ERR(TAG, "Stream_EnsureRemainingCapacity failed!");
- return CHANNEL_RC_NO_MEMORY;
+ return CHANNEL_RC_NO_BUFFER;
}
Stream_Write_UINT32(s, device->type); /* deviceType */
IRP* irp;
UINT error = CHANNEL_RC_OK;
- irp = irp_new(rdpdr->devman, s);
+ irp = irp_new(rdpdr->devman, s, &error);
if (!irp)
{
- WLog_ERR(TAG, "irp_new failed!");
- return CHANNEL_RC_NO_MEMORY;
+ WLog_ERR(TAG, "irp_new failed with %lu!", error);
+ return error;
}
IFCALLRET(irp->device->IRPRequest, error, irp->device, irp);
if (!Stream_EnsureRemainingCapacity(data_in, (int) dataLength))
{
WLog_ERR(TAG, "Stream_EnsureRemainingCapacity failed!");
- return CHANNEL_RC_NO_MEMORY;
+ return CHANNEL_RC_NO_BUFFER;
}
Stream_Write(data_in, pData, dataLength);