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

Переводы статьи Переводы статьи
Код статьи: 182559 - Vizualiza?i produsele pentru care se aplic? acest articol.
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Развернуть все | Свернуть все

В этой статье

Аннотация

Даже при программировании в 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 является DOS VDM. можно создавать и завершение 16-разрядные приложения DOS с CreateProcess() и TerminateProcess().

Свойства

Код статьи: 182559 - Последний отзыв: 23 февраля 2014 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Win32 Application Programming Interface
Ключевые слова: 
kbnosurvey kbarchive kbapi kbhowto kbkernbase kbthread kbmt KB182559 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: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