[DDK] MS에서 공개하지 않은 함수 ObOpenObjectByName() 내부 코드

  1. NTSTATUS   
  2. STDCALL  
  3. ObOpenObjectByName(  
  4.   POBJECT_ATTRIBUTES ObjectAttributes,  
  5.   POBJECT_TYPE ObjectType,  
  6.   PVOID ParseContext,  
  7.   KPROCESSOR_MODE AccessMode,  
  8.   ACCESS_MASK DesiredAccess,  
  9.   PACCESS_STATE PassedAccessState,  
  10.   PHANDLE Handle  
  11.   )  
  12. {  
  13.    UNICODE_STRING RemainingPath;  
  14.    PVOID Object = NULL;  
  15.    NTSTATUS Status;  
  16.  
  17.    DPRINT("ObOpenObjectByName()\n");  
  18.  
  19.    Status = ObFindObject(ObjectAttributes,  
  20.                                    &Object,  
  21.                                    &RemainingPath,  
  22.                                    ObjectType  
  23.                                    );  
  24.    if (!NT_SUCCESS(Status))  
  25.      {  
  26.             return Status;  
  27.      }  
  28.  
  29.    if (RemainingPath.Buffer != NULL ||  
  30.        Object == NULL)  
  31.      {  
  32.             RtlFreeUnicodeString(&RemainingPath);  
  33.             return STATUS_UNSUCCESSFUL;  
  34.      }  
  35.  
  36.    Status = ObCreateHandle(PsGetCurrentProcess(),  
  37.                                        Object,  
  38.                                        DesiredAccess,  
  39.                                        FALSE,  
  40.                                        Handle  
  41.                                       );  
  42.  
  43.    ObDereferenceObject(Object);  
  44.    RtlFreeUnicodeString(&RemainingPath);  
  45.  
  46.    return Status;  
  47. }  

<TEXTAREA class="cpp" style="DISPLAY: none" name=code rows=10 cols=60>NTSTATUS STDCALL ObOpenObjectByName( POBJECT_ATTRIBUTES ObjectAttributes, POBJECT_TYPE ObjectType, PVOID ParseContext, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PACCESS_STATE PassedAccessState, PHANDLE Handle ) { UNICODE_STRING RemainingPath; PVOID Object = NULL; NTSTATUS Status; DPRINT("ObOpenObjectByName()\n"); Status = ObFindObject(ObjectAttributes, &Object, &RemainingPath, ObjectType ); if (!NT_SUCCESS(Status)) { return Status; } if (RemainingPath.Buffer != NULL || Object == NULL) { RtlFreeUnicodeString(&RemainingPath); return STATUS_UNSUCCESSFUL; } Status = ObCreateHandle(PsGetCurrentProcess(), Object, DesiredAccess, FALSE, Handle ); ObDereferenceObject(Object); RtlFreeUnicodeString(&RemainingPath); return Status; } </TEXTAREA>

MS에서 공개하지 않은 함수로

심볼릭 유니코드이름에 대한 핸들의 헤더를 가져 오는 함수이다.

시스템 내부의 핸들 테이블에서 검색해서 가져온다.

그리고 ObReferenceObjectByHandle()을 호출해서

헤더에 대한 바디를 가져와야한다

React OS에서 참조했다.

 

출처 : http://ssmhz.tistory.com/158 


위로 스크롤