디바이스 개체 만들기(Windows 필터링 플랫폼)
설명선 드라이버는 디바이스 개체를 만들어야만 해당 설명선이 필터 엔진에 등록됩니다. 설명선 드라이버가 디바이스 개체를 만드는 방법은 설명선 드라이버가 WDM(Windows 드라이버 모델) 또는 WDF(Windows 드라이버 프레임워크)를 기반으로 하는지 여부에 따라 달라집니다.
WDM-Based 콜아웃 드라이버
설명선 드라이버가 WDM을 기반으로 하는 경우 IoCreateDevice 함수를 호출하여 디바이스 개체를 만듭니다. 예:
PDEVICE_OBJECT deviceObject;
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
NTSTATUS status;
...
// Create a device object
status =
IoCreateDevice(
DriverObject,
0,
NULL,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&deviceObject
);
...
return status;
}
WDF-Based 콜아웃 드라이버
설명선 드라이버가 WDF를 기반으로 하는 경우 WdfDeviceCreate 함수를 호출하여 프레임워크 디바이스 개체를 만듭니다. 호출을 필터 엔진에 등록하려면 WDF 기반 설명선 드라이버가 프레임워크 디바이스 개체와 연결된 WDM 디바이스 개체에 대한 포인터를 가져와야 합니다. WDF 기반 설명선 드라이버는 WdfDeviceWdmGetDeviceObject 함수를 호출하여 이 WDM 디바이스 개체에 대한 포인터를 가져옵니다. 예:
WDFDEVICE wdfDevice;
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
WDFDRIVER driver;
PWDFDEVICE_INIT deviceInit;
PDEVICE_OBJECT deviceObject;
NTSTATUS status;
...
// Allocate a device initialization structure
deviceInit =
WdfControlDeviceInitAllocate(
driver;
&SDDL_DEVOBJ_KERNEL_ONLY
);
// Set the device characteristics
WdfDeviceInitSetCharacteristics(
deviceInit,
FILE_DEVICE_SECURE_OPEN,
FALSE
);
// Create a framework device object
status =
WdfDeviceCreate(
&deviceInit,
WDF_NO_OBJECT_ATTRIBUTES,
&wdfDevice
);
// Check status
if (status == STATUS_SUCCESS) {
// Initialization of the framework device object is complete
WdfControlFinishInitializing(
wdfDevice
);
// Get the associated WDM device object
deviceObject = WdfDeviceWdmGetDeviceObject(wdfDevice);
}
...
return status;
}