Cómo Obtener Un Descriptor

Tabla de contenido:

Cómo Obtener Un Descriptor
Cómo Obtener Un Descriptor

Video: Cómo Obtener Un Descriptor

Video: Cómo Obtener Un Descriptor
Video: 1 Elaborando descriptores 2024, Mayo
Anonim

La interfaz de programación de aplicaciones de los sistemas operativos Windows está representada por un conjunto de funciones. Cuando se llaman, se pueden crear varios objetos (archivos, procesos, hilos, objetos de sincronización, etc.). Para proporcionar un acceso suficientemente abstracto y unificado a estos objetos, su identificación se realiza mediante descriptores - valores numéricos "impersonales".

Cómo obtener un descriptor
Cómo obtener un descriptor

Necesario

  • - un traductor de un lenguaje de programación que permite el uso de la API de Windows;
  • - posiblemente Windows Platform SDK.

Instrucciones

Paso 1

Obtenga manijas de ventana. Hay muchas maneras de hacer esto. El método exacto depende del objetivo final.

Utilice las API CreateWindow o CreateWindowEx para crear una ventana. Devuelven un identificador en caso de éxito y NULL en caso de error.

Busque ventanas de nivel superior y ventanas secundarias mediante varios parámetros utilizando las funciones FindWindow y FindWindowEx, respectivamente. En la búsqueda exitosa, se obtendrá el identificador de la ventana.

Enumere las ventanas con las funciones EnumWindows, EnumChildWindows, EnumThreadWindows. Los identificadores de las ventanas encontradas se pasarán como parámetro a la función de devolución de llamada.

Busque la manija de la ventana ubicada en una posición específica en la pantalla. Llame a una de las funciones: WindowFromPoint, ChildWindowFromPoint o ChildWindowFromPointEx.

Paso 2

Obtenga identificadores de procesos. Cree un nuevo proceso llamando a las funciones de API CreateProcess, CreateProcessAsUser, CreateProcessWithTokenW o CreateProcessWithLogonW. Todos devuelven un identificador al nuevo proceso en el campo hProcess de la estructura PROCESS_INFORMATION, el puntero al que se les debe pasar como último parámetro.

Busque el identificador del proceso por su identificador conocido. Utilice la llamada OpenProcess. Los ID de todos los procesos en ejecución se pueden obtener, por ejemplo, utilizando las funciones CreateToolhelp32Snapshot, Process32First y Process32Next de la biblioteca de ayuda de la herramienta.

Recupere el pseudo control del proceso actual utilizando la función GetCurrentProcess.

Paso 3

Obtenga descriptores de hilos. Las funciones CreateThread y CreateRemoteThread crean subprocesos en su propio proceso y en el de otra persona, respectivamente, devolviendo sus identificadores. Puede abrir un hilo existente usando su identificador y obtener el identificador correspondiente usando la función OpenThread. El pseudo-control del flujo actual se devuelve cuando se llama a GetCurrentThread.

Paso 4

Los descriptores de archivos, directorios, discos físicos, volúmenes de disco, consolas, recursos de comunicación (puertos de E / S), ranuras de correo y canalizaciones con nombre se pueden obtener llamando a una única función, CreateFile.

Paso 5

Los descriptores de objetos de mapeo de archivo a memoria se devuelven mediante llamadas a CreateFileMapping y OpenFileMapping.

Paso 6

Las funciones CreateMutex, CreateSemaphore y CreateEvent crean, y las funciones OpenMutex, OpenSemaphore y OpenEvent abren objetos de sincronización existentes (mutex, semáforos y eventos). Todos devuelven descriptores.

Paso 7

Todos los objetos GDI (como contextos de dispositivos, fuentes, pinceles, lápices, mapas de bits independientes y dependientes del hardware, secciones DIB, etc.) se manipulan a través de sus descriptores. Las funciones para crear objetos GDI son numerosas y deben consultarse en la sección de MSDN para obtener información sobre ellas.

Paso 8

Un descriptor obtenido en un proceso, por regla general, no se puede utilizar en otro. Sin embargo, en algunos casos es posible obtener un descriptor duplicado correspondiente al objeto principal. Llame a la API DuplicateHandle para duplicar el identificador. Esto se puede utilizar, por ejemplo, para compartir canales o objetos de sincronización sin nombre entre múltiples procesos.

Recomendado: