Como usar funções VDMDBG no Windows NT, Windows 2000 e Windows XP

Traduções deste artigo Traduções deste artigo
ID do artigo: 182559 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Mesmo quando estiver programando em um ambiente de 32 bits, há ocasiões quando é necessário trabalhar com aplicativos de 16 bits. No Windows NT, aplicativos de 16 bits são executados dentro de uma Virtual DOS Machine (VDM). VDMDBG.dll contém muitas funções que são úteis para trabalhar com aplicativos de 16 bits. Esta biblioteca é parte do Microsoft Platform SDK.

VDMDBG funções fornecem uma boa maneira para enumerar, criar e encerrar processos de 16 bits (tarefas) dentro de uma VDM. Este artigo descreve como usar essas funções no Microsoft Windows NT, Windows 2000 e Windows XP.

Mais Informações

Quando você usar qualquer uma das funções VDMDBG, você precisa vincular VDMDBG.lib com seu projeto.

As funções VDMDBG mencionadas a seguir são apenas um subconjunto das funções disponíveis. No entanto, as funções que não são mencionadas são relevantes apenas para um depurador.

Enumerando VDMs

A função VDMEnumProcessWOW() fornece uma maneira simples para enumerar todas as VDMs executando as tarefas de 16 bits do Windows. Esses VDMs contém a tarefa WowExec.exe. VDMs DOS não são enumerados.

A declaração para esta função é da seguinte maneira:
   INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );
				
o valor de retorno para esta função é o número de VDMs em execução no momento ou a enumeração enumerada antes de número foi encerrada. fp é um ponteiro para uma função de retorno de chamada. A função é chamada para cada VDM é enumerada. lParam é um valor definido pelo usuário que é passado para a função de retorno de chamada.

PROCESSENUMPROC é declarada da seguinte maneira:
   typedef BOOL ( WINAPI *PROCESSENUMPROC )(
      DWORD dwProcessId,
      DWORD dwAttributes,
      LPARAM lpUserDefined
   );
				
a função deve retornar verdadeiro para enumeração de parada ou FALSO para continuar a enumeração. dwProcessId é o processo de identificação do processo NTVDM.exe. Você precisará esta identificação ao chamar outras funções VDM mencionadas abaixo.

Enumerando tarefas do Windows de 16 bits

Você pode usar VDMEnumTaskWOW() e VDMEnumTaskWOWEx() para enumerar tarefas em um determinado VDM. A diferença entre os dois é que VDMEnumTaskWOWEx() fornece mais informações para a função de retorno de chamada. Você só deve usar VDMs retornados pelo VDMEnumProcessWOW() com essas funções de enumeração de tarefa. Usar esses VDMs não faz sentido como cada aplicativo MS-DOS é executado em seu próprio VDM.

As declarações são:
   INT WINAPI VDMEnumTaskWOW( DWORD dwProcessId, TASKENUMPROC fp,
                              LPARAM lparam );
				
   INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,
                                LPARAM lparam );
				
o valor de retorno para cada uma dessas funções é o número de tarefas atualmente em execução dentro de VDM indicado ou a enumeração enumerada antes de número foi encerrada. dwProcessId é a identificação do processo do fp VDM. é um ponteiro para uma função de retorno de chamada. A função é chamada para cada tarefa que seja enumerada. lParam é um valor definido pelo usuário que é passado para a função de retorno de chamada.

TASKENUMPROC e TASKENUMPROCEX são definidos da seguinte forma:
   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
   );
				
essas funções deverá retornar verdadeiro a enumeração de parada ou FALSE para continuar a enumeração. Você pode usar hTask16 em uma chamada para terminá-la.

Exemplo de enumeração

   // 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;
   }
				

Criar tarefas de 16 bits

VDMStartTaskInWOW() cria uma tarefa dentro de uma VDM. A declaração é da seguinte maneira:
   BOOL WINAPI VDMStartTaskInWOW( DWORD dwProcessId, LPSTR lpCommandLine,
                                  WORD wShow );
				
o valor de retorno dessa função é verdadeiro se a tarefa é iniciado com êxito, caso contrário, é falso. dwProcessId é a identificação do processo VDM. lpCommandLine é uma seqüência de caracteres indicando o nome do arquivo do aplicativo de 16 bits juntamente com os parâmetros de linha de comando. wShow indica como a janela será mostrada. wShow pode ser qualquer valor que é válido para a função de ShowWindow() 16 bits.

Finalizando tarefas de 16 bits

Para finalizar uma tarefa dentro de uma chamada VDM VDMTerminateTaskWOW(). A declaração é da seguinte maneira:
   BOOL WINAPI VDMTerminateTaskWOW( DWORD dwProcessId, WORD htask );
				
o valor de retorno dessa função é verdadeiro se a tarefa é encerrada com êxito, caso contrário, é falso. dwProcessId é o hTask de ID. de processo VDM é a alça para a tarefa. Esta alça de tarefa pode ser obtida por meio de VDMEnumTaskWOW() ou VDMEnumTaskWOWEx().

Esse método é um equivalente aproximado TerminateProcess() no Win32. Ele deve ser evitado, se possível. Ele não dá a tarefa a oportunidade de saída correta, portanto, dados podem ser perdidos. Ao contrário do Win32, não é garantido que o WowExec limpeza após uma tarefa terminada. Isso pode deixar o VDM corrompida e inutilizável. Para terminá-la corretamente, envie um WM_CLOSE para sua janela de nível superior.

Observação sobre aplicativos de 16 bits

Nenhuma das funções VDMDBG trabalhar com aplicativos do MS-DOS de 16 bits. Para enumerar VDMs DOS, você precisa usar outro método. Primeiro, pode usar VDMEnumProcessWOW() para fazer uma lista de todas as VDMs Win16 e, em seguida, enumerar todas as instâncias do NTVDM.exe usando alguns outra esquema (como PSAPI). Qualquer NTVDM.exe da enumeração completa que não estava na lista Win16 é DOS VDM. Você pode criar e encerrar aplicativos do MS-DOS de 16 bits com CreateProcess() e TerminateProcess().

Propriedades

ID do artigo: 182559 - Última revisão: sábado, 22 de fevereiro de 2014 - Revisão: 3.4
A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32 nas seguintes plataformas
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
Palavras-chave: 
kbnosurvey kbarchive kbmt kbapi kbhowto kbkernbase kbthread KB182559 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 182559

Submeter comentários

 

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