/* Initialize a buffer. */ void KexecInitBuffer(PKEXEC_BUFFER KexecBuffer) { ExInitializeFastMutex(&KexecBuffer->Mutex); LOCK_BUFFER(KexecBuffer); KexecClearBuffer(KexecBuffer); UNLOCK_BUFFER(KexecBuffer); }
/* Retrieve data from a buffer. */ NTSTATUS KexecGetBuffer(PKEXEC_BUFFER KexecBuffer, ULONG size, PVOID buf, DWORD* osize) { LOCK_BUFFER(KexecBuffer); if (size < KexecBuffer->Size) { *osize = 0; UNLOCK_BUFFER(KexecBuffer); return STATUS_INSUFFICIENT_RESOURCES; } RtlCopyMemory(buf, KexecBuffer->Data, KexecBuffer->Size); *osize = KexecBuffer->Size; UNLOCK_BUFFER(KexecBuffer); return STATUS_SUCCESS; }
static void rf_desktop_resize(rdpContext* context) { RemminaProtocolWidget* gp; rfContext* rfi; rfi = (rfContext*) context; gp = rfi->protocol_widget; LOCK_BUFFER(TRUE) remmina_plugin_service->protocol_plugin_set_width(gp, rfi->settings->DesktopWidth); remmina_plugin_service->protocol_plugin_set_height(gp, rfi->settings->DesktopHeight); UNLOCK_BUFFER(TRUE) THREADS_ENTER remmina_rdp_event_update_scale(gp); THREADS_LEAVE remmina_plugin_service->protocol_plugin_emit_signal(gp, "desktop-resize"); }
/* Load data into a buffer. */ NTSTATUS KexecLoadBuffer(PKEXEC_BUFFER KexecBuffer, ULONG size, PVOID data) { ULONG alloc_size; /* Round the size up to the nearest multiple of 4096 to ensure that the buffer ends up on a page boundary. */ alloc_size = (size + 4095) & 0xffff000; LOCK_BUFFER(KexecBuffer); KexecFreeBuffer(KexecBuffer); KexecBuffer->Data = ExAllocatePoolWithTag(NonPagedPool, alloc_size, TAG('K', 'x', 'e', 'c')); if (!KexecBuffer->Data) { UNLOCK_BUFFER(KexecBuffer); return STATUS_INSUFFICIENT_RESOURCES; } KexecBuffer->Size = size; RtlCopyMemory(KexecBuffer->Data, data, size); KexecUpdateBufferHash(KexecBuffer); UNLOCK_BUFFER(KexecBuffer); return STATUS_SUCCESS; }
gboolean remmina_rdp_event_queue_ui(RemminaProtocolWidget* gp) { rfContext* rfi; RemminaPluginRdpUiObject* ui; rfi = GET_DATA(gp); ui = (RemminaPluginRdpUiObject*) g_async_queue_try_pop(rfi->ui_queue); if (ui) { switch (ui->type) { case REMMINA_RDP_UI_UPDATE_REGION: remmina_rdp_event_update_region(gp, ui); break; case REMMINA_RDP_UI_CONNECTED: remmina_rdp_event_connected(gp, ui); break; case REMMINA_RDP_UI_UPDATE_CURSOR: remmina_rdp_event_update_cursor(gp, ui); break; default: break; } rf_object_free(gp, ui); return TRUE; } else { LOCK_BUFFER(FALSE) rfi->ui_handler = 0; UNLOCK_BUFFER(FALSE) return FALSE; } }
/* Destroy a buffer. */ void KexecDestroyBuffer(PKEXEC_BUFFER KexecBuffer) { LOCK_BUFFER(KexecBuffer); KexecFreeBuffer(KexecBuffer); UNLOCK_BUFFER(KexecBuffer); }