[DDK] Undocument 함수를 이용한 Driver Object Pointer 구하기

드라이버를 작성하다보면, 드라이버 이름을 가지고 DriverObject를 얻고 싶을 때가 있습니다.
DeviceObject의 경우에는 Document된 함수를 이용하면 되지만, DriverObject를 이름을 이용하여
얻어오는 함수는 Document되어 있지 않죠...

ObReferenceObjectByName 함수를 이용하면, DriverObject도 이름으로 얻어올수 있죠..

아래와 같이 함수를 만들어 놓으면 좋습니다.

[function prototype]

NTSTATUS
ObReferenceObjectByName(
IN PUNICODE_STRING ObjectName,
IN ULONG Attributes,
IN PACCESS_STATE PassedAccessState OPTIONAL,
IN ACCESS_MASK DesiredAccess OPTIONAL,
IN POBJECT_TYPE ObjectType,
IN KPROCESSOR_MODE AccessMode,
IN OUT PVOID ParseContext OPTIONAL,
OUT PVOID *Object
);

[function definition]
 
  1. extern POBJECT_TYPE                 *IoDriverObjectType;  
  2.  
  3. PDRIVER_OBJECT GetDriverObject( WCHAR* DeviceName )  
  4. {  
  5.  UNICODE_STRING uniDriverName;  
  6.  PVOID  pDriverObj;  
  7.  NTSTATUS status;   
  8.    
  9.    
  10.  RtlInitUnicodeString( &uniDriverName,  DeviceName);   
  11.    
  12.  status = ObReferenceObjectByName(  
  13.       &uniDriverName,    // IN PUNICODE_STRING ObjectName  
  14.       OBJ_CASE_INSENSITIVE,  // IN ULONG Attributes  
  15.       NULL,      // IN PACCESS_STATE PassedAccessState OPTIONAL,   
  16.       (ACCESS_MASK)0L,  
  17.       *IoDriverObjectType,  
  18.       KernelMode,  
  19.       NULL,  
  20.       &pDriverObj  
  21.       );  
  22.        
  23.  
  24.  if( NT_SUCCESS(status))  
  25.  {  
  26.   KdPrint(("DEVGURU :: DeviceName ==> %ws, DriverObject = 0x%x \n",  DeviceName, pDriverObj ));  
  27.   ObDereferenceObject(pDriverObj);  
  28.   return (PDRIVER_OBJECT)pDriverObj;  
  29.  }  
  30.     
  31.  return (PDRIVER_OBJECT)0;  
  32. }  
<TEXTAREA class="c#" style="DISPLAY: none" name=code rows=10 cols=60>extern POBJECT_TYPE *IoDriverObjectType; PDRIVER_OBJECT GetDriverObject( WCHAR* DeviceName ) { UNICODE_STRING uniDriverName; PVOID pDriverObj; NTSTATUS status; RtlInitUnicodeString( &uniDriverName, DeviceName); status = ObReferenceObjectByName( &uniDriverName, // IN PUNICODE_STRING ObjectName OBJ_CASE_INSENSITIVE, // IN ULONG Attributes NULL, // IN PACCESS_STATE PassedAccessState OPTIONAL, (ACCESS_MASK)0L, *IoDriverObjectType, KernelMode, NULL, &pDriverObj ); if( NT_SUCCESS(status)) { KdPrint(("DEVGURU :: DeviceName ==> %ws, DriverObject = 0x%x \n", DeviceName, pDriverObj )); ObDereferenceObject(pDriverObj); return (PDRIVER_OBJECT)pDriverObj; } return (PDRIVER_OBJECT)0; } </TEXTAREA>



ex) GetDriverObject( L\\Driver\\TaejinDriver);

위로 스크롤