| 关键词: nbsp 句柄 NameBuffer IopDeleteSession SymbolicLinkName ExAllocatePoolWi DirInfoBuffer Status Attributes 符号 |
2K, XP ,2003 , Vista 的Windows操作系统目前为止的新版本中,IoDeleteSymbolicLink调用删除完符号链接后,会检查ObIsLUIDDeviceMapsEnabled,如果LUID DosDevices被禁用,而且开启了终端服务,将会调用IopDeleteSessionSymLinks删除\Session\*\DosDevice\下的同名符号链接。 其中IopDeleteSessionSymLinks在调用ZwOpenDirectoryObject会两次调用ExAllocatePoolWithTag申请内存分别存放Directory Informaiton和最终的符号链接名称,在申请内存失败时,函数没有关闭打开的目录对象句柄,就直接返回了,造成了句柄泄露 由于指定了OBJ_KERNEL_HANDLE,泄露将发生在Kernel Handle Table F5整理代码(VISTA SP1): //打开了句柄DirectoryHandle InitializeObjectAttributes( &Attributes, &UnicodeString, OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE, NULL, NULL ); Status = ZwOpenDirectoryObject(&DirectoryHandle, DIRECTORY_QUERY, &Attributes); if ( NT_SUCCESS(Status)){ Size = 2 * LinkName->Length + 256; NameBuffer = ExAllocatePoolWithTag(PagedPool, Size, ' oI'); pNameBuffer = NameBuffer; if ( !NameBuffer ) //没有关闭句柄 return STATUS_INSUFFICIENT_RESOURCES; SymbolicLinkName.Length = Size; SymbolicLinkName.MaximumLength = Size; SymbolicLinkName.Buffer = (PWSTR)NameBuffer; DirInfoBuffer = (LSA_UNICODE_STRING *)ExAllocatePoolWithTag(PagedPool, 0x1000u, ' oI'); Buffer = DirInfoBuffer; if ( !DirInfoBuffer ) { //没有关闭句柄 ExFreePoolWithTag(pNameBuffer, 0); return STATUS_INSUFFICIENT_RESOURCES; } Win7的内核似乎直接去掉了IopDeleteSessionSymLinks这个机制,所以没有这个泄露问题 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|