Utilizzo di funzioni VDMDBG in Windows NT, Windows 2000 e Windows XP

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

182559
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
Sommario
Anche se la programmazione in un ambiente a 32 bit, esistono casi quando è necessario lavorare con le applicazioni a 16 bit in. In Windows NT, le applicazioni a 16 bit vengono eseguite all'interno di una Virtual DOS Machine (VDM). VDMDBG.dll contiene molte funzioni utili per l'utilizzo di applicazioni a 16 bit. Questa libreria fa parte di Microsoft Platform SDK.

VDMDBG funzioni consentono una buona per enumerare, creare e terminare i processi a 16 bit (attività) all'interno di una VDM. In questo articolo viene descritto come utilizzare queste funzioni in Microsoft Windows NT, Windows 2000 e Windows XP.
Informazioni
Quando si utilizza una delle funzioni VDMDBG, è necessario collegare VDMDBG.lib con il progetto.

Le funzioni VDMDBG riportate di seguito sono solo un sottoinsieme delle funzioni disponibili. Tuttavia, le funzioni menzionate non sono rilevanti solo a un debugger.

Enumerazione VDMs

La funzione VDMEnumProcessWOW() fornisce un modo semplice per enumerare tutti i VDMs esegue attività di Windows a 16 bit. Questi VDMs contenere l'attività WowExec.exe. DOS VDMs non vengono enumerati.

La dichiarazione di questa funzione è la seguente:
   INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );				
il valore restituito per questa funzione è il numero di VDMs attualmente in esecuzione, o l'enumerazione enumerato prima numero è stato terminato. fp è un puntatore a una funzione di callback. La funzione viene chiamata per ogni VDM che viene enumerata. lParam è un valore definito dall'utente è passato alla funzione callback.

PROCESSENUMPROC è dichiarata nel modo seguente:
   typedef BOOL ( WINAPI *PROCESSENUMPROC )(      DWORD dwProcessId,      DWORD dwAttributes,      LPARAM lpUserDefined   );				
la funzione deve restituire TRUE per l'enumerazione stop o FALSE per continuare dwProcessId enumerazione. è l'ID di processo del processo di NTVDM.exe. Questo ID è necessario quando si chiamano altre funzioni VDM riportati di seguito.

L'enumerazione delle attività di Windows a 16 bit

È possibile utilizzare VDMEnumTaskWOW() e VDMEnumTaskWOWEx() per enumerare attività all'interno di una particolare VDM. La differenza tra i due è che VDMEnumTaskWOWEx() fornisce ulteriori informazioni per la funzione di callback. È necessario utilizzare solo VDMs restituito da VDMEnumProcessWOW() con queste funzioni di enumerazione di attività. Utilizzando MS-DOS VDMs non ha senso poiché tutte le applicazioni MS-DOS viene eseguito nel proprio VDM.

Le dichiarazioni sono:
   INT WINAPI VDMEnumTaskWOW( DWORD dwProcessId, TASKENUMPROC fp,                              LPARAM lparam );				
   INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,                                LPARAM lparam );				
il valore restituito per ciascuna di queste funzioni è il numero di attività attualmente in esecuzione all'interno di VDM indicato, o l'enumerazione enumerato prima numero è stato terminato. dwProcessId è l'ID di processo di fp VDM. è un puntatore a una funzione di callback. La funzione viene chiamata per ogni attività che viene enumerata. lParam è un valore definito dall'utente è passato alla funzione callback.

TASKENUMPROC e TASKENUMPROCEX sono definiti come segue:
   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   );				
queste funzioni dovrebbe essere ripristinato TRUE enumerazione stop o FALSE per continuare l'enumerazione. È possibile utilizzare hTask16 in una chiamata per terminare l'attività.

Esempio di enumerazione

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

Creazione di attività a 16 bit

VDMStartTaskInWOW() crea un'attività all'interno di una VDM. La dichiarazione è come segue:
   BOOL WINAPI VDMStartTaskInWOW( DWORD dwProcessId, LPSTR lpCommandLine,                                  WORD wShow );				
il valore restituito di questa funzione è TRUE se l'attività viene avviato correttamente, la in caso contrario è FALSE. dwProcessId è l'ID del processo VDM. lpCommandLine è una stringa che indica il nome del file dell'applicazione a 16 bit insieme con i parametri della riga di comando. wShow indica come visualizzare la finestra. wShow può essere qualsiasi valore valido per la funzione di ShowWindow() 16 bit.

Attività di terminazione 16-bit

Per terminare un'attività all'interno di una chiamata VDM VDMTerminateTaskWOW(). La dichiarazione è come segue:
   BOOL WINAPI VDMTerminateTaskWOW( DWORD dwProcessId, WORD htask );				
il valore restituito di questa funzione è TRUE se l'attività è completata, in caso contrario è FALSO. dwProcessId il hTask di ID. processo VDM è l'handle per l'attività. È possibile ottenere l'handle di attività tramite VDMEnumTaskWOW() o VDMEnumTaskWOWEx().

Questo metodo è un equivalente approssimativo TerminateProcess() in Win32. Consigliabile evitare, se possibile. Non fornisce l'attività possibilità di uscita correttamente, pertanto i dati potrebbero essere persi. A differenza di Win32, non è garantito il WowExec per pulire dopo un'operazione terminata. Questo può lasciare il VDM danneggiata e inutilizzabile. Per terminare correttamente l'attività, inviare un WM_CLOSE alla finestra principale.

Nota su applicazioni DOS a 16 bit

Nessuna delle funzioni VDMDBG funziona con applicazioni DOS a 16 bit. Per enumerare VDMs MS-DOS, è necessario utilizzare un altro metodo. In primo luogo, è possibile utilizzare VDMEnumProcessWOW() per creare un elenco di tutti VDMs Win16 e quindi enumerare tutte le istanze di NTVDM.exe utilizzando alcuni altri schema (ad esempio PSAPI). Qualsiasi NTVDM.exe dall'enumerazione completo che non è nell'elenco Win16 è una VDM DOS. Creare e terminare le applicazioni MS-DOS a 16 bit con CreateProcess() e TerminateProcess().

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 182559 - Ultima revisione: 02/22/2014 09:27:27 - Revisione: 3.4

  • Microsoft Win32 Application Programming Interface
  • kbnosurvey kbarchive kbmt kbapi kbhowto kbkernbase kbthread KB182559 KbMtit
Feedback