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,
