'PsLookupProcessByProcessId'에 해당되는 글 1건

  1. 2008.12.03 PsLookupProcessByProcessId() 구현.
Programming/Kernel / Driver2008. 12. 3. 11:35

전에 구현한 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;
}

Posted by skensita