'ObOpenObjectByName'에 해당되는 글 1건

  1. 2008/05/28 _DRIVER_OBJECT / 심볼릭 링크로 Driver Object 얻어오기

_DRIVER_OBJECT / 심볼릭 링크로 Driver Object 얻어오기

컴퓨팅/드라이버 2008/05/28 23:32
typedef struct _DRIVER_OBJECT {
    CSHORT Type;
    CSHORT Size;

    PDEVICE_OBJECT DeviceObject;
    ULONG Flags;

    PVOID DriverStart; // 드라이버가 보관된 메모리 시작위치 포인터
    ULONG DriverSize;
    PVOID DriverSection;
    PDRIVER_EXTENSION DriverExtension; // 확장, 컴포마이징 

    UNICODE_STRING DriverName;
    PUNICODE_STRING HardwareDatabase; // 드라이버가 등록된 서비스키
    PFAST_IO_DISPATCH FastIoDispatch;

    PDRIVER_INITIALIZE DriverInit;  // DriverEntry 함수주소
    PDRIVER_STARTIO DriverStartIo;
    PDRIVER_UNLOAD DriverUnload;
    PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
// 드라이버가 처리하는 IRP 명령어를 위한 dispatch routines } DRIVER_OBJECT; typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; // ntndis


레런스 문서 : http://www.reactos.org/generated/doxygen/d6/d72/struct__DRIVER__OBJECT.html

심볼릭 링크에 대한 드라이버 오브젝트를 구하는 함수:

PVOID SearchObject(PUNICODE_STRING pUni)
{
   NTSTATUS st;
   HANDLE Handle;
   UNICODE_STRING Uni;
   OBJECT_ATTRIBUTES ObjectAttributes;
   PVOID Object;   InitializeObjectAttributes
      (&ObjectAttributes,
      pUni,
      OBJ_CASE_INSENSITIVE,
      NULL,
      NULL);
 
   st = ObOpenObjectByName
      (&ObjectAttributes,
             0L,
             0L,
             0L,
             0L,
             0L,
             &Handle);
 
   if(st!= STATUS_SUCCESS)
   {
      DbgPrint(( "ObOpenObjectByName - ObOpenObjectByName failed \n"));
      return (PVOID)0;
   }
     
   st = ObReferenceObjectByHandle
      (Handle,
      0x80000000,
      NULL,
      0,
      &Object,
      NULL); // Handle을 object로 변환
 
   if(st != STATUS_SUCCESS)
   {
      DbgPrint(( "ObReferenceObjectByHandle - ObReferenceObjectByHandle failed \n"));
      ZwClose(Handle);
      return (PVOID)0;
   }   ZwClose(Handle);
   ObDereferenceObject(Object);

}

위 함수를 응용해 심볼릭 링크만으로 드라이버 오브젝트를 구해낼 수 있다.
그 방법은 다음과 같다:

PDRIVER_OBJECT pClass;
   UNICODE_STRING nameString;
   RtlInitUnicodeString( &nameString, L"\\Driver\\pClass" ); // pClass의 심볼릭 링크명
   pClass = (PDRIVER_OBJECT)SearchObject(&nameString);    


위와 같은 방법으로 pClass에 해당 드라이버 오브젝트를 얻어 올 수 있다.
SearchObject 함수 내의 ObOpenObjectByName() 를 사용하기 위해서는 헤더 파일에 다음과 같은 구문을 넣어줘야 한다:

extern "C"{
#include <ntddk.h>
 
NTSTATUS ObOpenObjectByName(
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
 IN POBJECT_TYPE  ObjectType,
 IN OUT PVOID  ParseContext  OPTIONAL,
 IN KPROCESSOR_MODE  AccessMode,
 IN ACCESS_MASK  DesiredAccess,
 IN PACCESS_STATE  PassedAccessState,
 OUT PHANDLE  Handle);
}
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0