admin 管理员组文章数量: 887007
窗口站和桌面
https://msdn.microsoft/en-us/library/windows/desktop/ms687098(v=vs.85).aspx
Windows 创建了三种主要类型的对象:用户接口,图形设备接口,还有内核。内核对象是可保安全的,但是用户对象和GDI 对象是不可以的。为了提供额外的安全性,使用窗口站和桌面来管理用户接口对象,这两个对象本身是可保安全的。
用户对象
https://msdn.microsoft/en-us/library/windows/desktop/ms725486(v=vs.85).aspx
每个用户接口对象只可以拥有一个句柄。进程不能继承或者拷贝接口对象的句柄。一个会话中的进程不能引用另一个会话中的用户句柄。
理论上,一个会话最多有65536 个用户句柄。实际上会比这个更少,因为可能在达到句柄限制之前内存就已经不够了,而且每个进程允许拥有的句柄数目是有限的。可以通过下面的注册表键值来修改每个进程可以使用的句柄的数目。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERProcessHandleQuota
这个键值的设置范围为:[200,18000]
用户对象的句柄
用户对象的句柄对于所有的进程都是公开的。任何进程可以使用用户对象句柄,这意味着,任何有权限访问对象的进程都可以使用该用户对象句柄。
管理用户对象
下面这个表格展示了所有的用户对象的创建和销毁函数。创建函数或者同时创建对象并返回句柄,或者仅仅是打开一个已经存在的句柄。销毁函数将把对象从内存中清除并使得对应的对象句柄失效。
用户对象 | 创建函数 | 销毁函数 |
---|---|---|
快捷键表 | CreateAcceleratorTable | DestroyAcceleratorTable |
Caret(插入符号?) | CreateCaret | DestroyCaret |
光标 | CreateCursor, LoadCursor, LoadImage | DestroyCursor |
DDE 会话 | DdeConnect, DdeConnectList | DdeDisconnect, DdeDisconnectList |
钩子 | SetWindowsHookEx | UnhookWindowsHookEx |
图标 | CreateIconIndirect, LoadIcon, LoadImage | DestroyIcon |
菜单 | CreateMenu, CreatePopupMenu, LoadMenu, LoadMenuIndirect | DestroyMenu |
窗口 | CreateWindow, CreateWindowEx, CreateDialogParam, CreateDialogIndirectParam, CreateMDIWindow | DestroyWindow |
窗口位置 | BeginDeferWindowPos | EndDeferWindowPos |
GDI 对象
https://msdn.microsoft/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, CreateDiscardableBitmap | DeleteObject |
画笔 | CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush | DeleteObject |
DC (设备上下文) | CreateDC | DeleteDC, ReleaseDC |
增强的元文件 | CreateEnhMetaFile | DeleteEnhMetaFile |
增强的元文件DC | CreateEnhMetaFile | CloseEnhMetaFile |
字体 | CreateFont, CreateFontIndirect | DeleteObject |
内存DC | CreateCompatibleDC | DeleteDC |
元文件 | CreateMetaFile | CloseMetaFile |
元文件DC | CreateMetaFile | CloseMetaFile |
调色板 | CreatePalette | DeleteObject |
画笔和扩展的画笔 | CreatePen, CreatePenIndirect, ExtCreatePen | DeleteObject |
域 | CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreatePolyPolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn, ExtCreateRegion, PathToRegion | DeleteObject |
内核对象
内核对象句柄是进程相关的。一个进程如果想要对一个对象进行操作,必须创建或者打开一个已经存在的对象并得到其句柄。理论上进程可以创建2^24 个句柄,但是句柄是存储在分页内存池的,因此实际可以创建的句柄的个数取决于可使用的内存的数量。
只要一个进程知道了一个已经存在的对象(即使是其它的进程创建的对象)的名称并拥有所请求的访问就可以打开该对象并获得其句柄。内核对象句柄包含当前进程对于该对象的访问权限,包括允许的操作和禁止的操作。在创建一个对象或者获得一个已存在对象的句柄的时候,进程指定了期望在该句柄上进行的操作。每一种类型的对象都有其对应的权限的集合,比如事件对象拥有触发或者等待权限(或者两个都有),文件对象可以有读或者写权限(或者两个都有)。
大多数内核对象支持一个内核对象对应多个句柄。这个机制使得一个应用程序可以拥有同一个内核对象的不同访问权限的句柄。比如,对于一个事件对象来说,可能句柄1只有触发事件的权限,同时事件2只有等待事件的权限。
除了使用对象特定的打开函数来获得一个已经存在有名字的内核对象的句柄外,还有两种方法,其中一个获得对象句柄的方法为DuplicateHandle,详情可以查看MSDN 或者我之前的介绍文章,另一种是句柄继承。
直到对象的最后一个句柄被关闭,对象才被从内存中清除。另外,系统管理文件对象的方法和其它的对象不同。文件对象包含一个成员—文件指针,指向文件中下一个将被读/写的字节的位置。无论系统何时创建一个新的文件句柄,系统创建一个新的文件对象。因此,磁盘上一个单独的文件可以对应多个文件对象。只有通过复制或者继承句柄的方式才可以创建多个指向同一个文件对象的句柄。
下面列出了各种内核对象的创建函数以及销毁函数。创建函数还是一样,或者创建并返回一个句柄,或者返回一个已经存在的对象的句柄。销毁函数稍微有些不同,当对象的最后一个句柄被关闭的时候对象才真正的销毁。
内核对象 | 创建函数 | 销毁函数 |
---|---|---|
访问令牌 | CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessToken, OpenThreadToken | CloseHandle |
Change notification | FindFirstChangeNotification | FindCloseChangeNotification |
通信设备 | CreateFile | CloseHandle |
控制台输入 | CreateFile, with CONIN$ | CloseHandle |
控制台屏幕缓冲 | CreateFile, with CONOUT$ | CloseHandle |
桌面 | GetThreadDesktop | Applications cannot delete this object. |
事件 | CreateEvent, CreateEventEx, OpenEvent | CloseHandle |
事件日志 | OpenEventLog, RegisterEventSource, OpenBackupEventLog | CloseEventLog |
文件 | CreateFile | CloseHandle |
文件映射 | CreateFileMapping, OpenFileMapping | CloseHandle |
文件查找 | FindFirstFile | FindClose |
堆 | HeapCreate | HeapDestroy |
I/O 完成端口 | CreateIoCompletionPort | HeapDestroy |
作业 | CreateJobObject | CloseHandle |
邮槽 | CreateMailslot | CloseHandle |
内存资源提醒 | CreateMemoryResourceNotification | CloseHandle |
模块 | LoadLibrary, GetModuleHandle | FreeLibrary |
互斥体 | CreateMutex, CreateMutexEx, OpenMutex | CloseHandle |
管道 | CreateNamedPipe, CreatePipe | CloseHandle, DisconnectNamedPipe |
进程 | CreateProcess, OpenProcess, GetCurrentProcess | CloseHandle, TerminateProcess |
信号量 | CreateSemaphore, CreateSemaphoreEx, OpenSemaphore | CloseHandle |
套接字 | socket, accept | closesocket |
线程 | CreateThread, CreateRemoteThread, GetCurrentThread | CloseHandle, TerminateThread |
定时器 | CreateWaitableTimer, CreateWaitableTimerEx, OpenWaitableTimer | CloseHandle |
更新资源 | BeginUpdateResource | EndUpdateResource |
窗口站 | GetProcessWindowStation | Applications cannot delete this object. |
版权声明:本文标题:Windows 中的三种对象 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1733398764h1585753.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论