Informática Numaboa - Tutoriais e Programação
Objetos e Manipuladores (handles)
Seg 22 Jun 2009 22:53 |
- Detalhes
- Categoria: Assembly Numaboa (antigo oiciliS)
- Atualização: Segunda, 22 Junho 2009 23:49
- Autor: vovó Vicki
- Acessos: 11577
Um objeto é uma estrutura interna que representa um recurso do sistema, como um arquivo, uma linha de processo (thread) ou uma imagem gráfica. Um aplicativo não pode acessar diretamente a estrutura interna de um objeto ou do recurso do sistema que este objeto representa - precisa obter um manipulador (handle) para poder examiná-lo e/ou modificá-lo.
O Windows usa objetos e manipuladores para vigiar o acesso aos recursos do sistema. Isto impede que programadores tenham acesso direto às estruturas internas de baixo nível. Por outro lado, cada objeto tem sua própria lista de controle de acessos (ACL - access-control list) que especifica os tipos de ação permitidos para cada objeto. O sistema operacional examina a ACL de um objeto toda vez que um aplicativo tentar criar um manipulador para ele. Para a maioria dos objetos, a API Win32 oferece funções para criá-los, criar seus manipuladores, fechá-los e destruí-los.
Manipuladores e objetos consomem memória. Para preservar a performance do sistema, um aplicativo deve fechar manipuladores e destruir objetos que não sejam mais necessários.
O Windows oferece três categorias de objetos: de ususário (user), de interface de dispositivos gráficos (GDI) e de kernel. O sistema utiliza objetos user para apoiar o gerenciamento de janelas, objetos GDI para apoiar gráficos e objetos kernel para apoiar o gerenciamento da memória, a execução do processo e a intercomunicação de processos.
Alguns objetos, como os user e GDI, só podem ter um manipulador. O sistema fornece um manipulador quando o aplicativo criar o objeto e invalida o manipulador quando o aplicativo destruir o objeto. Outros objetos, como alguns do kernel, podem possuir vários manipuladores. O sistema operacional remove o objeto da memória assim que o último manipulador for fechado.
O número de manipuladores abertos depende unicamente do total de memória disponível. Entretanto, um único processo não pode ter mais do que 16.384 manipuladores de objetos GDI abertos simultaneamente. O limite de manipuladores de kernel é de 230 por processo. Para manipuladores user não há limite por processo, mas há o limite de 65.536 do sistema.
Objetos USER e GDI
Os objetos user e GDI podem ter apenas um manipulador. O processo não pode herdar ou duplicar estes manipuladores. Os manipuladores user são públicos para todos os processos, ou seja, qualquer processo pode usar um manipulador de um objeto user existente. Os manipuladores de objetos GDI são privativos de um processo, ou seja, apenas o processo que criou o objeto GDI pode usar seu manipulador.
Na figura abaixo um aplicativo cria um objeto janela(1). A função CreateWindow cria um objeto janela (2) e retorna o manipulador deste objeto (3). Este manipulador do objeto janela pode ser utilizado pelo aplicativo para mostrar ou alterar a janela. O manipulador é válido enquanto o objeto correspondente não for destruído.
Na figura a seguir, o aplicativo destrói o objeto janela(1). A função DestroyWindow retira o objeto janela da memória (2), o que invalida o manipulador (3).
A tabela abaixo contém uma lista de objetos user e as funções correspondentes para criá-los e destruí-los. As funções de criação criam o objeto e seu manipulador ou então retornam simplesmente um manipulador existente. As funções de destruição removem o objeto da memória, o que invalida o manipulador correspondente, com exceção dos objetos window station e desktop, que são criados e mantidos pelo sistema (um aplicativo não consegue destruir estes dois objetos).
Funções para objetos USER
OBJETO USER | Função para criar | Função para destruir |
---|---|---|
Tabela de Aceleradores | CreateAcceleratorTable | DestroyAcceleratorTable |
Cursor | CreateCursor, LoadCursor, GetCursor, SetCursor | DestroyCursor |
Conversação DDE | DdeConnect, DdeConnectList, DdeQueryNextServer, DdeReconnect | DdeDisconnect, DdeDisconnectList |
Desktop | GetThreadDesktop | |
Hook | SetWindowsHook, SetWindowsHookEx | UnhookWindowsHook, UnhookWindowsHookEx |
Menu | CreateMenu, CreatePopupMenu, GetMenu, GetSubMenu, GetSystemMenu, LoadMenu, LoadMenuIndirect | DestroyMenu |
Janela | CreateWindow, CreateWindowEx, CreateDialogParam, CreateDialogIndirectParam, CreateMDIWindow, FindWindow, GetWindow, GetClipboardOwner, GetDesktopWindow, GetDlgItem, GetForegroundWindow, GetLastActivePopup, GetOpenClipboardWindow, GetTopWindow, WindowFromDC, WindowFromPoint e outras | DestroyWindow |
Posição da Janela | BeginDeferWindowPos | EndDeferWindowPos |
Window station | GetProcessWindowStation |
Funções para objetos GDI
OBJETO GDI | Função para criar | Função para destruir |
---|---|---|
Bitmap | CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDlBitmap, CreateDIBSection, CreateDiscardableBitmap | DeleteObject |
Brush (pincel) | CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush | DeleteObject |
Fonte | CreateFont, CreateFontIndirect | DeleteObject |
Paleta | CreatePalette | DeleteObject |
Pen (pena) | CreatePen, CreatePenIndirect | DeleteObject |
Pena Extendida | ExtCreatePen | DeleteObject |
Região | CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreatePolyPoligonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn, ExtCreateRegion, PathToRegion | DeleteObject |
Contexto de Dispositivo (DC) | CreateDC, GetDC | DeleteDC, ReleaseDC |
DC de Memória | CreateCompatibleDC | DeleteDC |
Metafile | CloseMetaFile, CopyMetaFile, GetMetaFile, SetMetaFileBitsEx | DeleteMetaFile |
DC de Metafile | CreateMetafile | CloseMetaFile |
Enhanced metafile | CloseEnhMetaFile, CopyEnhMetaFile, GetEnhMetaFile, SetEnhMetaFileBits | DeleteEnhMetaFile |
DC de enhanced metafile | CreateEnhMetaFile | CloseEnhMetaFile |
Objetos kernel
Os objetos kernel são específicos do processo. Isto significa que um processo precisa criar um objeto kernel ou então abrir um objeto existente para obter seu manipulador. Qualquer processo pode criar um manipulador novo para um objeto kernel existente, mesmo para um que já tenha sido criado por outro processo, contanto que o processo tenha o nome do objeto e tenha acesso seguro a ele.
Manipuladores de objetos kernel incluem direitos de acesso que indicam as ações permitidas ou proibidas a um processo. Um aplicativo especifica os direitos de acesso quando cria um objeto ou obtém um manipulador existente. Cada tipo de objeto kernel dá suporte a seu próprio conjunto de direitos de acesso. Por exemplo, manipuladores de evento podem ter autorização para "atribuir" (set), "esperar" (wait) ou ambos; manipuladores de arquivos podem estar autorizados para "leitura", "escrita" ou ambos, e assim por diante.
Processos podem herdar ou duplicar manipuladores para os seguintes tipos de objetos kernel, entre outros:
- Processos
- Linhas de processo (threads)
- Arquivos (inclusive objetos de arquivos mapeados)
- Eventos
- Semáforos
- Mutex
- Pipes (nominados e anônimos)
- Mailslots
- Dispositivos de comunicação
Na ilustração a seguir, um aplicativo cria um objeto evento. A função CreateEvent cria o objeto evento e retorna uma manipulador deste objeto:
(1) Um aplicativo executa a função CreateEvent, a qual cria um objeto evento (2) na memória. A função retorna o manipulador deste objeto (3). Após o objeto evento ter sido criado, o aplicativo pode usar o manipulador de evento para atribuir ou esperar pelo evento. O manipulador continua disponível até que o aplicativo o destrua ou até que o aplicativo termine.
A maioria dos objetos kernel permitem múltiplos manipuladores atrelados a um único objeto. Por exemplo, o aplicativo da ilustração anterior poderia obter manipuladores de objetos de evento adicionais usando a função OpenEvent, como mostrado a seguir:
(4) O aplicativo executa a função OpenEvent, que retorna um (5) novo manipulador de evento. Este método permite que um aplicativo tenha dois manipuladores com direitos de acesso diferentes. Por exemplo, o manipulador (3) pode ter os direitos "atribuir" e "esperar" e o manipulador (5) ter apenas o direito "esperar".
Se outro processo tiver o nome e o acesso seguro ao objeto, ele pode criar seu próprio manipulador de objeto evento usando OpenEvent. O aplicativo que criou o primeiro manipulador também pode duplicar um dos seus manipuladores para o mesmo processo ou para um outro processo através da função DuplicateHandle.
Um objeto permanece na memória enquanto pelo menos um manipulador deste objeto ainda existir. Na ilustração seguinte, os aplicativos usam a função CloseHandle para fechar seus manipuladores do objeto evento. Quando não existirem mais manipuladores de evento, o sistema remove o objeto da memória:
O sistema trata objetos arquivo de uma forma diferenciada. Os objetos arquivo possuem um ponteiro de arquivo - o ponteiro para o próximo byte a ser lido ou escrito no arquivo. Sempre que um aplicativo criar um novo manipulador de arquivo, o sistema cria um novo objeto arquivo. Portanto, mais de um objeto arquivo pode referenciar o mesmo arquivo em disco, como mostrado abaixo:
Apenas através de duplicação ou de herança, mais de um manipulador de arquivo pode referenciar o mesmo objeto arquivo, como mostrado a seguir:
A próxima tabela mostra cada um dos objetos kernel com suas funções de criação e destruição correspondentes. As funções de criação criam um objeto e seu respectivo manipulador ou criam um novo manipulador para um objeto existente. Quando o aplicativo fecha o último manipulador de um objeto, o sistema remove o objeto da memória.
OBJETO KERNEL | Função para criar | Função para destruir |
---|---|---|
Alteração de notificação | FindFirstChangeNotification | FindCloseChangeNotification |
Arquivo | CreateFile | CloseHandle, DeleteFile |
Atualizar recurso | BeginUpdateResource | EndUpdateResource |
Buffer de tela de console | CreateFile com CONOUT$ | CloseHandle |
Desktop | GetThreadDesktop | Aplicativos não podem eliminar este objeto |
Dispositivo de comunicação | CreateFile | CloseHandle |
Entrada de console | CreateFile com CONIN$ | CloseHandle |
Estação Windows | GetProcessWindowStation | Aplicativos não podem eliminar este objeto |
Evento | CreateEvent, OpenEvent | CloseHandle |
Heap | HeapCreate | HeapDestroy |
Log de evento | OpenEventLog, RegisterEventSource, OpenBackupEventLog | CloseEventLog |
Mailslot | CreateMailslot | CloseHandle |
Mapeamento de arquivo | CreateFileMapping, OpenFileMapping | CloseHandle |
Módulo | LoadLibrary, GetModuleHandle | FreeLibrary |
Mutex | CreateMutex, OpenMutex | CloseHandle |
Notificação de recurso de memória | CreateMemoryResourceNotification | CloseHandle |
Pipe | CreateNamedPipe, CreatePipe | CloseHandle, DisconnectNamedPipe |
Processo | CreateProcess, OpenProcess, GetCurrentProcess | CloseHandle, TerminateProcess |
Procurar arquivo | FindFirstFile | FindClose |
Semáforo | CreateSemaphore, OpenSemaphore | CloseHandle |
Socket | socket, accept | CloseHandle |
Tarefa | CreateJobObject | CloseHandle |
Thread | CreateThread, CreateRemoteThread, GetCurrentThread | CloseHandle, TerminateThread |
Timer | CreateWaitableTimer, OpenWaitableTimer | CloseHandle |
Token de acesso | CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessToken, OpenThreadToken | CloseHandle |