命名管道学习笔记

“命名管道”或“命名管线”(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函数,将连接
关闭(断开)。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章