Откуда запустили приложение?
От: IceHand  
Дата: 28.01.08 14:21
Оценка:
Здравствуйте!
Подскажите можно ли определить какой bat или cmd файл запустил приложение, если да то куда смотреть?
Дело в том, что запущенно несколько экземпляров одной и той же программы но с разными параметрами из разных командных файлов. Нужно найти приложение с определенными параметрами и рестартовать его.
Re: Откуда запустили приложение?
От: ilya123 Россия  
Дата: 28.01.08 16:01
Оценка:
IH>Подскажите можно ли определить какой bat или cmd файл запустил приложение, если да то куда смотреть?

Нужно найти родителя данного процесса.
Например, через GetNtSystemInformation SystemProcessInformation

IH>Дело в том, что запущенно несколько экземпляров одной и той же программы но с разными параметрами из разных командных файлов. Нужно найти приложение с определенными параметрами и рестартовать его.
Re[2]: Откуда запустили приложение?
От: IceHand  
Дата: 29.01.08 03:45
Оценка:
Здравствуйте, ilya123, Вы писали:

IH>>Подскажите можно ли определить какой bat или cmd файл запустил приложение, если да то куда смотреть?


I>Нужно найти родителя данного процесса.

I>Например, через GetNtSystemInformation SystemProcessInformation

IH>>Дело в том, что запущенно несколько экземпляров одной и той же программы но с разными параметрами из разных командных файлов. Нужно найти приложение с определенными параметрами и рестартовать его.


Родителей нахожу нормально через toolHelp а как узнать с какими параметрами запущен процесс?
Re[3]: Откуда запустили приложение?
От: ilya123 Россия  
Дата: 29.01.08 18:40
Оценка: 4 (2)
IH>>>Подскажите можно ли определить какой bat или cmd файл запустил приложение, если да то куда смотреть?

IH>Родителей нахожу нормально через toolHelp а как узнать с какими параметрами запущен процесс?


нет ничего проще
typedef struct
{
    USHORT Length;
    USHORT MaximumLength;
    PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

typedef struct
{
    ULONG          AllocationSize;
    ULONG          ActualSize;
    ULONG          Flags;
    ULONG          Unknown1;
    UNICODE_STRING Unknown2;
    HANDLE         InputHandle;
    HANDLE         OutputHandle;
    HANDLE         ErrorHandle;
    UNICODE_STRING CurrentDirectory;
    HANDLE         CurrentDirectoryHandle;
    UNICODE_STRING SearchPaths;
    UNICODE_STRING ApplicationName;
    UNICODE_STRING CommandLine;
    PVOID          EnvironmentBlock;
    ULONG          Unknown[9];
    UNICODE_STRING Unknown3;
    UNICODE_STRING Unknown4;
    UNICODE_STRING Unknown5;
    UNICODE_STRING Unknown6;
} PROCESS_PARAMETERS;

typedef struct
{
    DWORD ExitStatus;
    PEB*  PebBaseAddress;
    DWORD AffinityMask;
    DWORD BasePriority;
    ULONG UniqueProcessId;
    ULONG InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION;

static PBYTE NtQueryProcessParameters( HANDLE _hProc, PROCESS_PARAMETERS* pProcParam )
{
    ASSERT( IsNtSys() );
        // Retrieve information
    PROCESS_BASIC_INFORMATION pbi = {0};
    LONG status = NtQueryInformationProcess( _hProc, ProcBasicInfo,    &pbi, sizeof(pbi), 0 );
//    if(!status) return FALSE;

    if(!pbi.PebBaseAddress) return FALSE;

    PEB Peb={0};
    DWORD dwDummy = 0;
    BOOL bRet = ::ReadProcessMemory( _hProc, pbi.PebBaseAddress, &Peb, 
        sizeof(Peb), &dwDummy);
    if( !bRet ) return 0;
    
    bRet = ::ReadProcessMemory( _hProc,    Peb.ProcessParameters, pProcParam,
        sizeof(PROCESS_PARAMETERS), &dwDummy );
    
    if( !bRet )
    {// just started
        return 0;
    }
    
    return (PBYTE)Peb.ProcessParameters;
}

        PROCESS_PARAMETERS ProcParam = {0};
        PBYTE pParam=0;
        if( (pParam=NtQueryProcessParameters( _hProc, &ProcParam ))==0 )
        {
            return FALSE;//just started, try later
        }

        UNICODE_STRING* pUnicode = &ProcParam.CommandLine; 

        DWORD dwSize = pUnicode->Length;
        WCHAR wInBuf[MAX_PATH*8]=L"";

        if(dwSize>0)
        {
            DWORD dwDummy=0;
            PBYTE pSrcBuf = (PBYTE)pUnicode->Buffer;
            
            if( pSrcBuf<pParam )
            { /*в случае указания CREATE_SUSPENDED, в .Buffer лежит _смещение_ относительно начала ProcessParameters, 
                а не адрес строки. проверяем, что адрес строки не меньше адреса параметров и правим его если нужно.*/
                pSrcBuf = pParam+(int)pSrcBuf;
                ASSERT( IsInRange( (int)pSrcBuf, 0, 0x40000 ) );
            }
            
            if(!::ReadProcessMemory( _hProc, pSrcBuf, wInBuf, dwSize, &dwDummy ))
            {// we started new process, can't complete call
                ASSERT(0);
                return FALSE;
            }
            USES_CONVERSION;
            lstrcpyn( _pszBuf, W2T(wInBuf), 1020 );// обрезаем
        }
Re[3]: Откуда запустили приложение?
От: DemAS http://demas.me
Дата: 01.02.08 07:12
Оценка: -1
Здравствуйте, IceHand, Вы писали:

IH>Родителей нахожу нормально через toolHelp а как узнать с какими параметрами запущен процесс?


Я не спец, я только учусь, но может это поможет?

Указатель на полную командную строку процесса можно.получить и вызовом функции GetCommandLine.
PTSTR GetCommandLine();


(c) Рихтер
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[4]: Откуда запустили приложение?
От: DemAS http://demas.me
Дата: 01.02.08 09:46
Оценка:
Здравствуйте, DemAS, Вы писали:

Поставившему минус, а также всем остальным — большая просьба — пояснить в чем я не прав.
Проверял — работает.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[5]: Откуда запустили приложение?
От: lifrsdn  
Дата: 01.02.08 10:55
Оценка: 2 (1) +1
Здравствуйте, DemAS, Вы писали:

DAS> Поставившему минус, а также всем остальным — большая просьба — пояснить в чем я не прав.

DAS> Проверял — работает.

Указанное вами API имеет смысл только внутри приложения. Задача же явно предполагает опрделение таковой строки снаружи.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.