ActiveSync應用層程式協議分析-RAPI的握手過程 - 李先靜的專欄 - CSDNBlog
ActiveSync應用層程式協議分析-RAPI的握手過程
<?XML:NAMESPACE PREFIX = O />
轉載時請註明出處和作者聯絡方式
作者聯絡方式:李先靜
ActiveSync與Window Mobile之間的通訊協議並不複雜,在RNDIS+USBNET之上執行TCP/IP,而TCP/IP之上的應用層協議包括RAPI和RRAC兩個協議。前段時間我完成RAPI和RRAC協議的PC端和裝置端的實現,在這個系列之中,我們將對它們的原理和實現進行分析,供要做類似工作的朋友參考。本文介紹一下RAPI的握手過程。
PC端的ActiveSync監聽990埠,同步時裝置連線到這個埠,然後開始握手:
1.裝置端傳送四個位元組的資料(0x00)表示請求握手。
2.PC端迴應四個位元組的資料(0x03)表示接受握手,並要求裝置提供裝置資訊。
3.裝置迴應四個位元組的資料(0x04)表示要上傳裝置資訊,並在其後緊跟裝置資訊。
4.PC端讀取裝置資訊,如果不要求論證,握手到此結束(要求握手的情況目前還不清楚)。
裝置資訊結構如下:
typedef struct _RapiDeviceInfo
{
RapiDeviceGuid guid;
unsigned int os_version_major;
unsigned int os_version_minor;
WStr* name;
unsigned int dev_version;
unsigned int cpu_type;
unsigned int dev_magic;
unsigned int current_partner;
unsigned int dev_id;
char* platform;
char* model;
unsigned int components_nr;
RapiComponent* components;
unsigned int pw_key;
}RapiDeviceInfo;
這個資料包前面四個位元組是這個結構的資料長度,後面的資料並不是直接按結構記憶體佈局對映過來的,而是有專門編碼方式。主要特殊之外在於,所有整數都是以小端格式存放,name之前有四個位元組代表name的字元數(不包括空字元), platform之前有四個位元組代表platform的位元組數(此時包括空字元),model之前有四個位元組代表model的位元組數(此時不包括空字數)。由這個結構可以看出微軟當時把這個協議定義得太爛了:name是寬字元,而platform和model是多位元組字串,和前面的name不統一不說,還無法知道它們的編碼方式,更爛的是platform和model前面長度的意義不一致。
PC端的程式碼類似於:
static AsmRet rapi_host_connection_device_handle_hand_shake(AsmConnection* thiz)
{
AsmRet ret = ASM_RET_FAIL;
asm_return_val_if_fail(thiz != NULL, ASM_RET_FAIL);
PrivInfo* priv = (PrivInfo*)thiz->priv;
asm_return_val_if_fail(priv->stream != NULL, ASM_RET_OK);
int length = 0;
unsigned int cmd = 0;
unsigned int resp = 0;
AsmInputBuffer* input = NULL;
do
{
ret = asm_stream_read(priv->stream, &cmd, sizeof(cmd), &length);
if(ret != ASM_RET_OK || cmd != RAPI_COMMAND_HAND_SHAKE) break;
resp = RAPI_RESP_HAND_SHAKE;
ret = asm_stream_write(priv->stream, &resp, sizeof(resp), &length);
if(ret != ASM_RET_OK) break;
ret = asm_stream_read(priv->stream, &cmd, sizeof(cmd), &length);
if(ret != ASM_RET_OK || cmd != RAPI_RESP_GET_INFO) break;
input = asm_input_buffer_create(NULL, 0, ASM_ENDIAN_LITTLE, NULL);
ret = rapi_stream_read(priv->stream, input);
if(ret != ASM_RET_OK) break;
ret = rapi_host_connection_device_parse_device_info(thiz, input);
}while(0);
if(ret != ASM_RET_OK)
{
asm_stream_destroy(priv->stream);
priv->stream = NULL;
printf("%s:%d hand shake failed./n", __func__, __LINE__);
}
asm_input_buffer_destroy(input);
return ASM_RET_OK;
}
裝置端的程式碼類似於:
static AsmRet rapi_device_connection_device_hand_shake(AsmConnection* thiz)
{
AsmRet ret = ASM_RET_FAIL;
asm_return_val_if_fail(thiz != NULL, ret);
PrivInfo* priv = (PrivInfo*)thiz->priv;
RapiDeviceInfo info = {0};
size_t length = 0;
unsigned int cmd = 0;
unsigned int resp = 0;
asm_output_buffer_reset(priv->output);
cmd = uint32_to_endian(RAPI_COMMAND_HAND_SHAKE, ASM_ENDIAN_LITTLE);
ret = asm_stream_write(priv->stream, &cmd, sizeof(cmd), &length);
assert(length == sizeof(cmd));
ret = asm_stream_read(priv->stream, &resp, sizeof(resp), &length);
assert(length == sizeof(resp));
assert(resp == RAPI_RESP_HAND_SHAKE);
cmd = uint32_to_endian(RAPI_RESP_GET_INFO, ASM_ENDIAN_LITTLE);
ret = asm_stream_write(priv->stream, &cmd, sizeof(cmd), &length);
assert(length == sizeof(cmd));
if(rapi_device_get_info(priv->device, &info) == ASM_RET_OK)
{
if(rapi_buffer_write_info(priv->output, &info) == ASM_RET_OK)
{
ret = rapi_stream_write(priv->stream, priv->output);
}
}
return ret;
}
~~end~~
本文轉自
http://blog.csdn.net/absurd/archive/2008/03/27/2224066.aspx
相關文章
- 【轉】TCP協議三次握手過程分析TCP協議
- TCP協議三次握手過程分析【轉】TCP協議
- 應用層相關協議分析協議
- 常用物聯網應用層協議(1)——先說HTTP協議協議HTTP
- ActiveSync 協議選項協議
- 應用層協議協議
- TCP應用層協議TCP協議
- HTTPS協議詳解(四):TLS/SSL握手過程HTTP協議TLS
- HCIA—應用層常用協議協議
- TCP與應用層協議TCP協議
- TCP協議的3次握手與4次揮手過程詳解TCP協議
- laravel 應用層執行過程原始碼分析Laravel原始碼
- TCP/IP五層模型-應用層-DNS協議TCP模型DNS協議
- TCP協議的三次握手與四次揮手過程圖解TCP協議圖解
- 應用層協議:DNS域名系統協議DNS
- OpenVPN 協議解析-握手資料包分析協議
- 理論經典:TCP協議的3次握手與4次揮手過程詳解TCP協議
- Android 8.0 原始碼分析 (三) 應用程式程式建立到應用程式啟動的過程Android原始碼
- 聲網自研傳輸層協議 AUT 的落地實踐丨Dev for Dev 專欄協議dev
- 傳輸層協議、應用層、socket套接字、半連結池協議
- TCP的三次握手過程TCP
- Socket.D 基於訊息的響應式應用層網路協議協議
- svn透過https協議訪問的搭建過程HTTP協議
- 《看雪專欄使用者協議》協議
- Android應用程式啟動過程原始碼分析Android原始碼
- IP協議(網路層協議)協議
- [譯] Swift 寫網路層:用面向協議的方式Swift協議
- Swoole 多協議 多埠 的應用協議
- 筆記-iOS應用程式的啟動過程筆記iOS
- Electron桌面應用程式從建立專案、啟動專案到打包程式的詳細過程
- TCP協議 連線三次握手TCP協議
- 計算機網路層次與對應協議的理解計算機網路協議
- 第六章 應用層(DNS和http協議詳解)DNSHTTP協議
- 傳輸層協議協議
- 【協議】AAA Radius協議的常用報文分析協議
- OSI七層模型的功能及協議模型協議
- TCP對應的協議和UDP對應的協議(簡單概述)TCP協議UDP
- SSL/TLS 握手過程詳解TLS