2013-04-02 3 views
0

Я пытаюсь получить командную строку запуска процессов в Windows, используя код ниже: Но я получаю только командную строку IDman.exe так:работает команда технологической линии

  • C:\Program Files (x86)\Internet Download Manager\IDMan.exe" /onboot

Но я знаю, что есть много других процессов с командами.

Подумайте, что случилось с моим кодом.

PVOID GetPebAddress(HANDLE ProcessHandle) 
{ 
    _NtQueryInformationProcess NtQueryInformationProcess = 
      (_NtQueryInformationProcess)GetProcAddress(
      GetModuleHandleA("ntdll.dll"), "NtQueryInformationProcess"); 
    PROCESS_BASIC_INFORMATION pbi; 

    NtQueryInformationProcess(ProcessHandle, 0, &pbi, sizeof(pbi), NULL); 

    return pbi.PebBaseAddress; 
} 

void get_process_cmd_line(DWORD pID) 
    { 

     HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | 
            PROCESS_VM_READ | 
            PROCESS_TERMINATE, 
            FALSE, pID); 
     PPEB ppeb = (PPEB) GetPebAddress(hProcess); 
     PPEB ppebCopy = (PPEB)malloc(sizeof(PEB)); 
     BOOL result = ReadProcessMemory(hProcess, 
             ppeb, 
             ppebCopy, 
             sizeof(PEB), 
             NULL); 
     if(!result){std::cout<<"Er. adress";return;} 
     PRTL_USER_PROCESS_PARAMETERS pRtlProcParam = ppebCopy->ProcessParameters; 
     PRTL_USER_PROCESS_PARAMETERS pRtlProcParamCopy = 
      (PRTL_USER_PROCESS_PARAMETERS)malloc(sizeof(RTL_USER_PROCESS_PARAMETERS)); 
     result = ReadProcessMemory(hProcess, 
            pRtlProcParam, 
            pRtlProcParamCopy, 
            sizeof(RTL_USER_PROCESS_PARAMETERS), 
            NULL); 
     if(!result){std::cout<<"Er. ";return;} 
     PWSTR wBuffer = pRtlProcParamCopy->CommandLine.Buffer; 
     USHORT len = pRtlProcParamCopy->CommandLine.Length; 
     PWSTR wBufferCopy = (PWSTR)malloc(len); 
     result = ReadProcessMemory(hProcess, 
            wBuffer, 
            wBufferCopy, 
            len,NULL); 
     if(!result){std::cout<<"Er. cmdLine";return;} 
     std::wcout<<wBufferCopy; 
     return; 
} 
+0

Редактирование: я заметил, что когда get_process_cmd_line (DWORD pID) преуспеет в получении командной строки процесса, это уже не может быть успешным !!! –

ответ

0

Возможно, у вашего текущего процесса недостаточно прав на чтение памяти процесса другого. Попробуйте запустить процесс как администратор.

Сам код выглядит в основном ОК.

+0

Да, я работал как администратор, но те же результаты, и почти все процессы возвращают «Er. Adress» ... –

1

Непонятно, чего вы хотите достичь, и почему именно так. Почему вы не можете использовать GetCommandLine?

Какой бы ни был мотив и подход, я предлагаю вам провести тщательную проверку отказа при каждом вызове функции (начиная с OpenProcess). Прочтите документацию о том, какая конкретная функция вернется к неудаче или к успеху. Всегда используйте GetLastError, чтобы определить точную причину (или любую другую соответствующую функцию, указанную в MSDN).

Вы работаете или готовы запустить свою программу в качестве услуги? Если нет, почему вы не можете выполнить пошаговую отладку?

+0

теперь он работает, за исключением того, что explorer.exe procecces не имеет командной строки !!! –

Смежные вопросы