메모장 입니다2
Windows] 드라이버 개발 - 5) WDM 드라이버, 디바이스 스택 본문
1.WDM 드라이버
-디바이스 스텍을 기반으로 동작.
-버스 드라이버의 지원으로 하드웨어에 접근할 수 있다.
-구조
2.디바이스 스택
-WDM 드라이버에 의해 관리되는, Device Object로 이루어진 자료구조. //정확한 개념은 설명 안나옴. 추후 찾아볼 것.
>Device Object: 디바이스를 상징하는 자료구조.
>Driver Object: 드라이버를 상징하는 자료구조.
->하나의 드라이버가 두 개이상의 디바이스(Device Object)에 관여할 수 있음.
-연결 구조
*같은 드라이버에서 관여하는 Device Object는 NextDevice로 연결시켜야 한다.
*다른 드라이버의 Device Object는 AttachedDevice로 연결시켜야 한다.
/*위 부분은 관련된 실습 내용을 못봤기 때문에, 대충 원리만 이해하고 넘어가도 됨 */
-생성 과정
1)버스 드라이버 하드웨어 발견
2)버스 드라이버가 Device Object 생성
3)버스 드라이버가 IO Manager에게 자신이 만든 Device Object 보고
4,5)IO Manager가 설치정보를 확인해, 필요한 드라이버를 호출
6)호출된 드라이버가 Device Object 생성
7)스텍 구성을 위해, Device Object 끼리 연결
/* 결론, wdm은 디바이스 스텍을 사용한다.
디바이스 스텍은 디바이스 오브젝트끼리의 연결이다*/
3.WDM Driver 개발
-동작 구조
>DriverEntry
1)DriverObject->DriverUnload = MyDriverUnload
>드라이버가 종료될 때 실행될 콜백함수 등록.
2)DriverObject->DriverExtension->AddDevice = MyAddDevice
>디바이스 스택을 형성하는 콜백함수 등록.
>MyAddDevice
1)함수 정의
NTSTATUS MyAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
*PhysicalDeviceObject: 버스드라이버가 생성한 디바이스 오브젝트.
2)IoCreateDevice
>기능
->디바이스 오브젝트를 생성
>정의
NTSTATUS IoCreateDevice(
IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize,
IN PUNICODE_STRING DeviceName,
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharacteristics,
IN BOOLEAN Exclusive,
OUT PDEVICE_OBJECT *DeviceObject
);
*DriverObject: 드라이버
*DeviceExtensionSize: 할당할 ?Device Extension의 크기 지정.
*DeviceName: 디바이스 오브젝트의 이름(안줘도 무관)
*(*DeviceObject): 해당 주소 공간에 생성된 디바이스 오브젝트 값이 저장됨.
?DeviceExtension
->디바이스 오브젝트마다 가지는 임의 공간,
Device Extension의 크기를 지정하여 디바이스 오브젝트를 생성할 시,
해당 크기만큼 임의 공간(Device Extension)이 생성되고
DeviceObject->DeviceExtension (VOID*) 포인터 변수에 그 주소가 저장된다.
->구조
3)IoAttachDeviceToDeviceStack
>기능
->디바이스 오브젝트를 디바이스 스택에 연결.
>정의
PDEVICE_OBJECT IoAttachDeviceToDeviceStack(
IN PDEVICE_OBJECT SourceDevice,
IN PDEVICE_OBJECT TargetDevice
);
*SourceDevice: 연결할(위에서 생성된) 디바이스 오브젝트.
*TargetDevice: 대상 디바이스 스택에 속한 디바이스 오브젝트.(어떤 것이든 상관없음)
*(Return)PDEVICE_OBJECT: Source 디바이스 오브젝트 바로 아래의 디바이스 오브젝트의 주소값.
->구조
-코드 작성
/* MyFirstWDM.c */
#include <wdm.h>
#include "FIRST_WDM.H"
void MyDriverUnload(
IN PDRIVER_OBJECT DriverObject
)
{
UNREFERENCED_PARAMETER(DriverObject);
DbgPrintEx(DPFLTR_IHVDRIVER_ID, 0, "FIRST_WDM Driver Unloading...\n");
}
NTSTATUS MyAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject
)
{
PMYDEVICE_EXTENSION pMyDevicmeExtension = NULL;
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
PDEVICE_OBJECT MyDeviceObject;
DbgPrintEx(DPFLTR_IHVDRIVER_ID, 0, "FIRST_WDM MyAddDevice ++\n");
// DEVICE_OBJECT를 생성합니다
ntStatus = IoCreateDevice
(
DriverObject,
sizeof(MYDEVICE_EXTENSION),
NULL,
FILE_DEVICE_UNKNOWN,
FILE_AUTOGENERATED_DEVICE_NAME,
FALSE,
&MyDeviceObject
);
if (!NT_SUCCESS(ntStatus))
goto exit;
// DEVICE_OBJECT를 디바이스 스택에 올려놓습니다
pMyDeviceExtension = MyDeviceObject->DeviceExtension;
RtlZeroMemory(pMyDeviceExtension, sizeof(MYDEVICE_EXTENSION));
pMyDeviceExtension->NextDeviceObject =
IoAttachDeviceToDeviceStack(
MyDeviceObject,
PhysicalDeviceObject
);
// DEVICE_OBJECT의 초기화가 끝났다는것을 알립니다
MyDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
exit:
DbgPrintEx(DPFLTR_IHVDRIVER_ID, 0, "FIRST_WDM MyAddDevice --, %8X\n", ntStatus);
return ntStatus;
}
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
UNREFERENCED_PARAMETER(RegistryPath);
DbgPrintEx(DPFLTR_IHVDRIVER_ID, 0, "FIRST_WDM Driver Loading...\n");
DriverObject->DriverUnload = MyDriverUnload;
// 드라이버가 메모리에서 해제될때 호출되는 콜백함수를 등록합니다
DriverObject->DriverExtension->AddDevice = MyAddDevice;
// 디바이스 스택이 형성될때 호출되는 콜백함수를 등록합니다
DriverObject->MajorFunction[IRP_MJ_PNP] = MyPnPIRPDispatch;
// 디바이스 스택을 위한 플러그엔플레이 IRP를 처리할 콜백함수를 등록합니다
return STATUS_SUCCESS;
}
/* FirstWDM.h */
#pragma once
typedef struct _MYDEVICE_EXTENSION
{
PDEVICE_OBJECT NextDeviceObject; //디바이스 오브젝트의 Extension을
}MYDEVICE_EXTENSION, *PMYDEVICE_EXTENSION; 다음 디바이스 오브젝트를 가리키는 포인터로 사용할 것임
-유의사항
->위에서 작성한 디바이스 스택 형성(MyAddDevice)만으론 드라이버가 빌드되지 않는다.
최소한의 P&P IRP처리 코드가 포함되어야 한다.
->IRP의 내용은 다음 장에서..
'Study > Programming' 카테고리의 다른 글
Windows] SSDT 후킹 - MDL 활용. (0) | 2017.03.16 |
---|---|
Windows] 드라이버 개발 - 6) IRP (0) | 2017.02.24 |
Windows] 드라이버 개발 - 4) 권한, 콜백함수 (1) | 2017.02.23 |
Windows] 드라이버 개발 - 3) windbg 기능, 커널 덤프 (0) | 2017.02.23 |
Windows] 드라이버 개발 - 2) 부가 설명, 코드, 환경설정, 명령어 (0) | 2017.02.23 |