命名管道學習筆記

“命名管道”或“命名管線”(Named Pipes )是一種簡單的進程間通信( I P C)機制.命名管道可在同一臺計算機的不同進程之間,或在跨越一個網絡的不同計算機的不同進程之間,支持可靠的、單向或雙向的數據通信。命令管道是圍繞Wi n d o w s文件系統設計的一種機制,採用“命名管道文件系統”(N a m e dPipe File System, NPFS)接口。因此,客戶機和服務器應用可利用標準的Wi n 3 2文件系統A P I函數(如R e a d F i l e和Wr i t e F i l e)來進行數據的收發。通過這些A P I函數,應用程序便可直接利用Wi n 3 2文件系統命名規範,以及Windows NT/Windows 2000文件系統的安全機制。N P F S依賴於M S N P重定向器在網上進行命名管道數據的發送和接收。這樣一來,便可實現接口的“與協議無關”
命名管道命名規範
命名管道的標識是採用U N C格式進行的:
/ / s e r v e r / P i p e / [ p a t h ] n a m e
第一部分/ / s e r v e r指定一個
服務器的名字。命名管道便是在那個服務器上創建的,而且要由它對進入的連接請求進行“監聽”。第二部分/ P i p e是一個不可變化的字串(不區分大小寫),用於指出該文件從屬於N P F S。而第三部分/ [ p a t h ] n a m e則使應用程序可以“唯一”定義及標定一個命名管道的名字,而且可在這裏設置多級目錄。
字節模式及消息模式
命名管道提供了兩種基本通信模式:字節模式和消息模式。在字節模式中,消息以一個連續的字節流的形式,在客戶機與服務器之間流動。這意味着,對客戶機應用和服務器應用來說,在任何一個特定的時間段內,它們不能準確知道有多少字節從管道中讀入或者寫入管道。因此,在一方寫入某個數量的字節,並不表示在另一方會讀出等量的字節。這樣一來,客戶機和服務器在傳輸數據的時候,便不必關心數據的內容。而在消息模式中,客戶機和服務器則通過一系列不連續的數據單位,進行數據的收發。每次在管道上發出了一條消息後,它必須作爲一條完整的消息讀入。
應用程序的編譯
在程序的開頭包含winbase.h文件,
客戶機與服務器的基礎
服務器是唯一一個有權創建命名管道的進程,也只有它才能接受管道客戶機的連接請求。對一個客戶機應用來說,它只能同一個現成的命名管道服務器建立連接。
服務器的細節
1) 使用A P I函數C r e a t e N a m e d P i p e,創建一個命名管道實例句柄。
2) 使用A P I函數C o n n e c t N a m e d P i p e,在命名管道實例上監聽客戶機連接請求。
3) 分別使用R e a d F i l e和Wr i t e F i l e這兩個A P I函數,從客戶機接收數據,或將數據發給客戶機。
4) 使用A P I函數D i s c o n n e c t N a m e d P i p e,關閉命名管道連接。
5) 使用A P I函數C l o s e H a n d l e,關閉命名管道實例句柄。
HANDLE CreateNamedPipe(
LPCTSTR lpname,
DWORD dwopenmode,
DWORD dwpipemode,
DWORD nmaxinstances,
DWORD noutbuffersize,
DWORD ninbuffersize,
DWORD ndefaulttimeout,
LPSECURITY_ATTRIBUTES lpseccurityattributes
);
第一個參數是l p N a m e,用於指定一個命名管道的名字。
d w O p e n M o d e參數用於指示一個管道創建好之後,它的傳輸方向、I / O控制以及安全模式。
雙向P I P E _ A C C E S S _ D U P L E X 雙向式管道:服務器和客戶機進程都能在管道上讀
寫數據
P I P E _ A C C E S S _ O U T B O U N D 數據在管道中只能從服務器朝客戶機流動
P I P E _ A C C E S S _ I N B O U N D 數據在管道中只能從客戶機朝服務器流動
I / O控制F I L E _ F L A G _ W R I T E _ T H R O U G H 只適用於字節模式下的管道。對那些用來向命名管
道寫入數據的函數來說,除非寫入的數據通過網絡傳
送出去,而且進入遠程計算機的管道緩衝區內,否則
不會返回
F I L E _ F L A G _ O V E R L A P P E D 允許執行讀、寫和連接操作的函數使用重疊式I / O
安全模式W R I T E _ D A C 應用程序可對命名管道的D A C L進行寫操作A C C E S S _ S Y S T E M _ S E C U R I T Y 應用程序可對命名管道的S A C L進行寫操作W R I T E _ O W N E R 應用程序可對命名管道的“所有人”及“組” S I D,進行寫操作
w P i p e M o d e參數指定了一個管道的讀、寫以及等待模式
寫P I P E _ T Y P E _ B Y T E 數據以字節流的形式,寫入管道
P I P E _ T Y P E _ M E S S A G E 數據以消息流的形式,寫入管道
讀P I P E _ R E A D M O D E _ B Y T E 數據以字節流的形式,從管道中讀入
P I P E _ R E A D M O D E _ M E S S A G E 數據以消息流的形式,從管道中讀入
等待P I P E _ WA I T 允許“鎖定”模式,I/0操作結束時才返回。
n M a x I n s t a n c e s參數指定對一個命名管道來說,最多可創建多少個實例或管道句柄。取值範圍在1到P I P E _ U N L I M I T E D _ I N S TA N C E S(無限實例)之間
n O u t B u ff e r S i z e和n I n B u ff e r S i z e參數分別指定了爲內部輸入及輸出緩衝區長度保留的字節數量。
n D e f a u l t Ti m e O u t參數用於指定默認的超時時間(客戶機等待同一個命令管道建立連接的
最長時間),以毫秒爲單位。
l p S e c u r i t y A t t r i b u t e s參數允許應用程序爲命名管道指定一個安全描述符,並決定一個子進程是否能夠繼承新建的句柄。
從C r e a t e N a m e d P i p e調用成功接收到一個句柄之後(亦即一個管道實例),便必須等待來自一個命名管道客戶機的連接。
BOOL ConnetctNamedPipe(
HANDLE hanamepipe,
LPOVERLAPPED lpoverlapped
);
h N a m e d P i p e參數指定自C r e a t e N a m e d P i p e調用返回的一個有效管道實例句柄。
l p O v e r l a p p e d參數則使這個A P I函數能以異步方式工作前提是當初使用F I L E _ F L A G _ O V E R L A P P E D標誌來創建管道,即WIN32重疊I/O
一個命名管道客戶機成功建立了與服務器的連接之後,C o n n e c t N a m e d P i p e這個A P I調用便會結束。隨後,服務器可用Wr i t e F i l e函數,向客戶機自由地發送數據;或者使用R e a d F i l e函數,從客戶機那裏接收數據。服務器完成了與一個客戶機的通信之後,便應調用D i s c o n n c t N a m e d P i p e函數,以關閉此次通信會話。
訪問控制列表
typedef struct _SECURITY_ATTRIBUTES{
DWORD nlength;
LPVOID lpsecuritydescriptor;
BOOL binherithandle;
}SECURITY_ATTRIBUTES;
l p S e c u r i t y D e s c r i p t o r字段用於爲一個對象設定訪問權限。在S E C U R I T Y _ D E S C R I P TO R結構中,包含了一個D A C L字段,它定義了哪些用戶和用戶組有權訪問對象。假如將該字段設爲N U L L,那麼任何用戶及用戶組均能訪問我們的資源。
1) 創建並初始化一個S E C U R I T Y _ D E S C R I P TO R結構,這是用A P I函數I n i t i a l i z e S e c u r i t yD e s c r i p t o r來進行的。
2) 爲S E C U R I T Y _ D E S C R I P TO R結構分配一個空的D A C L , 這是用A P I函數
S e t S e c u r i t y D e s c r i p t o r D a c l來進行的。成功建立一個新的S E C U R I T Y _ D E S C R I P TO R 結構後,必須將其分配給一個S E C U R I T Y _ AT T R I B U T E S結構。
安全模擬
命名管道服務器的工作安全環境可以模擬成客戶端的安全環境,使得權限設置變的簡單。
若服務器用C o n n e c t N a m e d P i p e函數接受一個客戶機連接請求,便可調用A P I函數I m p e r s o n a t e N a m e d P i p e C l i e n t,令自己的執行線程在客戶機的安全環境下工作。
BOOL ImpersonateNamedPipeClient{
HANDLE hnamedpipe
};
h N a m e d P i p e參數對應於自C r e a t e N a m e d P i p e返回的管道實例句柄。。服務器完成了對一個客戶機會話的處理之後,便應調用R e v e r t To S e l f,恢復成自己最初的線程執行安全環境。
BOOL RevertToself(VOID);
客戶機的細節
1) 用A P I函數Wa i t N a m e d P i p e,等候一個命名管道實例可供自己使用。
2) 用A P I函數C r e a t e F i l e,建立與命名管道的連接。
3) 用A P I函數Wr i t e F i l e和R e a d F i l e,分別向服務器發送數據,或從中接收數據。
4) 用A P I函數C l o s e H a n d l e,關閉打開的命名管道會話。
建立一個連接之前,客戶機需要用Wa i t N a m e d P i p e函數,檢查是否存在一個現成的命名管道實例。
BOOL WaitNamedPipe{
LPCTSTR lpnamedpipename;
DWORD ntimeout};
l p N a m e d P i p e N a m e參數指定了試圖與之建立連接的那個命名管道。n Ti m e O u t(超時時間)
Wa i t N a m e d P i p e成功完成後,客戶機需要用C r e a t e F i l e這個A P I函數,打開指向服務器命名管道實例的一個句柄
HANDLE CreateFile(
LPCTSTR lpfilename;
DWORD dwdesiredaccess;
DWORD dwsharemode;
LPSECURITY_ATTRIBUTES lpsecurityattributes;
DWORD dwcreationdisposition;
DWORD dwflagsandattributes;
HANDLE ntemplatefile;
};
l p F i l e N a m e(文件名)參數指定希望打開的那個管道的名字;
d w D e s i r e d A c c e s s參數定義了訪問模式,應將其設爲G E N E R I C _ R E A D(用於從管道上讀取數據),或設爲G E N E R I C _ W R I T E(用於將數據寫入管道)。
d w S h a r e M o d e 參數應設爲0 , 因爲一次只能有一個客戶機訪問一個管道實例。
l p S e c u r i t y A t t r i b u t e s參數應設爲N U L L,除非需要子進程繼承客戶機的句柄。
d w C r e a t i o n D i s p o s i t i o n參數則應設爲O P E N _ E X I S T I N G,意味着C r e a t e F i l e函數會在命名管道不存在的情況下調用失敗。
d w F l a g s A n d A t t r i b u t e s應設爲F I L E _ AT T R I B U T E _ N O R M A L或是於F I L E _ F L A G _ W R I T E _ T H R O U G H 、F I L E _ F L A G _ O V E R L A P P E D以及S E C U R I T Y _ S Q O S _ P R E S E N T標誌進行OR運算。S E C U R I T Y _ S Q O S _ P R E S E N T標誌則用於控制在
一個命名管道服務器上,客戶機的模擬安全級別。有下列級別
■ S E C U R I T Y _ A N O N Y M O U S
指定在“匿名”(A n o n y m o u s)安全級別上,對客戶機加以模擬。服務器進程不可取得與
客戶機有關的身份驗證信息,而且不能在客戶機的安全環境中執行。
■ S E C U R I T Y _ I D E N T I F I C AT I O N
指定在“驗證”(I d e n t i f i c a t i o n)安全級別上,對客戶機加以模擬。服務器進程可獲取與
客戶機有關的一些信息,比如安全標識符以及優先權限等等。然而,卻不能在客戶機的安全
環境中執行。假如命名管道客戶機希望讓服務器對客戶機進行驗證,但卻不想讓它完全扮演
客戶機,這一設定便非常恰當。
■ S E C U R I T Y _ I M P E R S O N AT I O N
指定在“模擬”(I m p e r s o n a t i o n)安全級別上,對客戶機加以模擬。此時,客戶機希望允
許服務器進程獲取與客戶機有關的信息,並可在自己的本地系統中,在客戶機的安全環境中
執行。使用這一標誌,服務器便能以客戶機的身份,訪問服務器上的任何本地資源。在這種
情況下,服務器完全“模擬”或“扮演”了一個客戶機。
■ S E C U R I T Y _ D E L E G AT I O N
指定在“委派”(D e l e g a t i o n)安全級別上,對客戶機加以模擬。服務器進程可取得與客
戶機有關的信息,並可同時在本地系統以及遠程系統上,使用客戶機的安全場景執行。
注意只有服務器進程在Windows 2000上運行的時候,SECURITY_DELEGATION纔可
產生作用。Windows NT 4(包括最新的SP6)並未實現委派安全機制。
■ S E C U R I T Y _ C O N T E X T _ T R A C K I N G
指出安全追蹤模式是“動態”的。若未設定該標誌,安全追蹤模式便是“靜態”的。
■ S E C U R I T Y _ E F F E C T I V E _ O N LY
指出在客戶機安全環境中,只有已啓用的那些部分纔可由服務器使用。假如未設定該標
志,客戶機安全環境的所有部分均可使用,無論是否已經啓用。
h Te m p l a t e F i l e,它對命名管道無效,應設爲N U L L。
C r e a t e F i l e成功完成,未產生錯誤,客戶機應用便可開始通過R e a d F i l e和Wr i t e F i l e函數,在命名管道上發送及接收數據。應用程序完成了數據的處理之後,可用C l o s e H a n d l e函數,將連接
關閉(斷開)。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章