전에 구현한 PsGetNextProcess()를 이용해서 PsLookupProcessByProcessId()를 구현해 보았습니다.
원래는 PsGetFirstProcess()를 쓰려 했으나, 그냥 PsInitialSystemProcess를 넣어주면 될것 같아서 그냥
PsInitialSystemProcess를 썼습니다.
원함수의 원형은 이와 같습니다.
NTKERNELAPI
NTSTATUS
NTAPI
PsLookupProcessByProcessId(
IN HANDLE ProcessId, //프로세스 아이디
OUT PEPROCESS *Process //성공했을 때에는 여기로 EPROCESS 구조체의 포인터가 넘어온다
);
제가 만든 함수의 코드는 이렇습니다.
NTSTATUS
NTAPI
PsLookupProcessByProcessId(
IN HANDLE ProcessId,
OUT PEPROCESS *Process)
{
/*Get System Process Object*/
PEPROCESS NextProcess=PsInitialSystemProcess;
NTSTATUS Status=STATUS_SUCCESS;
/*Unexpected Situation! PsInitialSystemProcess==NULL????*/
if(!NextProcess) return STATUS_UNSUCCESSFUL;
if(!Process) return STATUS_INVALID_PARAMETER;
/*Loop and find target Process*/
while(NT_SUCCESS(Status))
{
/*Check if Process is target Proces*/
if(ProcessId==PsGetProcessId(NextProcess))
{
/*Reference the Object*/
Status=ObReferenceObjectByPointer(
NextProcess,
PROCESS_ALL_ACCESS,
PsProcessType,
KernelMode);
/*Is Object Valid?*/
if(NT_SUCCESS(Status))
{
/*Found it! Now, Save the Pointer.....*/
*Process=NextProcess;
}
/*return it*/
return Status;
}
/*Get Next Process*/
Status=PsGetNextProcess(&NextProcess);
}
/*Process Not Found*/
return STATUS_NOT_FOUND;
}