Войти

Использование функции VDMDBG в Windows NT, Windows 2000 и Windows XP

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

182559
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Аннотация
Даже при программировании в 32-разрядной среде, бывают случаи, когда работас 16-разрядные приложения не требуется. В Windows NT, 16-разрядных приложенийвыполнение в рамках виртуальной машины DOS (VDM). VDMDBG.dll содержит множество функцийкоторые могут пригодиться для работы с 16-разрядными приложениями. Эта библиотека является частьюSDK платформы Microsoft.

VDMDBG функции представляют собой удобный способ для перечисления, создания и завершения 16-бит процессы (задачи) в пределах VDM. В данной статье описывается использование этихфункции в Microsoft Windows NT, Windows 2000 и Windows XP.
Дополнительная информация
При использовании функции VDMDBG необходимо связать VDMDBG.lib св проект.

VDMDBG функции, упомянутые ниже, являются только подмножество доступныхфункции. Тем не менее функции, не упомянутые относятся тольков отладчике.

Перечисление VDM

Функция VDMEnumProcessWOW() предоставляет простой способ для перечисления всехЗапуск 16-разрядные задачи VDM. Эти процессы VDM содержат WowExec.exe задачи.VDM DOS не отображаются.

Объявление для этой функции выглядит следующим образом:
   INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );				
Возвращаемое значение для этой функции — количество VDM в настоящее время работает,номер или перечисление до завершения перечисления. fp является указателемфункцию обратного вызова. Функция вызывается для каждого VDM, т.е.перечисление. параметр lParam является определяемое пользователем значение передается функции обратного вызовафункция.

PROCESSENUMPROC объявляется следующим образом:
   typedef BOOL ( WINAPI *PROCESSENUMPROC )(      DWORD dwProcessId,      DWORD dwAttributes,      LPARAM lpUserDefined   );				
Функция вернет TRUE, чтобы остановить перечисление или значение FALSE, чтобы продолжитьзначение перечисления. dwProcessId — это идентификатор процесса NTVDM.exe. Выпонадобится этот идентификатор при вызове других функций VDM, указанных ниже.

Перечисление 16-разрядные задачи

VDMEnumTaskWOW() и VDMEnumTaskWOWEx() можно использовать для перечисления задачив рамках конкретного VDM. Различие между ними в том, чтоVDMEnumTaskWOWEx() предоставляет дополнительные сведения о функции обратного вызова. Выследует использовать только VDM, возвращенный VDMEnumProcessWOW() с этих задачперечисления функций. С помощью VDM DOS не смысла, поскольку каждый DOSприложение работает в собственном VDM.

Объявления являются:
   INT WINAPI VDMEnumTaskWOW( DWORD dwProcessId, TASKENUMPROC fp,                              LPARAM lparam );				
   INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,                                LPARAM lparam );				
Возвращаемое значение для каждого из этих функций является число задачв настоящее время выполняется в пределах указанного VDM или номером, предшествующимПеречисление было прервано. dwProcessId — это идентификатор процесса VDM. является передней панелиуказатель на функцию обратного вызова. Функция вызывается для каждой задачиперечисления. lParam является определяемый пользователем значение, которое передаетсяфункция обратного вызова.

TASKENUMPROC и TASKENUMPROCEX определены следующим образом:
   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   );				
Эти функции должны возвращать TRUE, чтобы остановить перечисление или значение FALSE, чтобы продолжитьзначение перечисления. С помощью hTask16 вызова для завершения задачи.

Пример перечисления

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

Создание 16-разрядные задачи

VDMStartTaskInWOW() создает задачу в VDM. Представляет объявление каквыглядит следующим образом:
   BOOL WINAPI VDMStartTaskInWOW( DWORD dwProcessId, LPSTR lpCommandLine,                                  WORD wShow );				
Возвращаемое значение этой функции имеет значение TRUE, если задача успешнозапущена, в противном случае оно имеет значение FALSE. dwProcessId — это идентификатор процесса VDM.lpCommandLine — это строка, указывающая имя файла 16-разрядного приложенияс помощью параметров командной строки. wShow указывает, каким образом будет окнаПоказать. wShow может быть любое значение, допустимое для 16-разрядных ShowWindow()функция.

16-Разрядные задачи завершение

Для завершения задачи в пределах VDM вызов VDMTerminateTaskWOW(). Вобъявление выглядит следующим образом:
   BOOL WINAPI VDMTerminateTaskWOW( DWORD dwProcessId, WORD htask );				
Возвращаемое значение этой функции имеет значение TRUE, если задача успешнозавершен, в противном случае оно имеет значение FALSE. dwProcessId — это идентификатор процесса VDM. hTaskПредставляет дескриптор для задачи. Этот дескриптор задач может быть получена черезVDMEnumTaskWOW() или VDMEnumTaskWOWEx().

Этот метод — это грубый эквивалент TerminateProcess() в Win32. Он долженможно избежать, если это возможно. Это не дает задание возможность четковыйти из программы, так что данные могут быть потеряны. В отличие от Win32 WowExec не гарантируетсяОчистка после прерванные задачи. Это можно оставить VDM поврежден инепригодным для использования. Аккуратно завершить задачу, отправьте его верхнего уровня для WM_CLOSEокно.

Заметки, относящейся К 16-разрядные приложения DOS

Ни одна из функций VDMDBG работы с 16-разрядные приложения DOS. Дляперечислить VDM DOS, необходимо использовать другой метод. Во-первых можно использоватьVDMEnumProcessWOW() для создания списка всех Win16 VDM и затем перечислитьвсе экземпляры NTVDM.exe, используя другие схемы (например, PSAPI). ЛюбойNTVDM.exe из полного перечисления, которое не было в списке Win16 является DOSVDM. можно создавать и завершение 16-разрядные приложения DOS сCreateProcess() и TerminateProcess().

Предупреждение: эта статья переведена автоматически

Свойства

Номер статьи: 182559 — последний просмотр: 02/23/2014 01:08:47 — редакция: 4.0

  • Microsoft Win32 Application Programming Interface
  • kbnosurvey kbarchive kbapi kbhowto kbkernbase kbthread kbmt KB182559 KbMtru
Отзывы и предложения