как получить идентификатор процесса по хендлу?
От: protestant  
Дата: 11.01.06 13:40
Оценка:
у меня есть хендл процесса с минимальными правами доступа. и есть идентификатор процесса. Как можно определить, относятся ли они к одному процессу или нет?
Re: как получить идентификатор процесса по хендлу?
От: gandalf_g Россия  
Дата: 11.01.06 13:46
Оценка:
Здравствуйте, protestant, Вы писали:

P>у меня есть хендл процесса с минимальными правами доступа. и есть идентификатор процесса. Как можно определить, относятся ли они к одному процессу или нет?


GetProcessId
The GetProcessId function retrieves the process identifier of the specified process.

DWORD GetProcessId(
HANDLE Process
);

Have fun...
Re[2]: как получить идентификатор процесса по хендлу?
От: protestant  
Дата: 11.01.06 13:52
Оценка:
Здравствуйте, gandalf_g, Вы писали:

_>Здравствуйте, protestant, Вы писали:


P>>у меня есть хендл процесса с минимальными правами доступа. и есть идентификатор процесса. Как можно определить, относятся ли они к одному процессу или нет?


_>

GetProcessId
_>The GetProcessId function retrieves the process identifier of the specified process.

_>DWORD GetProcessId(
_> HANDLE Process
_>);


хотелось бы, что бы это работало и в win2000
к тому же для её работы требуются права доступа на хендл PROCESS_QUERY_INFORMATION. У меня их нет
Re[3]: как получить идентификатор процесса по хендлу?
От: gandalf_g Россия  
Дата: 11.01.06 13:59
Оценка:
Здравствуйте, protestant, Вы писали:

P>хотелось бы, что бы это работало и в win2000

P>к тому же для её работы требуются права доступа на хендл PROCESS_QUERY_INFORMATION. У меня их нет

неусмотрел) как вариант можно проэнумеровать все процессы в системе и сравнивать с нужным (EnumProcesses или Process32First, Process32Next)
Have fun...
Re[4]: как получить идентификатор процесса по хендлу?
От: protestant  
Дата: 11.01.06 14:10
Оценка:
Здравствуйте, gandalf_g, Вы писали:

_>Здравствуйте, protestant, Вы писали:


P>>хотелось бы, что бы это работало и в win2000

P>>к тому же для её работы требуются права доступа на хендл PROCESS_QUERY_INFORMATION. У меня их нет

_>неусмотрел) как вариант можно проэнумеровать все процессы в системе и сравнивать с нужным (EnumProcesses или Process32First, Process32Next)


и как мне это поможет? ведь так я получу идентификаторы всех процессов. и что мне с ними делать?
Re[5]: как получить идентификатор процесса по хендлу?
От: gandalf_g Россия  
Дата: 11.01.06 14:31
Оценка:
Здравствуйте, protestant, Вы писали:

P>и как мне это поможет? ведь так я получу идентификаторы всех процессов. и что мне с ними делать?


хоть какую то информацию из хэндла вытянуть то можно? да уж, чую без PROCESS_QUERY_INFORMATION много не поймаешь
Have fun...
Re[6]: как получить идентификатор процесса по хендлу?
От: protestant  
Дата: 11.01.06 14:40
Оценка:
Здравствуйте, gandalf_g, Вы писали:

_>Здравствуйте, protestant, Вы писали:


P>>и как мне это поможет? ведь так я получу идентификаторы всех процессов. и что мне с ними делать?


_>хоть какую то информацию из хэндла вытянуть то можно? да уж, чую без PROCESS_QUERY_INFORMATION много не поймаешь


у меня пока не получилось
Re[3]: как получить идентификатор процесса по хендлу?
От: Вумудщзук Беларусь  
Дата: 11.01.06 14:48
Оценка:
>хотелось бы, что бы это работало и в win2000
>к тому же для её работы требуются права доступа на хендл PROCESS_QUERY_INFORMATION. У меня их нет
по хэндлу можно получить PID и так
Nt/ZwQueryInformationProcess(HANDLE hProcess, ProcessBasicInformation,,,,)


под 2k точно будет работать
Homo sum et nihil humani a me alienum puto...
Re[4]: как получить идентификатор процесса по хендлу?
От: protestant  
Дата: 11.01.06 14:54
Оценка:
Здравствуйте, Вумудщзук, Вы писали:

>>хотелось бы, что бы это работало и в win2000

>>к тому же для её работы требуются права доступа на хендл PROCESS_QUERY_INFORMATION. У меня их нет
В>по хэндлу можно получить PID и так
В>
В>Nt/ZwQueryInformationProcess(HANDLE hProcess, ProcessBasicInformation,,,,)
В>


В>под 2k точно будет работать


а можно немножко поподробнее о параметрах?
Re[5]: как получить идентификатор процесса по хендлу?
От: Вумудщзук Беларусь  
Дата: 11.01.06 15:09
Оценка:
>>
>>Nt/ZwQueryInformationProcess(HANDLE hProcess, ProcessBasicInformation,,,,)
>>

>>под 2k точно будет работать

>а можно немножко поподробнее о параметрах?


NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess(
    IN HANDLE ProcessHandle,                             // хэндл процесса
    IN PROCESSINFOCLASS ProcessInformationClass,       // чего хотим узнать (ProcessBasicInformation)
    OUT PVOID ProcessInformation,                      // указатель на буфер
    IN ULONG ProcessInformationLength,                 // длина входного буфера в байтах
    OUT PULONG ReturnLength);                          // сколько байт вернулось


typedef enum _PROCESSINFOCLASS
{
    ProcessBasicInformation,
    ProcessQuotaLimits,
    ProcessIoCounters,
    ProcessVmCounters,
    ProcessTimes,
    ProcessBasePriority,
    ProcessRaisePriority,
    ProcessDebugPort,
    ProcessExceptionPort,
    ProcessAccessToken,
    ProcessLdtInformation,
    ProcessLdtSize,
    ProcessDefaultHardErrorMode,
    ProcessIoPortHandlers,          // Note: this is kernel mode only
    ProcessPooledUsageAndLimits,
    ProcessWorkingSetWatch,
    ProcessUserModeIOPL,
    ProcessEnableAlignmentFaultFixup,
    ProcessPriorityClass,
    ProcessWx86Information,
    ProcessHandleCount,
    ProcessAffinityMask,
    ProcessPriorityBoost,
    ProcessDeviceMap,
    ProcessSessionInformation,
    ProcessForegroundInformation,
    ProcessWow64Information,
    MaxProcessInfoClass
} PROCESSINFOCLASS;


в нашем случае (ProcessBasicInformation) ProcessInformation должен указывать на

typedef struct _PROCESS_BASIC_INFORMATION 
{
    NTSTATUS ExitStatus;
    PPEB PebBaseAddress;
    ULONG_PTR AffinityMask;
    KPRIORITY BasePriority;
    ULONG_PTR UniqueProcessId;
    ULONG_PTR InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION;
Homo sum et nihil humani a me alienum puto...
Re[4]: как получить идентификатор процесса по хендлу?
От: rus blood Россия  
Дата: 11.01.06 15:21
Оценка:
Здравствуйте, Вумудщзук, Вы писали:

>>хотелось бы, что бы это работало и в win2000

>>к тому же для её работы требуются права доступа на хендл PROCESS_QUERY_INFORMATION. У меня их нет
В>по хэндлу можно получить PID и так
В>
В>Nt/ZwQueryInformationProcess(HANDLE hProcess, ProcessBasicInformation,,,,)
В>


В>под 2k точно будет работать


Вопрос, хватит ли прав на получение информации.
Если даже PROCESS_QUERY_INFORMATION нет...
Имею скафандр — готов путешествовать!
Re[5]: как получить идентификатор процесса по хендлу?
От: Вумудщзук Беларусь  
Дата: 11.01.06 15:37
Оценка:
>Вопрос, хватит ли прав на получение информации.
>Если даже PROCESS_QUERY_INFORMATION нет...
а если вызвать её из драйвера ? это ж легко проверить на практике...
Homo sum et nihil humani a me alienum puto...
Re[6]: как получить идентификатор процесса по хендлу?
От: gear nuke  
Дата: 11.01.06 23:32
Оценка:
Здравствуйте, Вумудщзук, Вы писали:

>>Вопрос, хватит ли прав на получение информации.

>>Если даже PROCESS_QUERY_INFORMATION нет...
В>а если вызвать её из драйвера ?

Дык для драйвера права тоже нужны.

ЗЫ: GetProcessId работает именно так
Автор: Вумудщзук
Дата: 11.01.06
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: как получить идентификатор процесса по хендлу?
От: Alex Fedotov США  
Дата: 12.01.06 04:39
Оценка:
Здравствуйте, protestant, Вы писали:

P>>>у меня есть хендл процесса с минимальными правами доступа. и есть идентификатор процесса. Как можно определить, относятся ли они к одному процессу или нет?


_>>

GetProcessId
_>>The GetProcessId function retrieves the process identifier of the specified process.

_>>DWORD GetProcessId(
_>> HANDLE Process
_>>);


P>хотелось бы, что бы это работало и в win2000

P>к тому же для её работы требуются права доступа на хендл PROCESS_QUERY_INFORMATION. У меня их нет

Тяжелый случай. Если у вас нет доступа именно к этому хэндлу, а самому объекту процесса доступ есть, то можно попробовать вызвать DuplicateHandle на имеющийся у вас хэндл, чтобы "повысить" права доступа. Я, честно говоря, не помню, позволяет ли DuplicateHandle повышать права доступа к процессам, но стоит попробовать.

Если получится, то дальше можно вызывать GetProcessId или ZwQueryInformationProcess, как уже посоветовали.
-- Alex Fedotov
Re: как получить идентификатор процесса по хендлу?
От: Alexander__S  
Дата: 12.01.06 08:19
Оценка:
Здравствуйте, protestant, Вы писали:

P>у меня есть хендл процесса с минимальными правами доступа. и есть идентификатор процесса. Как можно определить, относятся ли они к одному процессу или нет?


Под какой учетной записью работает процесс Вашей программы?

Можно получить, например, привилегию SeDebug, которая дает исключительные права на доступ к процессам. Получив ее, можно открывать, получать информацию, принудительно завершать даже системные процессы (smss, csrss, winlogon). Код примерно такой:

    HANDLE hToken;
    LUID seDebug;
    TOKEN_PRIVILEGES tkp;
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);

    LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &seDebug );

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = seDebug;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL);

    CloseHandle(hToken);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.