본문 바로가기

Language & API/WINDOWS DRIVER

[함수]IoCreateDevice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
NTSTATUS
IoCreateDevice(
    _In_  PDRIVER_OBJECT DriverObject,
    _In_  ULONG DeviceExtensionSize,
    _In_opt_ PUNICODE_STRING DeviceName,
    _In_  DEVICE_TYPE DeviceType,
    _In_  ULONG DeviceCharacteristics,
    _In_  BOOLEAN Exclusive,
    _Outptr_result_nullonfailure_
    _At_(*DeviceObject,
        __drv_allocatesMem(Mem)
        _When_((((_In_function_class_(DRIVER_INITIALIZE))
               ||(_In_function_class_(DRIVER_DISPATCH)))),
             __drv_aliasesMem))
    PDEVICE_OBJECT *DeviceObject
    );
cs

[파라미터]
DriverObject -> DrvierEntry 루틴과 AddDevice 루틴에서 첫 번째 파라미터로 얻을 수 있는 PDRIVER_OBJECT 의 포인터다. PDEVICE_OBJECT를 생성하는 드라이버를 지정하는 의미를 가진다. 

DeviceExtensionSize -> 문맥 유지를 위한 공간의 크기다. 여러 개의 장치를 하나의 드라이버가 관리할 경우 각각의 문맥을 유지하기 위한 공간 할당이 필요하다. 


DeviceName -> 드라이버의 PDEVICE_OBJECT 가 고유하게 가지는 이름이다. 주로 구형(Legacy)드라이버에서 이름을 직접 지정한다. 


DeviceType -> 드라이버가 관리하는 장치의 종류에 대한 상수값이다. 예를 들어, 마우스 장치에 대한 드라이버를 제작한다면 FILE_DEVICE_MOUSE, 스마트 카드 관련 장치에 대한 드라이버를 제작한다면 FILE_DEVICE_SMARTCARD와 같은 값을 입력 할수 있다. 


DeviceCharacteristics -> 블록 드라이버를 위한 PDEVICE_OJBECT 의 특성 값을 기록한다. 


Exclusive -> 이 함수를 통해 만들어지는 PDEVICE_OBJECT 에 대한 외부로 부터 접근에 베타적인 속성을 부여한다. 


*DeviceObject -> 할당된 PDEIVCE_OBJECT 주소를 돌려준다. 이 함수의 호출자는 IoDeleteDevice() 같은 함수를 통해 PDEVICE_OBJECT의 메모리 해제를 책임져야 한다. 


[반환 값]

드라이버의 PDEVICE_OBJECT를 만드는데 성공하면 STATUS_SUCCESS 를 반환한다. 


[함수 설명]

모든 드라이버는 하나 이상의 PDEVICE_OBJECT를 가지고 있어야 한다. 그래야만 드라이버는 PDEVICE_OBJECT를 통해 IO관리자가 전달하는 IRP를 전달 받을 수 있고, 유저 모드 응용 프로그램은 PDEIVCE_OBJECT의 심볼 이름 또는 GUID를 사용해 드라이버에 접근 할 수 있다. 

보통 이 함수는 PDRIVER_OBJECT의 디바이스 스택 계층에 포함될 PDEIVCE_OBJECT를 만들위 위해 사용된다. 


아래는 Device Type 이다. 

#define DEVICE_TYPE ULONG


#define FILE_DEVICE_BEEP                0x00000001

#define FILE_DEVICE_CD_ROM              0x00000002

#define FILE_DEVICE_CD_ROM_FILE_SYSTEM  0x00000003

#define FILE_DEVICE_CONTROLLER          0x00000004

#define FILE_DEVICE_DATALINK            0x00000005

#define FILE_DEVICE_DFS                 0x00000006

#define FILE_DEVICE_DISK                0x00000007

#define FILE_DEVICE_DISK_FILE_SYSTEM    0x00000008

#define FILE_DEVICE_FILE_SYSTEM         0x00000009

#define FILE_DEVICE_INPORT_PORT         0x0000000a

#define FILE_DEVICE_KEYBOARD            0x0000000b

#define FILE_DEVICE_MAILSLOT            0x0000000c

#define FILE_DEVICE_MIDI_IN             0x0000000d

#define FILE_DEVICE_MIDI_OUT            0x0000000e

#define FILE_DEVICE_MOUSE               0x0000000f

#define FILE_DEVICE_MULTI_UNC_PROVIDER  0x00000010

#define FILE_DEVICE_NAMED_PIPE          0x00000011

#define FILE_DEVICE_NETWORK             0x00000012

#define FILE_DEVICE_NETWORK_BROWSER     0x00000013

#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014

#define FILE_DEVICE_NULL                0x00000015

#define FILE_DEVICE_PARALLEL_PORT       0x00000016

#define FILE_DEVICE_PHYSICAL_NETCARD    0x00000017

#define FILE_DEVICE_PRINTER             0x00000018

#define FILE_DEVICE_SCANNER             0x00000019

#define FILE_DEVICE_SERIAL_MOUSE_PORT   0x0000001a

#define FILE_DEVICE_SERIAL_PORT         0x0000001b

#define FILE_DEVICE_SCREEN              0x0000001c

#define FILE_DEVICE_SOUND               0x0000001d

#define FILE_DEVICE_STREAMS             0x0000001e

#define FILE_DEVICE_TAPE                0x0000001f

#define FILE_DEVICE_TAPE_FILE_SYSTEM    0x00000020

#define FILE_DEVICE_TRANSPORT           0x00000021

#define FILE_DEVICE_UNKNOWN             0x00000022

#define FILE_DEVICE_VIDEO               0x00000023

#define FILE_DEVICE_VIRTUAL_DISK        0x00000024

#define FILE_DEVICE_WAVE_IN             0x00000025

#define FILE_DEVICE_WAVE_OUT            0x00000026

#define FILE_DEVICE_8042_PORT           0x00000027

#define FILE_DEVICE_NETWORK_REDIRECTOR  0x00000028

#define FILE_DEVICE_BATTERY             0x00000029

#define FILE_DEVICE_BUS_EXTENDER        0x0000002a

#define FILE_DEVICE_MODEM               0x0000002b

#define FILE_DEVICE_VDM                 0x0000002c

#define FILE_DEVICE_MASS_STORAGE        0x0000002d

#define FILE_DEVICE_SMB                 0x0000002e

#define FILE_DEVICE_KS                  0x0000002f

#define FILE_DEVICE_CHANGER             0x00000030

#define FILE_DEVICE_SMARTCARD           0x00000031

#define FILE_DEVICE_ACPI                0x00000032

#define FILE_DEVICE_DVD                 0x00000033

#define FILE_DEVICE_FULLSCREEN_VIDEO    0x00000034

#define FILE_DEVICE_DFS_FILE_SYSTEM     0x00000035

#define FILE_DEVICE_DFS_VOLUME          0x00000036

#define FILE_DEVICE_SERENUM             0x00000037

#define FILE_DEVICE_TERMSRV             0x00000038

#define FILE_DEVICE_KSEC                0x00000039

#define FILE_DEVICE_FIPS                0x0000003A

#define FILE_DEVICE_INFINIBAND          0x0000003B

#define FILE_DEVICE_VMBUS               0x0000003E

#define FILE_DEVICE_CRYPT_PROVIDER      0x0000003F

#define FILE_DEVICE_WPD                 0x00000040

#define FILE_DEVICE_BLUETOOTH           0x00000041

#define FILE_DEVICE_MT_COMPOSITE        0x00000042

#define FILE_DEVICE_MT_TRANSPORT        0x00000043

#define FILE_DEVICE_BIOMETRIC           0x00000044

#define FILE_DEVICE_PMI                 0x00000045

#define FILE_DEVICE_EHSTOR              0x00000046

#define FILE_DEVICE_DEVAPI              0x00000047

#define FILE_DEVICE_GPIO                0x00000048

#define FILE_DEVICE_USBEX               0x00000049

#define FILE_DEVICE_CONSOLE             0x00000050

#define FILE_DEVICE_NFP                 0x00000051

#define FILE_DEVICE_SYSENV              0x00000052

#define FILE_DEVICE_VIRTUAL_BLOCK       0x00000053

#define FILE_DEVICE_POINT_OF_SERVICE    0x00000054


아래는 various device characteristics flags 이다. 


#define FILE_REMOVABLE_MEDIA                        0x00000001

#define FILE_READ_ONLY_DEVICE                       0x00000002

#define FILE_FLOPPY_DISKETTE                        0x00000004

#define FILE_WRITE_ONCE_MEDIA                       0x00000008

#define FILE_REMOTE_DEVICE                          0x00000010

#define FILE_DEVICE_IS_MOUNTED                      0x00000020

#define FILE_VIRTUAL_VOLUME                         0x00000040

#define FILE_AUTOGENERATED_DEVICE_NAME              0x00000080

#define FILE_DEVICE_SECURE_OPEN                     0x00000100

#define FILE_CHARACTERISTIC_PNP_DEVICE              0x00000800

#define FILE_CHARACTERISTIC_TS_DEVICE               0x00001000

#define FILE_CHARACTERISTIC_WEBDAV_DEVICE           0x00002000

#define FILE_CHARACTERISTIC_CSV                     0x00010000

#define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL    0x00020000

#define FILE_PORTABLE_DEVICE                        0x00040000

'Language & API > WINDOWS DRIVER' 카테고리의 다른 글

[함수]IoCreateSymbolicLink  (0) 2016.07.25
[함수]IoSetDeviceInterfaceState  (0) 2016.07.25
[함수]IoRegisterDeviceInterface  (0) 2016.07.25
[자료구조]DEVICE_OBJECT  (0) 2016.07.25
[함수]IoAttachDeviceToDeviceStack  (0) 2016.07.25