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

Traduções de Artigos Traduções de Artigos
Artigo: 182559 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Mesmo quando programação num ambiente de 32 bits, há alturas quando é necessário trabalhar com aplicações de 16 bits. No Windows NT, as aplicações de 16 bits executadas dentro de um Virtual DOS Machine (VDM). VDMDBG.dll contém muitas funções são úteis para trabalhar com aplicações de 16 bits. Esta biblioteca faz parte do Microsoft Platform SDK.

Funções VDMDBG fornecem uma forma boa para enumerar, criar e terminar processos de 16 bits (tarefas) dentro de uma VDM. Este artigo descreve como utilizar estas funções no Microsoft Windows NT, Windows 2000 e Windows XP.

Mais Informação

Quando utiliza qualquer uma das funções VDMDBG, terá de ligar VDMDBG.lib com o projecto.

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

Enumerar VDMs

A função VDMEnumProcessWOW() fornece uma forma simples para enumerar todos os VDMs 16-bit Windows tarefas em execução. Estes VDMs contém a tarefa WowExec.exe. DOS VDMs não são enumerados.

A declaração para esta função é o seguinte:
   INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );
				
o valor devolvido para esta função é o número de VDMs actualmente em execução ou foi terminada a enumeração enumerada antes de número. fp é um apontador para uma função de chamada de retorno. A função é chamada para cada VDM é enumerada. lParam é um valor definido pelo utilizador é transmitido para a função de chamada de retorno.

PROCESSENUMPROC está declarado da seguinte forma:
   typedef BOOL ( WINAPI *PROCESSENUMPROC )(
      DWORD dwProcessId,
      DWORD dwAttributes,
      LPARAM lpUserDefined
   );
				
deverá devolver a função VERDADEIRO para enumeração de paragem ou FALSE para continuar a enumeração. dwProcessId é o ID processo do processo de NTVDM.exe. Terá este ID ao chamar as outras funções VDM mencionadas abaixo.

Enumerar tarefas Windows de 16 bits

Pode utilizar VDMEnumTaskWOW() e VDMEnumTaskWOWEx() enumerar tarefas dentro de uma determinado VDM. A diferença entre os dois é que VDMEnumTaskWOWEx() fornece mais informações para a função de chamada de retorno. Só deve utilizar VDMs devolvidos pelo VDMEnumProcessWOW() com estas funções de enumeração de tarefa. Utilização DOS VDMs não faz sentido uma vez que cada aplicação DOS é executado no 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 devolvido para cada uma destas funções é o número de tarefas actualmente em execução no VDM indicado, ou a enumeração enumerada antes de número foi terminada. dwProcessId é o ID de processo do fp VDM. um apontador para uma função de chamada de retorno. A função é chamada para cada tarefa que é enumerada. lParam é um valor definido pelo utilizador é transmitido para a função de chamada de retorno.

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
   );
				
estas funções deverão devolver VERDADEIRO para enumeração de paragem ou FALSE para continuar a enumeração. Pode utilizar hTask16 numa chamada para terminar a tarefa.

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 é o seguinte:
   BOOL WINAPI VDMStartTaskInWOW( DWORD dwProcessId, LPSTR lpCommandLine,
                                  WORD wShow );
				
o valor devolvido desta função é VERDADEIRO se a tarefa é iniciada com êxito, caso contrário é FALSO. dwProcessId é o ID de processo VDM. lpCommandLine é uma cadeia que indica o nome do ficheiro da aplicação de 16 bits juntamente com quaisquer parâmetros da linha de comandos. wShow indica como será mostrada a janela. wShow pode ser qualquer valor válido para a função de ShowWindow() de 16 bits.

Terminar tarefas de 16 bits

Para terminar uma tarefa dentro de uma chamada VDM VDMTerminateTaskWOW(). A declaração é o seguinte:
   BOOL WINAPI VDMTerminateTaskWOW( DWORD dwProcessId, WORD htask );
				
o valor devolvido desta função é VERDADEIRO se a tarefa é terminada com êxito, caso contrário é FALSO. dwProcessId é o hTask de ID. de processo VDM é o identificador para a tarefa. Este identificador de tarefa pode ser obtido através de VDMEnumTaskWOW() ou VDMEnumTaskWOWEx().

Este método é um equivalente incompleto TerminateProcess() no Win32. Deve ser evitada, se possível. Não lhe dá a tarefa a oportunidade de saída cleanly, por isso dados poderão ser perdidos. Ao contrário do Win32, o WowExec não é garante que limpar depois de uma tarefa foi terminada. Isto pode deixar o VDM danificada e inutilizável. Para terminar a tarefa correctamente, envie uma WM_CLOSE a respectiva janela de nível superior.

Nota relativamente a aplicações de 16 bits

Nenhuma das funções VDMDBG funciona com aplicações de 16 bits. Para enumerar DOS VDMs, terá de utilizar outro método. Em primeiro lugar, pode utilizar VDMEnumProcessWOW() para criar uma lista de todos os Win16 VDMs e, em seguida, enumerar todas as ocorrências de NTVDM.exe utilizando outro esquema (tais como PSAPI). Qualquer NTVDM.exe da enumeração completa que não estava na lista Win16 é DOS VDM. Pode criar e terminar aplicações de 16 bits com CreateProcess() e TerminateProcess().

Propriedades

Artigo: 182559 - Última revisão: 22 de fevereiro de 2014 - Revisão: 3.4
A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Application Programming Interface 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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