_DRIVER_OBJECT / 심볼릭 링크로 Driver Object 얻어오기
컴퓨팅/드라이버 2008/05/28 23:32typedef 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);
}
'컴퓨팅 > 드라이버' 카테고리의 다른 글
| _DRIVER_OBJECT / 심볼릭 링크로 Driver Object 얻어오기 (0) | 2008/05/28 |
|---|---|
| Ring3에서 드라이버 로드를 위한 2가지 방법 - 1/2 (0) | 2008/05/28 |
| InstDrv - 드라이버 로딩 도구 (0) | 2008/05/27 |
| Visual Studio 2008 / WDK 연동 (0) | 2008/05/27 |
