#define STRICT #include #include #define _FAR_USE_FARFINDDATA #include "plugin.hpp" #ifdef __GNUC__ #include "CRT/crt.hpp" #endif #ifdef _MSC_VER #pragma hdrstop # pragma comment( lib, "version.lib" ) #endif #ifndef BELOW_NORMAL_PRIORITY_CLASS # define BELOW_NORMAL_PRIORITY_CLASS 0x00004000 # define ABOVE_NORMAL_PRIORITY_CLASS 0x00008000 typedef unsigned long ULONG_PTR, *PULONG_PTR; #endif #ifndef ACTL_GETPOLICIES # define ACTL_GETPOLICIES (ACTL_SETARRAYCOLOR+2) # define FFPOL_KILLTASK 0x00200000 #endif #define Min(x,y) (((x)<(y)) ? (x):(y)) #define Max(x,y) (((x)>(y)) ? (x):(y)) #define MAX_CMDLINE 512 // Max length of displayed process's cmd line #define NPANELMODES 10 // Number of panel modes #define MAX_MODE_STR 80 // Max length of panel mode string and width string #define MAX_CUSTOM_COLS 20 // Max number of custom cols in any panel mode #define MAX_DATETIME 50 extern PluginStartupInfo Info; extern FarStandardFunctions FSF; class PerfThread; class WMIConnection; extern struct _Opt { int AddToDisksMenu; int DisksMenuDigit; int AddToPluginsMenu; int ExportEnvironment; int ExportModuleInfo; int ExportModuleVersion; int ExportPerformance; int ExportHandles; int EnableWMI; //int AnsiOutput; static void Read(); static void Write(); } Opt; inline int Message(unsigned Flags, char *HelpTopic, PCSTR*Items, int nItems, int nButtons=1) { return Info.Message(Info.ModuleNumber, Flags, HelpTopic, Items, nItems, nButtons); } extern class ui64Table { unsigned __int64 Table[21]; public: ui64Table(); unsigned __int64 tenpow(unsigned n); } *_ui64Table; class Plist { private: void PrintVersionInfo(HANDLE InfoFile, char* FullPath); void Reread(); void FileTimeToText(FILETIME *CurFileTime,FILETIME *SrcTime,char *TimeText); void PutToCmdLine(char* tmp); DWORD LastUpdateTime; char HostName[64]; PerfThread* pPerfThread; unsigned StartPanelMode; unsigned SortMode; WMIConnection* pWMI; DWORD dwPluginThread; void GeneratePanelModes(); int Control(int Command, void *Param) { return (*Info.Control)(this, Command, Param); } int Menu(unsigned int Flags, char *Title, char *Bottom, char *HelpTopic, int *BreakKeys, FarMenuItem *Item, int ItemsNumber) { return (*Info.Menu)(Info.ModuleNumber, -1, -1, 0, Flags, Title, Bottom, HelpTopic, BreakKeys,0, Item, ItemsNumber); } static bool TranslateMode(char* src, char* dest); void PrintOwnerInfo(HANDLE InfoFile, DWORD dwPid); bool ConnectWMI(); void DisconnectWMI(); void WmiError(); public: Plist(); ~Plist(); bool Connect(LPCSTR pMachine, LPCSTR pUser=0, LPCSTR pPasw=0); int GetFindData(PluginPanelItem* &pPanelItem,int &pItemsNumber,int OpMode); void FreeFindData(PluginPanelItem *PanelItem,int ItemsNumber); void GetOpenPluginInfo(OpenPluginInfo *Info); int SetDirectory(char *Dir,int OpMode); int GetFiles(PluginPanelItem *PanelItem,int ItemsNumber, int Move,char *DestPath,int OpMode, _Opt& opt=::Opt); int DeleteFiles(PluginPanelItem *PanelItem,int ItemsNumber, int OpMode); int ProcessEvent(int Event,void *Param); int Compare(const PluginPanelItem *Item1, const PluginPanelItem *Item2, unsigned int Mode); int ProcessKey(int Key,unsigned int ControlState); PanelMode* Plist::PanelModes(int& nModes); static char* PrintTitle(int MsgId); static bool GetVersionInfo(char* pFullPath, char* &pBuffer, char* &pVersion, char* &pDesc); static bool bInit; static PanelMode PanelModesLocal[NPANELMODES], PanelModesRemote[NPANELMODES]; static char ProcPanelModesLocal[NPANELMODES][MAX_MODE_STR], ProcPanelModesRemote[NPANELMODES][MAX_MODE_STR]; static char PanelModeBuffer[NPANELMODES*MAX_MODE_STR*4*2]; static void SavePanelModes(); static void InitializePanelModes(); static bool PanelModesInitialized() { return PanelModesLocal[0].ColumnTypes!=0; } }; struct InitDialogItem { unsigned char Type; unsigned char X1,Y1,X2,Y2; unsigned char Focus; DWORD_PTR Selected; unsigned int Flags; unsigned char DefaultButton; char *Data; }; struct ProcessData { DWORD Size; HWND hwnd; // DWORD Threads; DWORD dwPID; DWORD dwParentPID; DWORD dwPrBase; UINT uAppType; char FullPath[NM]; }; struct ProcessDataNT : ProcessData { DWORD dwElapsedTime; char CommandLine[MAX_CMDLINE]; }; extern int NT, W2K; extern char PluginRootKey[80]; class PerfThread; BOOL GetList95(PluginPanelItem **pPanelItem,int *pItemsNumber); BOOL GetListNT(PluginPanelItem **pPanelItem,int *pItemsNumber,PerfThread& PThread); BOOL KillProcess(DWORD pid); BOOL KillProcessNT(DWORD pid,HWND hwnd); char *GetMsg(int MsgId); void InitDialogItems(InitDialogItem *Init,FarDialogItem *Item, int ItemsNumber); //int LocalStricmp(char *Str1,char *Str2); void ConvertDate(const FILETIME &ft,char *DateText,char *TimeText); int Config(); void SetRegKey(const char *Key,const char *ValueName,char *ValueData); void SetRegKey(const char *Key,const char *ValueName,DWORD ValueData); void SetRegKey(const char *Key,const char *ValueName,BYTE *ValueData,DWORD ValueSize); int GetRegKey(const char *Key,const char *ValueName,char *ValueData,char *Default,DWORD DataSize); int GetRegKey(const char *Key,const char *ValueName,int &ValueData,DWORD Default); int GetRegKey(const char *Key,const char *ValueName,DWORD Default); int GetRegKey(const char *Key,const char *ValueName,BYTE *ValueData,BYTE *Default,DWORD DataSize); void DeleteRegKey(const char *Key); int WinError(char* pSourceModule=0, BOOL bDown=FALSE); BOOL ChangePrivileges(BOOL bAdd, BOOL bAsk); class OemString { char* pStr; public: OemString(LPCSTR pAnsi); OemString(LPCWSTR pWide); ~OemString() { delete pStr; } operator char*() { return pStr; } operator unsigned char*() { return (unsigned char*)pStr; } }; void GetOpenProcessDataNT(HANDLE hProcess, char* pProcessName=0, DWORD cbProcessName=0, char* pFullPath=0, DWORD cbFullPath=0, char* pCommandLine=0, DWORD cbCommandLine=0, char** ppEnvStrings=0, OemString** pCurDir=0); HANDLE OpenProcessForced(DWORD dwFlags, DWORD dwProcessId, BOOL bInh = FALSE); enum { SM_CUSTOM=64, SM_PID, SM_PARENTPID, SM_PRIOR, SM_PERFCOUNTER, SM_PERSEC=128 }; extern char CustomColumns[10][10]; BOOL GetListNT(PluginPanelItem* &pPanelItem,int &ItemsNumber,PerfThread& PThread); BOOL GetList95(PluginPanelItem*& pPanelItem,int &ItemsNumber); DWORD GetHeapSize(DWORD dwPID); char* PrintNTUptime(void*p); char* PrintTime(ULONGLONG ul100ns, bool bDays=true); void DumpNTCounters(HANDLE InfoFile, PerfThread& PThread, DWORD dwPid, DWORD dwThreads); void PrintNTCurDirAndEnv(HANDLE InfoFile, HANDLE hProcess, BOOL bExportEnvironment); void PrintModules95(HANDLE InfoFile, DWORD dwPID, _Opt& opt); void PrintModulesNT(HANDLE InfoFile, DWORD dwPID, _Opt& opt); bool PrintHandleInfo(DWORD dwPID, HANDLE file, bool bIncludeUnnamed, PerfThread* pThread=0); extern bool GetPData95(ProcessData& pdata); struct ProcessPerfData; extern bool GetPDataNT(ProcessDataNT& pdata, ProcessPerfData& pd); void MakeViewOptions(FarDialogItem* Items, _Opt& Opt, int offset); void GetViewOptions(FarDialogItem* Items, _Opt& Opt); #define NVIEWITEMS 7 #define ArraySize(d) (sizeof(d)/sizeof(d[0])) //------ // dynamic binding typedef enum _PROCESSINFOCLASS { ProcessBasicInformation = 0, ProcessWow64Information = 26 } PROCESSINFOCLASS; // #ifndef STATUS_NOT_IMPLEMENTED #define STATUS_NOT_IMPLEMENTED ((LONG)0xC0000002L) #endif #ifndef STATUS_INFO_LENGTH_MISMATCH #define STATUS_INFO_LENGTH_MISMATCH ((LONG)0xC0000004L) #endif // typedef LONG (WINAPI *PNtQueryInformationProcess)(HANDLE,PROCESSINFOCLASS,PVOID,ULONG,PULONG); extern PNtQueryInformationProcess pNtQueryInformationProcess; typedef LONG (WINAPI *PNtQueryInformationThread)(HANDLE, ULONG, PVOID, DWORD, DWORD*); extern PNtQueryInformationThread pNtQueryInformationThread; typedef LONG (WINAPI *PNtQueryObject)(HANDLE, DWORD, VOID*, DWORD, VOID*); extern PNtQueryObject pNtQueryObject; typedef LONG (WINAPI *PNtQuerySystemInformation)(DWORD, VOID*, DWORD, ULONG*); extern PNtQuerySystemInformation pNtQuerySystemInformation; typedef LONG (WINAPI *PNtQueryInformationFile)(HANDLE, PVOID, PVOID, DWORD, DWORD); extern PNtQueryInformationFile pNtQueryInformationFile; typedef LONG (WINAPI *PNtQueryInformationFile)(HANDLE, PVOID, PVOID, DWORD, DWORD); extern PNtQueryInformationFile pNtQueryInformationFile; typedef BOOL (WINAPI *PIsValidSid)(PSID); extern PIsValidSid pIsValidSid; typedef PSID_IDENTIFIER_AUTHORITY (WINAPI *PGetSidIdentifierAuthority)(PSID); extern PGetSidIdentifierAuthority pGetSidIdentifierAuthority; typedef PUCHAR (WINAPI *PGetSidSubAuthorityCount)(PSID); extern PGetSidSubAuthorityCount pGetSidSubAuthorityCount; typedef PDWORD (WINAPI *PGetSidSubAuthority)(PSID, DWORD); extern PGetSidSubAuthority pGetSidSubAuthority; typedef BOOL (WINAPI *PLookupAccountName)(LPCTSTR,LPCTSTR,PSID,LPDWORD,LPTSTR,LPDWORD,PSID_NAME_USE); extern PLookupAccountName pLookupAccountName; typedef BOOL (WINAPI *PIsWow64Process)(IN HANDLE hProcess, IN PBOOL Wow64Process); extern PIsWow64Process pIsWow64Process; typedef DWORD (WINAPI *PGetGuiResources)(IN HANDLE hProcess, IN DWORD uiFlags); extern PGetGuiResources pGetGuiResources; typedef HRESULT (WINAPI *PCoInitializeSecurity)(PSECURITY_DESCRIPTOR,LONG,SOLE_AUTHENTICATION_SERVICE*, void*,DWORD,DWORD,SOLE_AUTHENTICATION_LIST*,DWORD,void*); extern PCoInitializeSecurity pCoInitializeSecurity; //------ int fprintf(HANDLE stream, const char *format, ...); int fputc(int c, HANDLE stream);