- 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 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