摘要
即使是在 32位環境中編寫程式,也經常碰到處理 16位應用程式的情況。在 Windows NT 中,16位程式是運行在虛擬 DOS 機(VDM)中的。VDMDBG.dll 包含許多處理16位程式的有用函數,這個庫是 Platform SDK 的一部分。
VDMDBG 中的函數提供了很好的方式在 VDM 中枚舉、建立和終止 16位進程(任務)。本文將描述如何在Windows NT、Windows 2000 和 Windows XP 中使用這些函數。
如果需要使用 VDMDBG 函數,你的工程必須連結 VDMDBG.lib。
下面提及的 VDMDBG 函數僅僅是一個子集。未提及的函數只與調試器有關。
枚舉 VDMs
VDMEnumProcessWOW() 函數提供了一種簡單的方式來枚舉所有 運行 Windows 任務的 VDMs。這些 VDMs 包含 WowExec.exe 任務。DOS VDMs 不在枚舉之列。 該函數的聲明如下:INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );
該函數的傳回值是當前啟動並執行 VDMs 數,或者終止枚舉前的枚舉數目。fp 是一個回呼函數指標。該函數針對被枚舉的 VDM 被調用一次。lParam 是使用者定義的值,這個值被傳遞給回呼函數。
PROCESSENUMPROC 的聲明如下:
typedef BOOL ( WINAPI *PROCESSENUMPROC )(
DWORD dwProcessId,
DWORD dwAttributes,
LPARAM lpUserDefined
);
這個函數返回 TRUE 停止枚舉,返回 FALSE 繼續枚舉。dwProcessId 是 NTVDM.exe 進程ID。在調用其它VDM函數時(下面會提到這些函數),你會需要此 ID。
枚舉 16-位 Windows 任務
你可以用 VDMEnumTaskWOW() 和 VDMEnumTaskWOWEx() 在特定的 VDM 中枚舉任務。兩者的差別是 VDMEnumTaskWOWEx() 為回呼函數提供更多的資訊。你只能使用 VDMEnumProcessWOW() 返回的 VDMs 來調用這些任務枚舉函數。用 DOS VDMs 是沒有意義的,因為 DOS 應用程式運行在自己的 VDM 中。這兩個函數的惡聲明如下:
INT WINAPI VDMEnumTaskWOW( DWORD dwProcessId, TASKENUMPROC fp,LPARAM lparam );
INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,
LPARAM lparam );
這兩個函數的傳回值是當前運行在指定 VDM 中的任務數,或者每局終止前的枚舉數。dwProcessId 是 VDM 的惡進程ID。fp 是指向回呼函數的指標。每個被枚舉的任務都調用該函數。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 終止任務。