View Issue Details

IDProjectCategoryView StatusLast Update
0000755PluginsProcListpublic2009-06-02 20:09
ReporterIlyaS Assigned Toalexy  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version1.75 
Fixed in Version2.0 
Summary0000755: Proclist ограничивает Command Line процессов
DescriptionПри просмотре информации выполняемого процесса F3/F4/F5 строка Command Line ограничена 256 символами.
Windows 2000 SP4, Far 1.75 b2527, Far 2.0 b768
Additional InformationНапример,
start cmd /k dir "C:\Documents and Settings" "C:\Documents and Settings" "C:\Documents and Settings" "C:\Documents and Settings" "C:\Documents and Settings" "C:\Documents and Settings" "C:\Documents and Settings" "C:\Documents and Settings" "C:\Documents and Settings" "C:\Documents and Settings" "C:\Documents and Settings" "C:\Documents and Settings" "C:\Program Files"
При просмотре процесса параметр "C:\Program Files" не отображается в Command Line.
TagsNo tags attached.

Activities

igor_yudincev

2009-03-12 20:05

reporter   bugnote:0002773

Предлагаю некий вариант решения, см. патч.
Пропатченный proclist выводит в просмотрщике все 8191 символов командной строки.

2009-03-12 20:05

 

proclist.diff (5,388 bytes)   
Index: Proclist.hpp
===================================================================
--- Proclist.hpp	(revision 2704)
+++ Proclist.hpp	(working copy)
@@ -46,6 +46,7 @@
 #define  Max(x,y) (((x)>(y)) ? (x):(y))
 
 #define MAX_CMDLINE     512     // Max length of displayed process's cmd line
+#define MAX_CMDLINE_XP  8192    // Max length of displayed process's cmd line on XP
 #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
@@ -240,6 +241,7 @@
 #define OUT_CVT(pp)   __chk_wca(pp)
 #endif
 
+void GetProcessCommandLine(HANDLE hProcess,TCHAR *pCommandLine);
 void GetOpenProcessDataNT(HANDLE hProcess, TCHAR* pProcessName=0, DWORD cbProcessName=0,
         TCHAR* pFullPath=0, DWORD cbFullPath=0, TCHAR* pCommandLine=0, DWORD cbCommandLine=0,
         TCHAR** ppEnvStrings=0, CURDIR_STR_TYPE** pCurDir=0);
Index: Pclass.cpp
===================================================================
--- Pclass.cpp	(revision 2704)
+++ Pclass.cpp	(working copy)
@@ -670,13 +670,32 @@
 
         if (NT && !*HostName) // local only
         {
-            if (*((ProcessDataNT*)pdata)->CommandLine)
-                fprintf(InfoFile, _T("\n%s:\n%s\n"), GetMsg(MCommandLine), OUT_STRING(((ProcessDataNT*)pdata)->CommandLine));
-
             DebugToken token;
             hProcess = OpenProcessForced(&token, PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|READ_CONTROL,pdata->dwPID);
 
             if(hProcess) {
+                if (*((ProcessDataNT*)pdata)->CommandLine) {
+                    const int PRINT_LEN = 512;
+                    TCHAR sCmdLine[MAX_CMDLINE_XP];
+                    TCHAR sPrintBuf[PRINT_LEN+1];
+                    TCHAR *pCmdLine = sCmdLine;
+                    int bCmdLineLen;
+                    int bPrintBufLen;
+                    GetProcessCommandLine(hProcess, sCmdLine);
+                    fprintf(InfoFile, _T("\n%s:\n"), GetMsg(MCommandLine));
+                    //���� ������ sCmdLine �� 512 ��������
+                    //(���� ������ �������, �� ���� ������ �� ~1000 �������)
+                    bCmdLineLen = lstrlenW(sCmdLine);
+                    while (bCmdLineLen>0) {
+                        bPrintBufLen = min(bCmdLineLen, PRINT_LEN);
+                        memcpy(sPrintBuf, pCmdLine, bPrintBufLen*sizeof(TCHAR));
+                        sPrintBuf[bPrintBufLen] = 0;
+                        fprintf(InfoFile, _T("%s"), OUT_STRING(sPrintBuf));
+                        pCmdLine += PRINT_LEN;
+                        bCmdLineLen -= PRINT_LEN;
+                    }
+                    fprintf(InfoFile, _T("\n"));
+                }
                 PrintNTCurDirAndEnv(InfoFile, hProcess, Opt.ExportEnvironment);
                 CloseHandle(hProcess);
             }
Index: PlistNT.cpp
===================================================================
--- PlistNT.cpp	(revision 2704)
+++ PlistNT.cpp	(working copy)
@@ -359,6 +359,36 @@
     return TRUE;
 }
 
+/**
+ * ��������� ����� �������� ������,
+ * � ������ �� GetOpenProcessDataNT, ��������� ������ ������ �� ������ � ������.
+ * \param hProcess - ����� �������
+ * \param pCommandLine - ����� ��� ������ �������� MAX_CMDLINE_XP ��������
+ */
+void GetProcessCommandLine(HANDLE hProcess,TCHAR *pCommandLine) {
+    ModuleData Data={0};
+    char *pEnd;
+    PROCESS_PARAMETERS* pProcessParams = 0;
+    if(GetInternalProcessData(hProcess, &Data, pProcessParams, pEnd))
+    {
+            UNICODE_STRING pCmd;
+            if(ReadProcessMemory(hProcess, &pProcessParams->CommandLine, &pCmd, sizeof(pCmd), 0)) {
+				SIZE_T sz = min(MAX_CMDLINE_XP, (ULONG)pCmd.Length/2) + 1;
+                Array<WCHAR> sCommandLine((DWORD)sz);
+                *pCommandLine = 0;
+                if(ReadProcessMemory(hProcess, pCmd.Buffer, sCommandLine, 2*(sz-1),0)) {
+                    sCommandLine[sz-1] = 0;
+#ifndef UNICODE
+                    WideCharToMultiByte(CP_ACP, 0, sCommandLine, -1,
+                                        pCommandLine, MAX_CMDLINE_XP, NULL, NULL);
+#else
+                    lstrcpyn(pCommandLine, sCommandLine, MAX_CMDLINE_XP);
+#endif
+                }
+            }
+	}
+}
+
 void GetOpenProcessDataNT(HANDLE hProcess, TCHAR* pProcessName, DWORD cbProcessName,
     TCHAR* pFullPath, DWORD cbFullPath, TCHAR* pCommandLine, DWORD cbCommandLine,
     TCHAR** ppEnvStrings, CURDIR_STR_TYPE** psCurDir)
@@ -397,10 +427,10 @@
         if(pCommandLine) {
             UNICODE_STRING pCmd;
             if(ReadProcessMemory(hProcess, &pProcessParams->CommandLine, &pCmd, sizeof(pCmd), 0)) {
-                SIZE_T sz = min(cbCommandLine, (ULONG)pCmd.Length + 1);
+                SIZE_T sz = min(cbCommandLine, (ULONG)pCmd.Length/2) + 1;
                 Array<WCHAR> sCommandLine((DWORD)sz);
                 *pCommandLine = 0;
-                if(ReadProcessMemory(hProcess, pCmd.Buffer, sCommandLine, sz-1,0)) {
+                if(ReadProcessMemory(hProcess, pCmd.Buffer, sCommandLine, 2*(sz-1),0)) {
                     sCommandLine[sz-1] = 0;
 #ifndef UNICODE
                     WideCharToMultiByte(CP_ACP, 0, sCommandLine, -1,
proclist.diff (5,388 bytes)   

alexy

2009-05-31 12:42

administrator   bugnote:0003381

build 151

Issue History

Date Modified Username Field Change
2009-02-24 13:28 IlyaS New Issue
2009-03-12 20:05 igor_yudincev Note Added: 0002773
2009-03-12 20:05 igor_yudincev File Added: proclist.diff
2009-03-29 16:08 alexy Status new => assigned
2009-03-29 16:08 alexy Assigned To => alexy
2009-05-31 12:42 alexy Note Added: 0003381
2009-05-31 12:42 alexy Status assigned => feedback
2009-06-02 20:09 alexy Status feedback => closed
2009-06-02 20:09 alexy Resolution open => fixed
2009-06-02 20:09 alexy Fixed in Version => 2.0