Windows 中的三种对象

窗口站和桌面

https://msdn.microsoft.com/en-us/library/windows/desktop/ms687098(v=vs.85).aspx

       Windows 创建了三种主要类型的对象:用户接口,图形设备接口,还有内核。内核对象是可保安全的,但是用户对象和GDI 对象是不可以的。为了提供额外的安全性,使用窗口站和桌面来管理用户接口对象,这两个对象本身是可保安全的。

用户对象

https://msdn.microsoft.com/en-us/library/windows/desktop/ms725486(v=vs.85).aspx

       每个用户接口对象只可以拥有一个句柄。进程不能继承或者拷贝接口对象的句柄。一个会话中的进程不能引用另一个会话中的用户句柄。
       理论上,一个会话最多有65536 个用户句柄。实际上会比这个更少,因为可能在达到句柄限制之前内存就已经不够了,而且每个进程允许拥有的句柄数目是有限的。可以通过下面的注册表键值来修改每个进程可以使用的句柄的数目。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERProcessHandleQuota

       这个键值的设置范围为:[200,18000]

用户对象的句柄

       用户对象的句柄对于所有的进程都是公开的。任何进程可以使用用户对象句柄,这意味着,任何有权限访问对象的进程都可以使用该用户对象句柄。

管理用户对象

       下面这个表格展示了所有的用户对象的创建和销毁函数。创建函数或者同时创建对象并返回句柄,或者仅仅是打开一个已经存在的句柄。销毁函数将把对象从内存中清除并使得对应的对象句柄失效。

用户对象创建函数销毁函数
快捷键表CreateAcceleratorTableDestroyAcceleratorTable
Caret(插入符号?)CreateCaretDestroyCaret
光标CreateCursor, LoadCursor, LoadImageDestroyCursor
DDE 会话DdeConnect, DdeConnectListDdeDisconnect, DdeDisconnectList
钩子SetWindowsHookExUnhookWindowsHookEx
图标CreateIconIndirect, LoadIcon, LoadImageDestroyIcon
菜单CreateMenu, CreatePopupMenu, LoadMenu, LoadMenuIndirectDestroyMenu
窗口CreateWindow, CreateWindowEx, CreateDialogParam, CreateDialogIndirectParam, CreateMDIWindowDestroyWindow
窗口位置BeginDeferWindowPosEndDeferWindowPos

GDI 对象

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724291(v=vs.85).aspx
       一个GDI对象只有一个句柄,GDI 对象是进程私有的,只有创建它的进程才可以使用该对象句柄。

       会话中的GDI 句柄的个数的限制同用户对象一样。
Windows 2000:一个会话最多有16384个GDI 句柄。
       每个进程所能拥有的最大数量的GDI 对象的限制对应注册表键为:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\GDIProcessHandleQuota

       这个值的可以修改的范围为:[256~65536]

管理GDI 对象

       同用户对象

GDI对象创建函数销毁函数
位图CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection, CreateDiscardableBitmapDeleteObject
画笔CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrushDeleteObject
DC (设备上下文)CreateDCDeleteDC, ReleaseDC
增强的元文件CreateEnhMetaFileDeleteEnhMetaFile
增强的元文件DCCreateEnhMetaFileCloseEnhMetaFile
字体CreateFont, CreateFontIndirectDeleteObject
内存DCCreateCompatibleDCDeleteDC
元文件CreateMetaFileCloseMetaFile
元文件DCCreateMetaFileCloseMetaFile
调色板CreatePaletteDeleteObject
画笔和扩展的画笔CreatePen, CreatePenIndirect, ExtCreatePenDeleteObject
CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreatePolyPolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn, ExtCreateRegion, PathToRegionDeleteObject

内核对象

       内核对象句柄是进程相关的。一个进程如果想要对一个对象进行操作,必须创建或者打开一个已经存在的对象并得到其句柄。理论上进程可以创建2^24 个句柄,但是句柄是存储在分页内存池的,因此实际可以创建的句柄的个数取决于可使用的内存的数量。
       只要一个进程知道了一个已经存在的对象(即使是其它的进程创建的对象)的名称并拥有所请求的访问就可以打开该对象并获得其句柄。内核对象句柄包含当前进程对于该对象的访问权限,包括允许的操作和禁止的操作。在创建一个对象或者获得一个已存在对象的句柄的时候,进程指定了期望在该句柄上进行的操作。每一种类型的对象都有其对应的权限的集合,比如事件对象拥有触发或者等待权限(或者两个都有),文件对象可以有读或者写权限(或者两个都有)。
       大多数内核对象支持一个内核对象对应多个句柄。这个机制使得一个应用程序可以拥有同一个内核对象的不同访问权限的句柄。比如,对于一个事件对象来说,可能句柄1只有触发事件的权限,同时事件2只有等待事件的权限。
       除了使用对象特定的打开函数来获得一个已经存在有名字的内核对象的句柄外,还有两种方法,其中一个获得对象句柄的方法为DuplicateHandle,详情可以查看MSDN 或者我之前的介绍文章,另一种是句柄继承。
        直到对象的最后一个句柄被关闭,对象才被从内存中清除。另外,系统管理文件对象的方法和其它的对象不同。文件对象包含一个成员—文件指针,指向文件中下一个将被读/写的字节的位置。无论系统何时创建一个新的文件句柄,系统创建一个新的文件对象。因此,磁盘上一个单独的文件可以对应多个文件对象。只有通过复制或者继承句柄的方式才可以创建多个指向同一个文件对象的句柄。
       下面列出了各种内核对象的创建函数以及销毁函数。创建函数还是一样,或者创建并返回一个句柄,或者返回一个已经存在的对象的句柄。销毁函数稍微有些不同,当对象的最后一个句柄被关闭的时候对象才真正的销毁。

内核对象创建函数销毁函数
访问令牌CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessToken, OpenThreadTokenCloseHandle
Change notificationFindFirstChangeNotificationFindCloseChangeNotification
通信设备CreateFileCloseHandle
控制台输入CreateFile, with CONIN$CloseHandle
控制台屏幕缓冲CreateFile, with CONOUT$CloseHandle
桌面GetThreadDesktopApplications cannot delete this object.
事件CreateEvent, CreateEventEx, OpenEventCloseHandle
事件日志OpenEventLog, RegisterEventSource, OpenBackupEventLogCloseEventLog
文件CreateFileCloseHandle
文件映射CreateFileMapping, OpenFileMappingCloseHandle
文件查找FindFirstFileFindClose
HeapCreateHeapDestroy
I/O 完成端口CreateIoCompletionPortHeapDestroy
作业CreateJobObjectCloseHandle
邮槽CreateMailslotCloseHandle
内存资源提醒CreateMemoryResourceNotificationCloseHandle
模块LoadLibrary, GetModuleHandleFreeLibrary
互斥体CreateMutex, CreateMutexEx, OpenMutexCloseHandle
管道CreateNamedPipe, CreatePipeCloseHandle, DisconnectNamedPipe
进程CreateProcess, OpenProcess, GetCurrentProcessCloseHandle, TerminateProcess
信号量CreateSemaphore, CreateSemaphoreEx, OpenSemaphoreCloseHandle
套接字socket, acceptclosesocket
线程CreateThread, CreateRemoteThread, GetCurrentThreadCloseHandle, TerminateThread
定时器CreateWaitableTimer, CreateWaitableTimerEx, OpenWaitableTimerCloseHandle
更新资源BeginUpdateResourceEndUpdateResource
窗口站GetProcessWindowStationApplications cannot delete this object.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值