• 沒有找到結果。

RDP order 處理流程

在文檔中 終端服務的桌面影像壓縮 (頁 42-49)

第四章 RDP Client 實做與程式分析

4.2 RDP order 處理流程

一個 rdesktop 的主要函數由 rdesktop.c 中的 main 開始,整個函數架構如下,細節 部份將再依序說明。

圖 12. rdesktop 處理流程

main 函數一開始便先根據使用者連線前的設定值與 RDP Server 進行協議,網路 連線建立後,便呼叫 rdp_main_loop 進行資料的處理,如果連線中斷了,就交由 rdp_disconnect()結束連線,rdp_main_loop 只做一件事情就是呼叫 rdp_loop,當 rdp 連 線持續建立時迴圈繼續呼叫 rdp_loop 函數,如果 rdp 連線中斷了就跳出迴圈中斷程式,

rdp_loop 呼叫 rdp_recv 函數進行 rdp_packet 資料的讀取,由 rdp_recv 中判斷收到的封 包類型,針對不同封包類型呼叫函數進行處理,rdesktop 程式處理流程在於 RDP Layer 對 RDP 封包處理,從接收封包到判斷封包類型是屬於哪種 type 的封包,這裡的 type 代表 rdp 封包類型,程序依下頁圖 13.的函式呼叫來處理。

Main

Process RDP Packet

Process Data PDU

Disconnect?

Close Connection No Yes

圖 13. RDP 封包類型判斷

圖 13.中經過 rdp_recv 函數後,rdesktop 利用 rdp_recv 處理 rdp 封包後,依據封包類 型(type)呼叫函數,這裡指的封包類型就是第三章所說的 ASP PDU TYPE,封包的格 式如下圖。

圖 14. RDP header 中 RDP PDU Type 欄位 Rdp_loop

main

process_demand_active ( )

Print: RDP DEACTIVATE

process_redirect_pdu ( )

process_data_pdu ( ) rdp recv?

Closed No

No

Yes Yes

Disconnect No

Yes Any RDP

Wait?

Check RDP PDU Type

RDP PDU TYPE 可以分成下面幾類:

z RDP_PDU_DEMAND_ACTIVE:process_demand_active 處理 RDP Server 驗證要求 z RDP_PDU_DEACTIVE:為解除驗證,rdesktop 僅做訊息的接收,沒有呼叫函數來

處理

z RDP_PDU_REDIRECT:呼叫 process_redirect_pdu 為處理資料 redirect 封包(例 如:聲音的轉向)

z RDP_PDU_DATA:process_data_pdu 為處理資料封包

z 0:回到 rdp_recv 函數繼續處理 RDP Packet,正常連線時,type 回傳值都是 0 z default:例外情況 report an unimplemented protocol feature

RDP Server 和 RDP Client 完成連線後,假設 type 回傳值為 0 則 rdp 封包處理交由 rdp_recv 函數,在後面的篇幅我們將對 rdp_recv 函數流程進行說明。

Process_data_pdu 收到資料後,接下來判斷 data pdu type,依據其資料封包類型

(data pdu type)呼叫不同的函數處理,程式處理程序如下圖。

圖 15. RDP Process Data PDU Process data pdu

Parsing data pdu header

process_update_pdu( )

Received Control PDU

DATA_PDU_SYNCHRONISE

process_pointer_pdu( )

RDP_DATA_PDU_LOGON Check the data

Pdu type

process_disconnect_pdu

收到一個 RDP data Pdu 之後,判斷 data pdu type,分為以下八種類型:

z RDP_DATA_PDU_UPDATE:呼叫 process_update_pdu,這部份為資料更新,例 如:update orders、update palette 等,這支函數是畫面更新的重點。

z RDP_DATA_PDU_CONTROL:接收到控制單元,rdesktop 不呼叫函數進行處理,

僅標示 “received control PDU”

z RDP_DATA_PDU_SYNCHRONISE:接收到同步訊息

z RDP_DATA_PDU_POINTER:呼叫 process_pointer_pdu,處理 pointer color 或是 pointer cached 等。

z RDP_DATA_PDU_BELL:警告鈴聲的處理

z RDP_DATA_PDU_LOGON:登入遠端連線後,都會收到這個登入成功的訊息。

z RDP_DATA_PDU_DISCONNECT:呼叫 process_disconnect_pdu 進行處理,使用 rdesktop 和 Windows XP RDP5.1 進行 RDP 連線,連線中斷時 rdeskop 是不會收到 這個訊息的;但是,與 Windows Vista RDP5.3 連線,在連線中斷會收到 dissconnect pdu。

z Default:未預期的 data PDU 類型,也就是上面類型的例外發生時通知使用者。

RDP Data PDU Type 在 RDP PDU header 中的欄位如下圖,TYPE 欄位灰色部分。

圖 16. RDP Data PDU Type 欄位說明

一個畫面更新的封包為 update pdu,因此接下來呼叫 process update pdu 函數進行 處理,處理更新的封包(process update pdu)可以分為四種類型,指令(order)更新 部分、點陣圖(BITMAP)更新部份、調色盤(PALETTE)更新以及同步更新,利用 process update pdu 函數中判斷 update_type 的類型,rdesktop 定義的形式如下:

z RDP_UPDATE_ORDERS:進行命令的更新,這裡指的是更新 order 格式及定義。

z RDP_UPDATE_BITMAP:更新 bitmap,呼叫 process_bitmap_update 處理。

z RDP_UPDATE_PALETTE:呼叫 process_palette,進行 palette 的更新。

z RDP_UPDATE_SYNCHRONIZE:不呼叫任何函數,單純做同步的動作。

z Default:其他未預期的 update_type。

Update PDU Type 包裝於 Update PDU 資料包的前兩個 bytes,包裝情形如下圖。

RDP Data 部分通常是畫面更新的資料,可以是 RDP order 或是 RDP bitmap updates 的 資料,下面以 RDP order 為例子。

圖 17. RDP Data 內的 Update PDU type 欄位

Process_update_pdu 函數根據不同的 case 呼叫相對應的函數。

圖 18. 處理 update pdu 函數呼叫 Process_update_pdu

Check Update_type

process_orders( )

process_bitmap_updates( )

process_palette( )

RDP_UPDATE_SYNCHRONIZE RDP_UPDATE_ORDERS

RDP_UPDATE_BITMAP

RDP_UPDATE_PALETTE

RDP_UPDATE_SYNCHRONIZE 判斷 RDP Packet

資料中,前面兩個 Bytes

process_bitmap_updates 函 數 中 主 要 是 處 理 來 自 RDP Server 傳 送 的 bitmap updates,這部份的 bitmap 是直接傳送座標訊息、圖片長寬及 bitmap 的位元資料,

process_bitmap_updates 接收後,透過 ui_paint_bitmap 呼叫 X Lib 的 XCreateImage 將點 陣圖繪製出來,在利用 XPutImage 函數將圖形顯示在指定的畫面上。

瞭解 bitmap updates 方式之後,我們將針對另外一種畫面傳遞方式 process order 進行說明,在 RDP 封包處理上,在連線建立,使用者帳號密碼驗證成功後,主要的封 包都是由 rdp_recv 處理,rdp5_process 是配合 RDP 5.0 Server 處理函數,對於 RDP date pdu 其資料來自 security layer 的資料,將封包交由 rdp5_process 函數進行 RDP 資料的 讀取,在 rdp5_process 中依據不同的資料類型(type)總共分成 10 種類型,介紹如下:

z update orders:呼叫 process_orders 處理畫面命令

z update bitmap:利用 process_bitmap_updates 進行 bitmap 的更新 z update palette:呼叫 process_palette 函數,處理顏色對應表的處理

z update synchronize:不做任何處理,跳出 rdp5_process 函數,作為同步之用 z null pointer:設定滑鼠游標類型為 null

z default pointer:預測的游標類型

z pointer position:定義游標的位置,呼叫 ui_move_pointer 移動游標 z color pointer:process_colour_pointer_pdu 定義游標的顏色

z cached pointer:process_cached_pointer_pdu 處理暫存的游標類型 z default:未處理過的例外情形,結束函數。

我們的重點在於畫面的指令更新,因此將重點放在 process_orders,處理畫面中各 種指令。當收到 rdp 資料後處理指令,主要是根據 order_flags 作判斷,流程說明如下:

1. 判斷指令封包是否發生錯誤(RDP_order_standard)

2. 判斷是否為 secondary order

3. 判斷 primary order 中 order_type,針對不同類型的命令呼叫不同的函數

讀取 order 的流程如下圖,其中 order function 由灰色的 block 依據 order type 定義,

呼叫不同的函數來處理,以 case 方式來處理 primary order 和 secondary order 的程序。

圖 19. RDP order 處理流程

由上述的程式流程,我們將 secondary order 和 primary order 分別呼叫不同的函數 來處理,接下來針對函式的處理程序進行說明。這裡我們先針對 primary order 做說明,

由於 process_orders 函數已經將 primary order 中的指令,根據 order type 分類出來,依 據 Server 所定義不同的 order_type 類型,rdesktop 進行不同的處理方式,primary order 主要處理出現過的畫面(例如:文字、影像)以及繪製圖形(多邊形、矩形、線條),

secondary order 則是處理首次出現的文字及圖形。下面的章節,分別針對 primary order 處理程序以及 secondary order 的流程進行探討,並將 rdesktop 收到的資料依據不同的 命令將實驗結果顯示出來。

在文檔中 終端服務的桌面影像壓縮 (頁 42-49)