/*++ BUILD Version: 0001
 *
 *  WOW v1.0
 *
 *  Copyright (c) 1991, Microsoft Corporation
 *
 *  WKMAN.H
 *  WOW32 16-bit Kernel API support (manually-coded thunks)
 *
 *  History:
 *  Created 27-Jan-1991 by Jeff Parsons (jeffpar)
 *  30-Apr-91 mattfe added WK32CheckLoadModuleDrv
 *  26-Aug-91 mattfe added FileIO routines
 *  19-JAN-92 mattfe added getnextvdm routine
 *   4-MAR-92 mattfe added KillProcess
 *  12-mar-92 mattfe added w32notifythread
 *   5-may-92 mattfe added HungAppSupport
--*/

ULONG FASTCALL   WK32DirectedYield(PVDMFRAME pFrame);
ULONG FASTCALL   WK32InitTask(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WOWKernelTrace(PVDMFRAME pFrame);
ULONG FASTCALL   WK32ExitKernel(PVDMFRAME pFrame);
ULONG FASTCALL   WK32FatalExit(PVDMFRAME pFrame);
ULONG FASTCALL   WK32KillRemoteTask(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WOWKillTask(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WOWLoadModule32(PVDMFRAME pFrame);
ULONG FASTCALL   WK32RegisterShellWindowHandle(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WOWInitTask(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WOWNotifyWOW32(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WOWOutputDebugString(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WOWQueryPerformanceCounter(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WaitEvent(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowCloseComPort(PVDMFRAME pFrame);
DWORD FASTCALL   WK32WowDelFile(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowFailedExec(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowFailedExec(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowGetNextVdmCommand (PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowIsKnownDLL(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowSetIdleHook(PVDMFRAME pFrame);
ULONG FASTCALL   WK32Yield(PVDMFRAME pFrame);
ULONG FASTCALL   WK32OldYield(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowWaitForMsgAndEvent(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowMsgBox(PVDMFRAME pFrame);
ULONG FASTCALL   WK32DosWowInit(PVDMFRAME pFrame);
ULONG FASTCALL   WK32CheckUserGdi(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowPartyByNumber(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowGetModuleHandle(PVDMFRAME pFrame);
ULONG FASTCALL   WK32FindAndReleaseDib(PVDMFRAME pvf); /* in wdib.c */
ULONG FASTCALL   WK32WowReserveHtask(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WOWLFNEntry(PVDMFRAME pFrame); /* in wkman.c */
ULONG FASTCALL   WK32WowShutdownTimer(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowTrimWorkingSet(PVDMFRAME pFrame);
ULONG FASTCALL   WK32SetAppCompatFlags(PVDMFRAME pFrame);
ULONG FASTCALL   WK32WowSyncTask(PVDMFRAME pFrame);


BOOL    WK32InitializeHungAppSupport(VOID);
DWORD   W32HungAppNotifyThread(UINT hKillUniqueID);
DWORD   W32RemoteThread(VOID);
DWORD   W32Thread(LPVOID vpInitialSSSP);
VOID    W32DestroyTask( PTD ptd);
VOID    W32EndTask(VOID);
ULONG   W32GetAppCompatFlags(HTASK16 hTask16);
BOOL    W32ReadWOWCompatFlags(HTASK16 htask16, PTD pTD);
VOID    W32Init9xSpecialPath();
BOOL    W32Map9xSpecialPath(PSZ lpPathName, PSZ lpMapPathName);

#ifdef FE_SB
ULONG   W32ReadWOWCompatFlags2(HTASK16 htask16);
#endif // FE_SB
VOID    WK32DeleteTask(PTD ptdDelete);
VOID    WK32InitWowIsKnownDLL(HANDLE hKeyWow);
LRESULT CALLBACK WK32ForegroundIdleHook(int code, WPARAM wParam, LPARAM lParam);
VOID    W32RefreshCurrentDirectories (PCHAR lpszzEnv);
BOOL FASTCALL WowGetProductNameVersion(PSZ pszExePath, PSZ pszProductName,
                                       DWORD cbProductName, PSZ pszProductVersion,
                                       DWORD cbProductVersion,
                                       PSZ pszParamName, PSZ pszParamValue,
                                       DWORD cbParamValue);
BOOL FASTCALL WowDoNameVersionMatch(PSZ pszExePath, PSZ pszProductName,
                                    PSZ pszProductVersion);

VOID W32InitWOWSetupNames(VOID);
BOOL W32IsSetupProgram(PSZ pszModName, PSZ pszFilePath);

// SoftPC Routines
HANDLE  RegisterWOWIdle(void);
VOID BlockWOWIdle(BOOL Blocking);

// User32 Routines
VOID    ShowStartGlass (DWORD GLASSTIME);

typedef struct _HMODCACHE {         /* hmodcache */
    HAND16  hInst16;
    HAND16  hMod16;
} HMODCACHE, *PHMODCACHE;

extern HMODCACHE ghModCache[];
#define CHMODCACHE      4       // size of cache table

VOID RemoveHmodFromCache(HAND16 hmod16);

typedef struct _CMDSHOW {           /* cmdshow */
    WORD    nTwo;
    WORD    nCmdShow;
} CMDSHOW, *PCMDSHOW;

typedef struct _LOAD_MODULE_PARAMS {        /* loadmoduleparms32 */
    LPVOID lpEnvAddress;
    LPSTR lpCmdLine;
    PCMDSHOW lpCmdShow;
    DWORD dwReserved;
} LOAD_MODULE_PARAMS, *PLOAD_MODULE_PARAMS;

typedef struct _WINOLDAP_THREAD_PARAMS {
    HANDLE hProcess;
    HWND   hwndWinOldAp;
} WINOLDAP_THREAD_PARAMS, *PWINOLDAP_THREAD_PARAMS;

DWORD W32WinOldApThread(PWINOLDAP_THREAD_PARAMS pParams);

// Globals

extern INT busycount;               // Used to detect if WOW is hung
extern HAND16 gKillTaskID;      // 16 bit tdb of task to kill
extern HAND16 ghShellTDB;       // TDB of WOWEXEC
extern HWND ghwndShell;       // Needed for ExitWindowsExec

#define CMS_WAITWOWEXECTIMEOUT 60*1000     // Wait for WOWEXEC to respond
#define CMS_WAITTASKEXIT       5*1000     // Hung App Wait TimeOut
#define CMS_FOREVER            0xffffffff  // wait for ever
#define ALL_TASKS              0xffffffff  // for exitvdm

// IRQ:     Interrupt: ICA: Line: Description:
// -------------------------------------------------------------------
// IRQ1     0x09       0    1     Keyboard service required.
#define KEYBOARD_LINE         1
#define KEYBOARD_ICA          0

extern HANDLE  hSharedTaskMemory;
extern DWORD   dwSharedProcessOffset;
extern VPVOID  vpDebugWOW;
extern VPVOID  vptopPDB;

VOID CleanseSharedList( VOID );
VOID AddProcessSharedList( VOID );
VOID RemoveProcessSharedList( VOID );
WORD AddTaskSharedList( HTASK16, HAND16, PSZ, PSZ );
VOID RemoveTaskSharedList( VOID );
ULONG FASTCALL WK32WowPassEnvironment(PVDMFRAME);

extern   HANDLE ghTaskAppHelp;      // hProcess from apphelp (see WK32SyncTask)
extern   BOOL   gfTaskContinue;     // indicates whether child thread should continue without waiting for apphelp 
extern   const  CHAR   szSystem[];  // "\\system" 