//*********************************************************************
//*                  Microsoft Windows                               **
//*            Copyright(c) Microsoft Corp., 1998-                   **
//*********************************************************************
//
// created 8-19-1998
//
//

// class definition for the process information handler
// the class is to wrap NT/Win95 specific debugging aid APIs
#ifdef UNICODE
#undef Process32First 
#undef Process32Next 
#undef PROCESSENTRY32 
#undef PPROCESSENTRY32
#undef LPPROCESSENTRY32
#endif  // !UNICODE
class CProcessInfo
{
public:
    CProcessInfo(); 
    ~CProcessInfo();     
    HRESULT GetExeNameFromPID(DWORD dwPID, LPTSTR szFile, int cchFile);

    BOOL _fNT;
protected:
    HRESULT MakeRoomForInfoArray(int n);
    HRESULT EnsureProcessInfo();
    // 
    // win95 toolhelp stuff
    //
    HRESULT W95InitToolhelp32();
    HRESULT W95CreateProcessList();
    HRESULT W95FillProcessList();

    typedef BOOL (WINAPI* PROCESSWALK)(HANDLE, LPPROCESSENTRY32);
    typedef HANDLE (WINAPI* CREATESNAPSHOT)(DWORD, DWORD);
    CREATESNAPSHOT _lpfnCreateToolhelp32Snapshot;
    PROCESSWALK _lpfnProcess32First;
    PROCESSWALK _lpfnProcess32Next;
    //
    // NT PSAPI stuff
    //
    HRESULT NTInitPsapi();
    HRESULT NTCreateProcessList();
    HRESULT NTFillProcessList(DWORD dwProcessID, int iIndex);
    
    
    typedef BOOL  (CALLBACK* LPFNENUMPROCESSES)(DWORD *,DWORD,DWORD *);
    typedef BOOL  (CALLBACK* LPFNENUMPROCESSMODULES)(HANDLE,HMODULE *,DWORD,LPDWORD);
    typedef DWORD (CALLBACK* LPFNGETMODULEBASENAMEW)(HANDLE,HMODULE,LPWSTR,DWORD);
    HINSTANCE                 _hPsapiDLL; 
    LPFNENUMPROCESSES      _lpfnEnumProcesses; 
    LPFNENUMPROCESSMODULES _lpfnEnumProcessModules; 
    LPFNGETMODULEBASENAMEW  _lpfnGetModuleBaseName;
    //
    // place to hold processs information
    //
    struct PROCESSINFO {
        DWORD dwPID;
        TCHAR szExeName[MAX_PATH];
    } *_pProcInfoArray;
    int _iProcInfoCount;
    int _nAlloced;
};
