Cómo utilizar funciones VDMDBG en Windows NT, Windows 2000 y Windows XP

Seleccione idioma Seleccione idioma
Id. de artículo: 182559 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Resumen

Incluso cuando la programación en un entorno de 32 bits, a veces hay cuando es necesario trabajar con aplicaciones de 16 bits. En Windows NT, las aplicaciones de 16 bits se ejecutan dentro de una máquina DOS virtual (VDM). VDMDBG.dll contiene muchas funciones que son útiles para trabajar con aplicaciones de 16 bits. Esta biblioteca es parte de Microsoft Platform SDK.

VDMDBG funciones constituyen una buena forma enumerar, crear y terminar los procesos de 16 bits (tareas) dentro de una VDM. En este artículo describe cómo utilizar estas funciones en Microsoft Windows NT, Windows 2000 y Windows XP.

Más información

Cuando utilice cualquiera de las funciones VDMDBG, deberá vincular VDMDBG.lib con el proyecto.

Las funciones VDMDBG mencionadas a continuación son sólo un subconjunto de las funciones disponibles. Sin embargo, las funciones que no se mencionan sólo son relevantes para un depurador.

Enumerar VDM (máquina con dos virtual)

La función VDMEnumProcessWOW() proporciona una manera sencilla enumerar VDMs todas las tareas de Windows de 16 bits en ejecución. Estos VDM (máquina con dos virtual) contiene la tarea WowExec.exe. No se enumeran DOS VDM (máquina con dos virtual).

La declaración para esta función es como sigue:
   INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );
				
el valor devuelto para esta función es el número de VDM (máquina con realizando dos virtual) o ha finalizado la enumeración enumerada antes de número. fp es un puntero a una función de devolución de llamada. La función se llama para cada VDM enumerada. lParam es un valor definido por el usuario que se pasa a la función de devolución de llamada.

PROCESSENUMPROC se declara del siguiente modo:
   typedef BOOL ( WINAPI *PROCESSENUMPROC )(
      DWORD dwProcessId,
      DWORD dwAttributes,
      LPARAM lpUserDefined
   );
				
la función debe devolver TRUE para detener enumeración o en FALSE para continuar dwProcessId de enumeración. es el identificador de proceso del proceso de NTVDM.exe. Necesitará este identificador al llamar a las funciones VDM mencionadas a continuación.

Enumerar las tareas de Windows de 16 bits

Puede utilizar VDMEnumTaskWOW() y VDMEnumTaskWOWEx() para enumerar las tareas dentro una VDM determinada. La diferencia entre los dos es que VDMEnumTaskWOWEx() proporciona más información a la función de devolución de llamada. Sólo debe utilizar VDM (máquina con devuelto por VDMEnumProcessWOW() con estas funciones de enumeración de tarea dos virtual). Utilizar DOS VDM (máquina con dos virtual) no tiene sentido puesto que cada aplicación de MS-DOS se ejecuta en su propio VDM.

Las declaraciones son:
   INT WINAPI VDMEnumTaskWOW( DWORD dwProcessId, TASKENUMPROC fp,
                              LPARAM lparam );
				
   INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,
                                LPARAM lparam );
				
el valor devuelto para cada una de estas funciones es el número de tareas que actualmente se ejecutan dentro de la VDM indicado o ha finalizado la enumeración enumerada antes de número. dwProcessId es el identificador de proceso de fp VDM. un puntero a una función de devolución de llamada. La función se llama para cada tarea que se enumera. lParam es un valor definido por el usuario que se pasa a la función de devolución de llamada.

TASKENUMPROC y TASKENUMPROCEX se definen como sigue:
   typedef BOOL ( WINAPI *TASKENUMPROC )(
      DWORD dwThreadId,
      WORD hMod16,
      WORD hTask16,
      LPARAM lpUserDefined
   );
				
   typedef BOOL ( WINAPI *TASKENUMPROCEX )(
      DWORD dwThreadId,
      WORD hMod16,
      WORD hTask16,
      PSZ pszModName,
      PSZ pszFileName,
      LPARAM lpUserDefined
   );
				
estas funciones deben devolver TRUE al detener enumeración o FALSE para continuar la enumeración. Puede utilizar hTask16 en una llamada para terminar la tarea.

Ejemplo de enumeración

   // Enumerate all 16-bit tasks on the system.
   #include <windows.h>
   #include <stdio.h>
   #include <vdmdbg.h>

   BOOL WINAPI ProcessEnumProc( DWORD, DWORD, LPARAM );
   BOOL WINAPI TaskEnumProcEx( DWORD, WORD, WORD, PSZ, PSZ, LPARAM );

   void main()
   {
      // Enumerate VDMs.
      VDMEnumProcessWOW(
         (PROCESSENUMPROC)ProcessEnumProc,
         (LPARAM)NULL
      );

   }

   BOOL WINAPI ProcessEnumProc( DWORD dwProcessId, DWORD dwAttrib,
      LPARAM t )
   {
      printf("\nProcess ID: %d\n", dwProcessId);

      // Use process ID of VDM to enumerate through its tasks.
      VDMEnumTaskWOWEx(
         dwProcessId,
         (TASKENUMPROCEX)TaskEnumProcEx,
         (LPARAM)NULL
      );

      // Keep enumerating.
      return FALSE;
   }

   BOOL WINAPI TaskEnumProcEx( DWORD dwThreadId, WORD hMod16, WORD hTask16,
      PSZ pszModName, PSZ pszFileName, LPARAM lParam )
   {
      //print task's information
      printf("Thread ID: %d\n", dwThreadId);
      printf("Module handle: %d\n", hMod16);
      printf("Task handle: %d\n", hTask16);
      printf("Module Name: %s\n", pszModName);
      printf("File Name: %s\n", pszFileName);

      // Keep enumerating.
      return FALSE;
   }
				

Crear tareas de 16 bits

VDMStartTaskInWOW() crea una tarea dentro de una VDM. La declaración es como sigue:
   BOOL WINAPI VDMStartTaskInWOW( DWORD dwProcessId, LPSTR lpCommandLine,
                                  WORD wShow );
				
el valor devuelto de esta función es TRUE si se inició correctamente la tarea, en caso contrario, es FALSE. dwProcessId es el identificador de proceso VDM. lpCommandLine es una cadena que indica el nombre de archivo de la aplicación de 16 bits junto con los parámetros de línea de comandos. wShow indica cómo se debe mostrar la ventana. wShow puede ser cualquier valor que es válido para la función de ShowWindow() de 16 bits.

Terminar tareas de 16 bits

Para terminar una tarea dentro de una llamada VDM VDMTerminateTaskWOW(). La declaración es como sigue:
   BOOL WINAPI VDMTerminateTaskWOW( DWORD dwProcessId, WORD htask );
				
el valor devuelto de esta función es TRUE si la tarea finaliza correctamente, en caso contrario, es FALSE. dwProcessId es el hTask de Id. de proceso VDM el identificador de la tarea. Este identificador de tarea puede obtenerse a través de VDMEnumTaskWOW() o VDMEnumTaskWOWEx().

Este método es un equivalente aproximado para TerminateProcess() en Win32. Se debe evitar, si es posible. No ofrece la tarea una oportunidad para salir de claridad, por lo que datos pueden ser perdidos. A diferencia de Win32, no se garantiza que la WowExec limpiar después de una tarea terminada. Esto puede dejar el VDM dañado e inutilizable. Para terminar limpiamente la tarea, envíe un se ha WM_CLOSE a su ventana de nivel superior.

Nota acerca de aplicaciones de MS-DOS de 16 bits

Ninguna de las funciones VDMDBG funciona con aplicaciones de MS-DOS de 16 bits. Para enumerar DOS VDM (máquina con dos virtual), deberá utilizar otro método. En primer lugar, puede utilizar VDMEnumProcessWOW() para crear una lista de VDM todo de (máquina con Win16 de dos virtual) y, a continuación, enumerar todas las instancias de NTVDM.exe mediante algunos otro esquema (como PSAPI). Cualquier NTVDM.exe de la enumeración completa que no estaba en la lista de Win16 es una DOS VDM. Puede crear y terminar las aplicaciones de MS-DOS de 16 bits con CreateProcess() y TerminateProcess().

Propiedades

Id. de artículo: 182559 - Última revisión: sábado, 22 de febrero de 2014 - Versión: 3.4
La información de este artículo se refiere a:
  • Microsoft Win32 Application Programming Interface sobre las siguientes plataformas
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
Palabras clave: 
kbnosurvey kbarchive kbmt kbapi kbhowto kbkernbase kbthread KB182559 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 182559

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com