IRP란 무엇인가

Size: px
Start display at page:

Download "IRP란 무엇인가"

Transcription

1 IRP 란무엇인가? 윈도우프로그래밍을해보신분이라면윈도우프로그램이콘솔프로그램과다른가장큰차이점이메시지구동방식이라는것을알고계실것입니다. 즉, 일반콘솔프로그램이순차적으로진행되는반면에윈도우프로그램은사용자가특정작업 ( 마우스클릭, 키보드입력, 메뉴선택등등 ) 을하게되면그것에해당하는윈도우메시지라는것이발생되고그러면윈도우에서는해당메시지를현재활성화되어있는프로그램의메시지큐에집어넣게됩니다. 그러면프로그램은메시지큐에서메시지를가져와서적절한처리를하는것입니다. 드라이버역시이와비슷한동작을합니다. 드라이버는로딩이성공적으로이루어지면할당된메모리에대기하고있다가자신이컨트롤하고있는디바이스에특정한요청이왔을때윈도우에서보내주는요청정보를토대로적절한동작을처리하게됩니다. 이때윈도우프로그램이특정메시지를처리하기위해해당메시지값과그에관련된정보 ( 예를들어마우스버튼클릭메시지의경우해당마우스포인터의 X, Y 좌표값 ) 들이들어있는 MSG라고하는구조체를파라미터로받아처리하듯드라이버역시이와같은특정요청에관련된정보들을함수의파라미터로받게됩니다. 이러한정보들을담은미리정의된구조체가바로 IRP입니다. IRP는 ntddk.h에서아래와같이정의되어있습니다. typedef _IRP CSHORT Type; USHORT Size; PMDL MdlAddress; ULONG Flags; union _IRP *MasterIrp; LONG IrpCount; PVOID SystemBuffer; AssociatedIrp; LIST_ENTRY ThreadListEntry; IO_STATUS_BLOCK IoStatus; KPROCESSOR_MODE RequestorMode; BOOLEAN PendingReturned; CHAR StackCount; CHAR CurrentLocation; BOOLEAN Cancel; KIRQL CancelIrql;

2 CCHAR ApcEnvironment; UCHAR AllocationFlags; PIO_STATUS_BLOCK UserIosb; PKEVENT UserEvent; union PIO_APC_ROUTINE UserApcRoutine; PVOID UserApcContext; AsynchronousParameters; LARGE_INTEGER AllocationSize; Overlay; PDRIVER_CANCEL CancelRoutine; PVOID UserBuffer; union union KDEVICE_QUEUE_ENTRY DeviceQueueEntry; PVOID DriverContext[4]; ; ; PETHREAD Thread; PCHAR AuxiliaryBuffer; LIST_ENTRY ListEntry; union _IO_STACK_LOCATION *CurrentStackLocation;

3 ULONG PacketType; ; ; PFILE_OBJECT OriginalFileObject; Overlay; KAPC Apc; PVOID CompletionKey; Tail; IRP, *PIRP; 위에서볼수있듯이 IRP는굉장히많은정보를포함하고있으며 IRP의종류에따라다른형식의정보를가지고있도록여러개의 union을정의하고있는구조체입니다. 여기서모든멤버를다살펴볼필요는없고앞으로필요할때하나씩알아보도록하겠습니다. 우선알아야할것은 _IO_STACK_LOCATION *CurrentStackLocation 입니다. 이것은이름그대로현재의드라이버와연관된스택위치를가리키는포인터입니다. 나중에다시설명하겠지만디바이스드라이버는일반적으로여러개의드라이버가계층을이루고있습니다. 예를들어 USB 드라이버의경우 USB 버스드라이버가가장처음로드가되고그위에실제적으로 USB와연결된장치를컨트롤하는펑션드라이버가로드되게됩니다. 이러한구조에서 I/O manager가특정데이터를읽는동작을위해 IRP_MJ_READ라는요청을하게되면이 IRP는평션드라이버에먼저보내어지고다시평션드라이버에서는자신에게해당하는작업을하고나서해당 IRP를버스드라이버에게보내게되는것입니다. 그리고이렇게계층화된드라이버들은 - IRP는계층화된드라이버들이공통으로사용하는공간이므로 - 자신만의구별된 IRP처리를위해자신과관련정보들을참조할공간이필요할것입니다. 이러한공간이 I/O manager에의해스택으로처리되어있으며그자료공간이바로 IO_STACK_LOCATION구조체입니다. 그리고해당드라이버에게연결된스택포인터가 CurrentStackLocation에저장되어있습니다. 만약위의설명이잘이해가가지않는다면 CurrentStackLocation이라는것이 IRP 처리를위한또다른여러가지정보를포함하고있는구조체라고만우선알아두시기바랍니다. CurrentStackLocation의데이터타입인 IO_STACK_LOCATION 구조체는아래와같이정의되어있습니다. typedef _IO_STACK_LOCATION UCHAR MajorFunction; UCHAR MinorFunction; UCHAR Flags; UCHAR Control; union

4 PIO_SECURITY_CONTEXT SecurityContext; ULONG Options; USHORT POINTER_ALIGNMENT FileAttributes; USHORT ShareAccess; ULONG POINTER_ALIGNMENT EaLength; Create; ULONG Length; ULONG POINTER_ALIGNMENT Key; LARGE_INTEGER ByteOffset; Read; ULONG Length; ULONG POINTER_ALIGNMENT Key; LARGE_INTEGER ByteOffset; Write; ULONG Length; FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass; QueryFile; ULONG Length; FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass; PFILE_OBJECT FileObject; union BOOLEAN ReplaceIfExists; BOOLEAN AdvanceOnly; ; ULONG ClusterCount;

5 HANDLE DeleteHandle; ; SetFile; ULONG Length; FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass; QueryVolume; ULONG OutputBufferLength; ULONG POINTER_ALIGNMENT InputBufferLength; ULONG POINTER_ALIGNMENT IoControlCode; PVOID Type3InputBuffer; DeviceIoControl; PVOID DoNotUse1; PDEVICE_OBJECT DeviceObject; MountVolume; PVOID DoNotUse1; PDEVICE_OBJECT DeviceObject; VerifyVolume; _SCSI_REQUEST_BLOCK *Srb; Scsi; DEVICE_RELATION_TYPE Type; QueryDeviceRelations; CONST GUID *InterfaceType; USHORT Size;

6 USHORT Version; PINTERFACE Interface; PVOID InterfaceSpecificData; QueryInterface; PDEVICE_CAPABILITIES Capabilities; DeviceCapabilities; PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList; FilterResourceRequirements; ULONG WhichSpace; PVOID Buffer; ULONG Offset; ULONG POINTER_ALIGNMENT Length; ReadWriteConfig; BOOLEAN Lock; SetLock; BUS_QUERY_ID_TYPE IdType; QueryId; DEVICE_TEXT_TYPE DeviceTextType; LCID POINTER_ALIGNMENT LocaleId; QueryDeviceText; BOOLEAN InPath; BOOLEAN Reserved[3]; DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;

7 UsageNotification; SYSTEM_POWER_STATE PowerState; WaitWake; PPOWER_SEQUENCE PowerSequence; PowerSequence; ULONG SystemContext; POWER_STATE_TYPE POINTER_ALIGNMENT Type; POWER_STATE POINTER_ALIGNMENT State; POWER_ACTION POINTER_ALIGNMENT ShutdownType; Power; PCM_RESOURCE_LIST AllocatedResources; PCM_RESOURCE_LIST AllocatedResourcesTranslated; StartDevice; ULONG_PTR ProviderId; PVOID DataPath; ULONG BufferSize; PVOID Buffer; WMI; PVOID Argument1; PVOID Argument2; PVOID Argument3; PVOID Argument4; Others; Parameters; PDEVICE_OBJECT DeviceObject;

8 PFILE_OBJECT FileObject; PIO_COMPLETION_ROUTINE CompletionRoutine; PVOID Context; IO_STACK_LOCATION, *PIO_STACK_LOCATION; 굉장히많은멤버를가지고있지만사실몇몇변수를제외하고는모두 union... 이런식으로특정메시지마다다른정보를포함하도록공용체로처리되어있습니다. 그리고이러한메시지는 MajorFunction과 MinorFunction, 이두개의변수에저장되어있습니다. 예를들어애플리케이션에서디바이스의데이터를읽기위해 ReadFile() API를사용하게되면 I/O manager는해당함수의수행을위해디바이스드라이버에게 IRP를내려보내게되고 IRP의멤버인 CurrentStackLocation구조체에는 MajorFunction변수에 IRP_MJ_READ 값이들어가게됩니다. 참고로 IRP_MJ_READ는 #define IRP_MJ_READ 0x03 이렇게정의된 UCHAR 값입니다. 그리고해당읽기동작을위해필요한정보들 ( 데이터를저장할버퍼포인터, 버퍼사이즈 ) 는각각 IRP->AssociatedIrp.SystemBuffer와 CurrentStackLocation->Read.Length에저장되어해당값을참조할수있습니다. 이 IRP에관련된자세한사항은실제소스를분석할때다시언급하기로하겠습니다. Symbolic Link Name 우리가프로그래밍을할때어떤변수를선언하고그변수에 1이라고하는데이터를집어넣게되면해당변수의이름을이용해서 1이라는값을언제든지참조할수있게됩니다. 함수역시해당함수를호출하기위해서는실제함수가위치한메모리주소대신그함수의이름을사용하며그이름은함수가정의되어있는위치를가리키는포인터값을상징하게됩니다. 마찬가지로우리가특정디바이스를컨트롤하기위해서는해당디바이스의이름을통해사용자가작업하기원하는디바이스가무엇인지윈도우에게알려줘야합니다. 이렇게사용자 ( 보다정확하게말하면유저모드프로그램 ) 에서사용가능토록외부로노출되어있는디바이스의이름을 Symbolic Link Name 이라고합니다.

9 한가지주의할점은이 symbolic link name이우리가이전소스에서정의했던 device name과는다르다는사실입니다. Device name은커널모드에서사용가능한이름이고 symbolic link name은유저모드에서사용가능한이름입니다. 이렇게굳이구분을둔이유는유저모드프로그램에서커널모드의구성요소들을직접컨트롤하는일을방지하기위한목적이아닌가생각됩니다.( 제추측이랍니다 ^^) 어쨌든 device name은이렇게유저모드에서직접적인호출이불가능하므로만약어플리케이션에서드라이버가컨트롤하고있는특정디바이스의핸들 ( 일종의제어권 ) 을가져오기위해서는드라이버에서 symbolic link name을따로정의해서해당 device name와연결시켜주는작업을해야합니다. 이와관련된자세한사항은아래소스에서더살펴보도록하겠습니다.( 그외에 symbolin link 에관련된사항은 Inside Windows 2000, chapter 3에 Object manager에관한부분에자세히설명이되어있습니다.) 커널메모리와유저메모리 커널모드프로그램과유저모드프로그램은사용하는메모리구역이틀립니다. 우선이부분에대해이야기하기전에 가상메모리 라는것에대해먼저언급하도록하겠습니다. 프로그램이실행이되면윈도우는먼저프로그램이실행되는데필요한기본메모리를할당해서해당위치에저장합니다. 그리고메모리상에서필요한명령어들을불러와원하는동작을진행하게됩니다. 따라서원래대로라면프로그램의코드사이즈와해당프로그램에서할당하는변수크기는컴퓨터의램크기를넘어서서는안됩니다. 물론기본적으로윈도우가메모리에로딩되어있고그외에여러가지다른프로그램이나드라이버들이메모리를차지하고있으므로실제로어떤프로그램이차지하게되는메모리양은램크기보다작게되며동시에실행할수있는프로그램의개수도제한될수밖에없습니다. 이러한문제점을해결하기위해만들어진방법이바로가상메모리입니다. 예를들어실제물리적인메모리의크기가 1Mbytes(1*1024*1024bytes) 이고최소저장가능한메모리크기가 1byte 라고한다면메모리번지수는 1*1024*1024개가됩니다. 하지만윈도우에서메모리주소를 4*1024*1024개로정하고나머지 3*1024*1024bytes만큼의메모리는디스크에따로공간을만들어놓고관리를하게되면컴퓨터는마치 4Mbytes의메모리를가진것처럼동작하게됩니다. 즉, 현재당장프로그램을실행하는데필요한메모리는실제물리메모리에올려놓고사용하고그외에당장사용하지않는내용들은디스크에옮겨놓음으로써메모리를효율적으로사용하는방식입니다. 이것은마치책상에책을모두쌓아놓기에는공간이부족하므로책장을따로마련해놓고필요한책들을가져오고필요없는책은다시책장에꽂아놓는것과비슷합니다. 윈도우는실제로컴퓨터가부팅이되는순간바로하드디스크의특정부분에이가상메모리를위한공간을만들어둡니다.( 그림 2_1 참조 )

10 < 그림 2_1> 위의그림에나와있는 pagefile.sys가바로그역할을하는파일입니다.( 이파일을보기위해서는도구-> 폴더옵션-> 보기에서보호된운영체제파일숨기기의체크를없애주셔야합니다.) 윈도우는해당사이즈만큼을가상메모리로사용하면서당장사용하지않는프로그램코드값이나자료들을 pagefile.sys에저장하고필요할때메모리로읽어오게됩니다.( 기타가상메모리에대한개념이나관련메커니즘은운영체제개론서를보시면잘나와있습니다.) 어쨌든윈도우는이러한가상메모리기법을사용해서최대 4GBytes(2^32bytes) 의메모리를관리할수있습니다. 그리고이전체메모리를반으로나눠서각각커널모드와유저모드에서사용하도록구분을지어놓고있습니다. 하위 2Gbytes가유저모드를위한메모리이며상위 2Gbytes가커널을위한메모리입니다. 유저모드프로그램에서디바이스드라이버와같은커널모드프로그램에데이터를전달하기위해서는 - 혹은전달받기위해서는 특별한방식이필요합니다. 그이유는두모드에서메모리를관리하는방식에있어차이가있기때문입니다. 유저모드는메모리관리에있어서다음과같은특성이있습니다. 1. 모든할당되는메모리는페이지라고하는일정크기의블록으로관리됩니다. 그이유는앞에서언급

11 한가상메모리방식때문입니다. 윈도우는가상메모리방식에의해현재사용되는않는메모리는하드디스크에옮겨놓고필요한메모리를가져오게되는데이때보다높은효율성과관리의편의성을위해일정사이즈로블록화시켜관리하게됩니다. 그리고이러한메모리를페이지메모리 (Paged Memory) 라고합니다. 2. 프로세스별로메모리가관리됩니다. 따라서현재사용되지않는프로세스 (Idle Process) 에할당된메모리는하드디스크로옮겨지고현재메모리에서삭제됩니다. 이것을 Swap Out이라고합니다. 반대로다시해당프로세스가사용되게되면다시메모리로옮겨오게되는데이것을 Swap In이라고하고이렇게 Swap Out과 In을하는동작을 Swapping이라고합니다. 3. 유저모드프로세스는커널모드메모리를참조하거나변경하지못합니다. 이것은윈도우의메모리보호정책에의해서보장되며이러한특성때문에유저모드프로그램에서발생된어떠한에러도시스템에문제를일으키지못합니다.( 우리가어떤프로그램을사용하다가에러에의해프로그램이다운되더라도해당프로그램을종료하면다시원상태로복구될수있는것은이러한이유때문입니다 ) 만약커널모드메모리를참조 / 쓰기하려고하게되면 Access Violation 에러를일으키며윈도우는해당프로세스를강제로종료시키게됩니다. 4. 3의특성에서하나더나아가다른프로세스들간에도메모리를함부로참조 / 변경하지못하도록윈도우에서보호해줍니다.(CreateFileMapping() 과같은 API를사용하면이러한제약을부분적으로없애줘서프로세스간에메모리공유가가능합니다.) 반면커널메모리는다음과같은특성이있습니다. 1. 할당되는메모리는페이지될수도있고그렇지않을수도있습니다. 페이지메모리는스와핑이일어나기때문에해당데이터가반드시현재메모리에있다는보장이없습니다. 이것은일반유저모드프로그램에서는큰문제가되지않지만 ( 스와핑에의해필요할때마다다시불려질수있으므로 ) 윈도우커널의핵심코드나데이터의경우큰문제가될수있습니다. ( 예를들어스와핑작업을담당하는커널명령루틴자체가메모리에서페이지아웃되어있다고생각해보시기바랍니다 ) 따라서커널모드프로세스에서는중요한루틴이나데이터들은항상메모리에있도록보장할수있어야합니다. 그리고그렇게하기위해서는중요한데이터나실행코드들은페이지되지않은메모리에저장해서스와핑을막게됩니다. ( 사실여기서설명한내용은정확하다고볼수없습니다. 커널모드에서스와핑이일어나서는안되는보다정확한이유는뒤에서설명하도록하겠습니다.) 2. 유저모드프로그램과달리커널모드프로세스들은다른프로세스들간에메모리보호가되지못합니다. 따라서메모리관리를잘못하게되면다른중요한시스템데이터가손상될수도있습니다.( 커널모드에서는윈도우가제공하는메모리보호정책이적용되지않습니다.) 3. 커널모드프로세스들은유저모드메모리를직접참조할수있습니다. 하지만여러가지위험이발생하는데이것에대해서는바로밑에서설명하겠습니다. 이러한특성들때문에커널모드에서동작하는디바이스드라이버와유저모드프로그램간에는데이터를주고받음에있어서여러가지제약이발생하게됩니다. 예를들어유저모드프로그램에서드라이버에게어떤데이터를주고자한다면커널모드메모리에직접데

12 이터를쓰지못하므로문제가생깁니다. 반대로드라이버에서데이터를가져오는것도불가능합니다. 반대로드라이버에서유저모드프로그램에게데이터를넘겨주거나읽어온다고할때도문제가생깁니다. 왜냐하면위에유저메모리특성에서설명했듯이유저모드프로세스의메모리는스와핑이일어나기때문입니다. 자세하게설명하자면, 윈도우는아시다시피멀티프로세싱 ( 예를들어현재인터넷검색을하면서워드작업 ) 이가능합니다. 이것은윈도우에서사용자가하나의프로그램을사용하는동안에도틈틈이다른프로세스의작업을수행하기때문입니다. 다시말하면여러개의프로세스가돌아가면서동작한다는것을뜻하며현재우리드라이버가데이터를참조하고자하는프로그램의메모리가스와핑될가능성을항상가지고있다는것을의미하기도합니다. 그러므로만약드라이버에서유저모드프로그램의메모리를직접참조하려고하면 물론운이좋아안일어날수도있지만 스와핑이이미일어나서드라이버가참조하고자하는물리메모리영역에는엉뚱한값들이들어있을수가있습니다. 때문에윈도우 ( 정확하게말하자면 I/O manager) 에서는커널모드와유저모드간에데이터를주고받기위해크게두가지방식을제공합니다. 1. Buffered I/O A. 만약유저모드프로그램과드라이버간에데이터를주고받는요청이발생하면 I/O manager에서는해당데이터의사이즈를먼저체크한후해당데이터가들어갈만한충분한사이즈의페이지되지않은버퍼메모리를생성합니다. B. 필요하다면 ( 드라이버에데이터를쓰는작업의경우 ) 유저모드데이터를이버퍼에복사합니다. C. 드라이버에서이버퍼메모리의값을참조하거나혹은 데이터읽기작업일경우 버퍼에드라이버가가지고있는데이터를저장합니다. D. 해당작업이완료되면 I/O manager는버퍼에있는데이터를다시유저모드메모리에복사하고버퍼메모리를해제합니다. 2. Direct I/O A. 데이터를주고받는요청이발생하면 I/O manager에서해당메모리가스와핑이되지않도록일종의잠금장치를합니다. B. 잠겨진 (Locked) 메모리를드라이버에서쉽게참조할수있도록관련정보가저장된 Memory Desctriptor List(MDL) 라는것을만듭니다. C. 드라이버에서는 MDL을가지고참조가능한메모리포인터를리턴해주는 MmGetSystem- AddresForMdl() 이라고하는 API를사용하여데이터를주고받을포인터를만들고이포인터를이용해서데이터처리를합니다. D. I/O manager는쓰기 / 읽기동작이완료되면 MDL을제거하고해당메모리의잠금장치를해제합니다. 이두가지방식이어떻게드라이버프로그래밍에서사용되는지는앞으로하나씩설명해나가도록하겠습니다.

13 유저모드프로그램과디바이스드라이버의통신방법 유저모드프로그램에서디바이스드라이버를제어하고데이터를주고받기위해서는해당디바이스의핸들을가져오는것을가장먼저해야합니다. 그리고이것을위해 CreateFile() 이라고하는 API를사용합니다. 이함수의원형은다음과같습니다. CreateFile( IN LPCSTR lpfilename, IN DWORD dwdesiredaccess, IN DWORD dwsharemode, IN LPSECURITY_ATTRIBUTES lpsecurityattributes, IN DWORD dwcreationdisposition, IN DWORD dwflagsandattributes, IN HANDLE htemplatefile ); 1. lpfilename : 이것은해당디바이스의 symbolic link name값이들어갑니다. Symbolic link name은. 사용자가정의한이름 이런식으로정의됩니다. 앞에들어가는. 는윈도우에서관리하는 symbolic link name의이름공간 (name space) 입니다. 자세한사항은디바이스드라이버관련책이나 Inside Windows 2000을참조하시기바랍니다. 2. dwdesireaccess : 해당디바이스에대한사용권한 ( 읽기 / 쓰기 / 실행 ) 을설정합니다. 3. dwsharemode : 해당디바이스를다른프로그램에서도공유할지여부를결정합니다. 4. lpsecurityattribute : security description 구조체의포인터값이들어갑니다. 보통 NULL로설정합니다. 5. dwcreationdisposition : 해당디바이스의핸들을얻어오는방식에대해결정합니다. 일반적으로해당디바이스가존재할때만핸들을얻어올수있도록 OPEN_EXISTING(3) 값을셋팅합니다. 6. dwflagsandattributes : 파일오브젝트의경우해당파일의특성값들을셋팅할수있습니다. 일반적으로파일오브젝트외의디바이스에서는 FILE_ATTRIBUTE_NORMAL값을셋팅합니다. 7. htemplatefile : 역시파일오브젝트의경우에해당하는사항입니다. 일반디바이스는 NULL값을셋팅합니다. CreateFile() 함수는해당디바이스의핸들값을리턴합니다. 그리고이핸들값을이용해서해당디바이스에읽기, 쓰기등의작업을수행하게됩니다. 우리드라이버의테스트프로그램에서의사용예는다음과같습니다. if (m_hdrvhandle) AfxMessageBox("Already create driver..."); return;

14 m_hdrvhandle = CreateFile( DEVICE_LINK_NAME, GENERIC_READ GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if ((m_hdrvhandle == NULL) (GetLastError()!= ERROR_SUCCESS)) DisplayErrorMsg("CreateFile"); m_hdrvhandle = NULL; return; 테스트프로그램에서는 ReadFile(), WriteFile() API 를이용해서디바이스에읽기 / 쓰기작업을수행합니다. 각 각의사용예는아래와같습니다. WriteFile( m_hdrvhandle, (PVOID)m_pWriteBuffer, m_dwbuffersize, &m_dwbuffersize, NULL ) ReadFile( m_hdrvhandle, (PVOID)m_pReadBuffer, m_dwbuffersize, &m_dwbuffersize, NULL ) 자세한파라미터에대한설명은 MSDN을참조하시기바랍니다. 여기서는이러한 API를이용하기위해서는 CreateFile() 에서넘어온핸들값 ( 여기서는 m_hdrvhandle 변수 ) 을이용해야한다는것을기억해두시기바랍

15 니다. 그럼기본적인사항에대한설명은이만마치고실제소스를실행해보고소스를분석하는단계에서보다자세한관련사항을언급하도록하겠습니다.

16 Hello Driver Ver 2 소스이번에작성하는프로그램은위에서만들어본 Hello Drvier에기본적인 I/O 기능이추가된드라이버입니다. 이드라이버는애플리케이션에서핸들을얻어와서간단한데이터를읽고쓸수있습니다. 아래에소스전문이나와있습니다. <Hello_DriverEntry.h> #ifndef DRIVER_ENTRY_H #define DRIVER_ENTRY_H typedef _DEVICE_EXTENSION PDEVICE_OBJECT pdevobj; UNICODE_STRING DevLinkName; UCHAR *pdevbuffer; ULONG dwbuffersize; DEVICE_EXTENSION, *PDEVICE_EXTENSION; #define MAX_BUFFER_SIZE 1024 #define DEVICE_NAME L" Device HELLODRV_Ver2" #define DEVICE_LINK_NAME L"?? HelloDrv" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath); VOID Hello_DriverUnload(IN PDRIVER_OBJECT DriverObject); NTSTATUS Hello_Dispatch(IN PDEVICE_OBJECT DevObj, IN PIRP irp); #endif <Hello_DriverEntry.c> #include "ntddk.h" #include "Hello_DriverEntry.h" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING DeviceName, DevLinkName;

17 PDEVICE_OBJECT pdeviceobject; PDEVICE_EXTENSION pdevext; int i; DriverObject->DriverUnload = Hello_DriverUnload; RtlInitUnicodeString(&DeviceName, DEVICE_NAME); RtlInitUnicodeString(&DevLinkName, DEVICE_LINK_NAME); status = IoCreateDevice( DriverObject, sizeof(device_extension), &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pdeviceobject ); if (!NT_SUCCESS (status)) return status; pdeviceobject->flags = DO_BUFFERED_IO; pdevext = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension; pdevext->devlinkname.buffer = (PWSTR)ExAllocatePool(NonPagedPool, DevLinkName.MaximumLength); pdevext->devlinkname.maximumlength = DevLinkName.MaximumLength; RtlCopyUnicodeString(&pDevExt->DevLinkName, &DevLinkName); pdevext->pdevobj = pdeviceobject; pdevext->pdevbuffer = (UCHAR *)ExAllocatePool(NonPagedPool, MAX_BUFFER_SIZE); pdevext->dwbuffersize = 0; status = IoCreateSymbolicLink(&pDevExt->DevLinkName, &DeviceName); if (!NT_SUCCESS(status)) KdPrint(("IoCreateSymbolicLink failed!!! nstatus : %x", status));

18 for(i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) DriverObject->MajorFunction[i] = Hello_Dispatch; KdPrint(("Hello Driver World!!!")); return status; VOID Hello_DriverUnload(IN PDRIVER_OBJECT DriverObject) NTSTATUS status = STATUS_SUCCESS; if(driverobject->deviceobject) PDEVICE_EXTENSION pdevext = (PDEVICE_EXTENSION)DriverObject->DeviceObject->DeviceExtension; status = IoDeleteSymbolicLink(&pDevExt->DevLinkName); if (!NT_SUCCESS(status)) KdPrint(("IoDeleteSymbolicLink failed!!! nstatus : %x", status)); RtlFreeUnicodeString(&pDevExt->DevLinkName); IoDeleteDevice(pDevExt->pDevObj); DriverObject->DeviceObject = NULL; KdPrint(("Hello Driver Unload...bye~")); NTSTATUS Hello_Dispatch(IN PDEVICE_OBJECT DevObj, IN PIRP irp) NTSTATUS status = STATUS_SUCCESS; PIO_STACK_LOCATION pirpstack = IoGetCurrentIrpStackLocation(irp);

19 UCHAR majorfunc = pirpstack->majorfunction; UCHAR *psysbuffer; ULONG dwbuffersize = 0; PDEVICE_EXTENSION pdevext = (PDEVICE_EXTENSION)DevObj->DeviceExtension; irp->iostatus.information = 0; switch (majorfunc) case IRP_MJ_CREATE: KdPrint(("Hello Device Create!")); break; case IRP_MJ_CLOSE: KdPrint(("Hello Device Close!")); break; case IRP_MJ_CLEANUP: KdPrint(("Hello Device Clean Up!")); break; case IRP_MJ_READ: KdPrint(("Hello Device Read!")); psysbuffer = irp->associatedirp.systembuffer; dwbuffersize = pirpstack->parameters.read.length; dwbuffersize = (dwbuffersize < pdevext->dwbuffersize)? dwbuffersize : pdevext->dwbuffersize; RtlCopyMemory(pSysBuffer, pdevext->pdevbuffer, dwbuffersize); irp->iostatus.information = dwbuffersize; break; case IRP_MJ_WRITE: KdPrint(("Hello Device Write!")); psysbuffer = irp->associatedirp.systembuffer; dwbuffersize = pirpstack->parameters.write.length; if (dwbuffersize > MAX_BUFFER_SIZE) KdPrint(("Too Many Wrtie Buffer Size!!!"));

20 status = STATUS_INSUFFICIENT_RESOURCES; break; RtlCopyMemory(pDevExt->pDevBuffer, psysbuffer, dwbuffersize); pdevext->dwbuffersize = dwbuffersize; irp->iostatus.information = pdevext->dwbuffersize; break; default: KdPrint(("I can't dispatch this IRP")); break; irp->iostatus.status = status; IoCompleteRequest(irp, IO_NO_INCREMENT); return status; 이제해당드라이버를실행하기위해서아래와같이설정합니다. 1. 드라이버의실행파일은 HelloDrvVer2.sys로 ( 혹은자신이원하는드라이버이름으로 ) 설정한다. 2. 드라이버를빌드하고 system32 drivers 디렉토리에카피를한다. 3. 레지스트리편집기에서 HKLM SYSTEM CurrentControlSet Services에드라이버키를생성한다. 4. Start, Type, ErrorControl값을셋팅한다. 5. 컴퓨터를재부팅한다. 만약원래있던 HelloDriver 의셋팅을그대로이용하고싶다면 2~4 번의과정대신 HelloDriver 레지스트리 셋팅정보가들어있는키에다음과같은값을추가하면됩니다. ImagePath :?? c: windows system32 drivers hellodrv.sys 참고로 ImagePath 값의데이터형은확장가능한문자열 (REG_EXPAND_SZ) 형으로설정합니다.( 그림 2_2 참 조 )

21 < 그림 2_2> 이제 Chapter1에서설명한방식으로드라이버를로딩합니다. ( 레지스트리의 Start값을 1로설정해서리부팅 시자동으로로딩이되도록합니다.) 테스트프로그램의사용법은아래와같습니다. 1. Create 버튼을눌러서해당디바이스의핸들을얻어온다. 2. 에디트박스에스트링을입력한다. 3. 엔터혹은 Send 버튼을누른다. 4. 리스트박스에사용자가입력한내용이그대로출력된다. 5. 끝내기전에 Close 버튼을눌러해당디바이스의핸들을해제한다. 6. 프로그램을종료한다. 우리디바이스드라이버는단지사용자가입력한데이터를그대로저장하고있다가다시내보내는간단한기능을수행합니다. 그리고해당작업을수행할때적절한디버그메시지도출력해줍니다.( 그림 2_3 참조 ) 만약사용자가입력한데이터가지나치게크면적절한에러메시지를출력해줍니다.( 그림 2_4 참조 ) 이제드라이버소스를자세하게살펴보도록하겠습니다.( 테스트프로그램은소스가매우간단하고위에서어느정도필요한사항은언급했으므로생략하겠습니다.)

22 < 그림 2_3> < 그림 2_4>

23 예제 2 : Hello Driver Ver.2 소스분석 지난번에소개한소스에서새로추가된부분을중심으로설명하도록하겠습니다. typedef _DEVICE_EXTENSION PDEVICE_OBJECT pdevobj; UNICODE_STRING DevLinkName; UCHAR *pdevbuffer; ULONG dwbuffersize; DEVICE_EXTENSION, *PDEVICE_EXTENSION; DEVICE_EXTENSION 구조체는사용자가정의해주는구조체입니다. IoCreateDevice() 함수에서두번째파라미터값으로특정사이즈를설정해주게되면윈도우는디바이스를생성할때해당사이즈만큼의메모리를따로할당하고나서디바이스오브젝트구조체멤버중하나인 DeviceExtension에할당된메모리의첫번째주소값을셋팅해줍니다. 그러면해당메모리에사용자가필요한값들을저장해서언제든지불러서사용할수있는것입니다. 따라서위에소스처럼구조체형식으로정의를해놓고사용하게되면편리하게특정값들을저장 / 참조할수있는것입니다. 이구조체형식에는특별한제약이없습니다. pdeviceobject->flags = DO_BUFFERED_IO; Flags 멤버는디바이스오브젝트의속성을결정합니다. 이속성에는디바이스이름관리방식이나데이터입 / 출력방식등이있는데 DO_BUFFERED_IO를셋팅하게되면이디바이스는앞서설명했던 Buffered I/O 방식으로데이터를주고받도록설정하는것입니다. 참고로만약 DO_DIRECT_IO라고하면 Direct I/O방식을사용한다는뜻입니다. 이두가지방식은드라이버에서데이터를처리하는방법이다소차이가나는데우선여기서는 Buffered I/O방식에대해서설명하도록하겠습니다. pdevext = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension; 앞서설명한 DEVICE_EXTENSION 구조체는디바이스오브젝트의멤버인 DeviceExtension을통해참조가능합니다. 이부분은단순히해당구조체에값을집어넣기위해 pdevext라고하는변수를대신사용하고자하는사전작업입니다. pdevext->devlinkname.buffer = (PWSTR)ExAllocatePool(NonPagedPool, DevLinkName.MaximumLength); pdevext->devlinkname.maximumlength = DevLinkName.MaximumLength; RtlCopyUnicodeString(&pDevExt->DevLinkName, &DevLinkName); pdevext->pdevobj = pdeviceobject;

24 pdevext->pdevbuffer = (UCHAR *)ExAllocatePool(NonPagedPool, MAX_BUFFER_SIZE); pdevext->dwbuffersize = 0; 앞서선언한 DEVICE_EXTENSION 구조체에데이터를할당하는부분입니다. 우리드라이버에서는 Symbolic Link Name을집어넣을수있는 UNICODE_STRING구조체의공간과나중에유저모드프로그램과데이터를주고받는데사용하게될버퍼메모리를할당하고, 디바이스오브젝트의포인터값을셋팅하고현재버퍼사이즈를 0으로셋팅하는기본적인초기화작업을수행합니다. 이소스에서한가지새로운함수가등장하는데바로 ExAllocatePool() 함수입니다. 이것은 C에서사용하는 malloc() 함수처럼동적메모리를할당하는커널 API입니다. 다만 ExAllocatePool() 에는한가지확장된기능이있는데바로할당할메모리를페이지된메모리로할지그렇지않을지를사용자가설정할수있는점입니다.( 다시한번강조하자면페이지메모리는스와핑을허용하고페이지되지않은메모리는스와핑을허용하지않습니다.) 첫번째파라미터인 NonPagedPool이페이지되지않은메모리로할당을하도록설정해주는역할을합니다.( 만약페이지된메모리를할당하고자한다면 PagedPool이라고해주면됩니다.) 그렇다면여기서왜페이지되지않은메모리로할당을했으며이러한선택은어떤기준으로하는지에대해서는나중에자세히설명하도록하겠습니다. status = IoCreateSymbolicLink(&pDevExt->DevLinkName, &DeviceName); 앞부분에서어플리케이션에서디바이스드라이버와통신을하기위해서는 Symbolic Link Name이라는것이필요하고이것을만들기위해서는디바이스의이름과심볼릭링크이름을연결시켜주는작업이필요하다고설명한것을기억하실것입니다. 위에 IoCreateSymbolicLink() 가바로그역할을해주는 API입니다. 이렇게해주면어플리케이션에서 pdevext->devlinkname에들어있는이름 ( 여기서는?? HelloDrv) 을이용해서 CreateFile() 함수로디바이스의핸들을얻어올수있습니다. 한가지주의할점은디바이스드라이버에서는?? 이라고했지만어플리케이션에서는. 라고적어줘야한다는것입니다.( 이것은이름공간 (Name Space) 라고하는특성과관련이있는데이에대한자세한사항은다음기회에다시언급하도록하겠습니다.) for(i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) DriverObject->MajorFunction[i] = Hello_Dispatch; 첫부분에서드라이버는 IRP라고하는오브젝트구조체를통해메시지를받아처리한다고설명한부분을기억하실것입니다. 그리고이러한 IRP들을처리하려면각각의 IRP마다구분을지어처리할수있는루틴을미리정의해줘야합니다. DriverObject->MajorFunction은바로이러한 IRP들을처리하는루틴들을저장해놓는일종의펑션테이블입니다. 윈도우에서미리정의해놓은 IRP는총개수는 IRP_MJ_MAXIMUM_FUNCTION에정의되어있습니다.( 참고

25 로 XPDDK에서는이값이 28개입니다.) 그리고이 IRP들은각각 0 ~ IRP_MJ_MAXIMUM_FUNCTION 수까지차례로정의되어있어서 I/O manager 가특정요청을받았을때해당요청에상응하는 IRP를만들어서보내주면드라이버에서는해당 IRP숫자번호에해당하는디스패치함수를호출하게되는것입니다. 우리드라이버에서는 I/O manager에서보내주는 IRP 를 Hello_Dispath라고하는함수에서모두처리하도록정의되어있습니다. VOID Hello_DriverUnload(IN PDRIVER_OBJECT DriverObject) NTSTATUS status = STATUS_SUCCESS; if(driverobject->deviceobject) PDEVICE_EXTENSION pdevext = (PDEVICE_EXTENSION)DriverObject->DeviceObject ->DeviceExtension; status = IoDeleteSymbolicLink(&pDevExt->DevLinkName); if (!NT_SUCCESS(status)) KdPrint(("IoDeleteSymbolicLink failed!!! nstatus : %x", status)); RtlFreeUnicodeString(&pDevExt->DevLinkName); IoDeleteDevice(pDevExt->pDevObj); DriverObject->DeviceObject = NULL; KdPrint(("Hello Driver Unload...bye~")); 드라이버언로드함수에서는진입함수에서연결했던 symbolic link name의연결을해제하고 (IoDelete SymbolicLink함수 ), 할당한 Link name의리소스를해제하는역할 (RtlFreeUnicodeString함수) 을수행합니다. 이제우리드라이버의핵심기능을담당하는 Hello_Dispatch() 함수에대해서자세히알아보도록하겠습니다. PIO_STACK_LOCATION pirpstack = IoGetCurrentIrpStackLocation(irp); IRP의멤버중에 CurrentStackLocation멤버에대해앞에서잠깐언급을할때이멤버는드라이버가해당메시지를처리할때필요한몇몇정보를포함하고있다고했었습니다. 따라서 IRP를처리함에있어서가장먼저이멤버의데이터를참조는루틴이필요합니다. 그런데 IRP는디바이스오브젝트나드라이버오브젝트처럼

26 사용자가직접참조할수없는멤버들이몇몇있으며그중하나가바로 CurrentStackLocation멤버입니다. 따라서 DDK는해당멤버를참조하기위한매크로를제공해주며 IoGetCurrentIrpStackLocation() 이바로그것입니다. 즉, 위의루틴은 IRP의현재 IRP스택위치의포인터값을 pirpstack 변수에넘겨주는기능을수행합니다. 그리고이 pirpstack은 IRP를처리함에있어아주중요한몇몇정보들을참조하는데사용됩니다. UCHAR majorfunc = pirpstack->majorfunction; pirpstack 의가장중요한역할중하나가바로위구문입니다. pirpstack->majorfunction 에는현재 I/O manager가보내준 IRP가어떤요청인지에대한정보가포함되어있습니다. DDK에정의되어있는 MajorFunction값은아래와같습니다. #define IRP_MJ_CREATE #define IRP_MJ_CREATE_NAMED_PIPE #define IRP_MJ_CLOSE #define IRP_MJ_READ #define IRP_MJ_WRITE #define IRP_MJ_QUERY_INFORMATION #define IRP_MJ_SET_INFORMATION #define IRP_MJ_QUERY_EA #define IRP_MJ_SET_EA #define IRP_MJ_FLUSH_BUFFERS #define IRP_MJ_QUERY_VOLUME_INFORMATION #define IRP_MJ_SET_VOLUME_INFORMATION #define IRP_MJ_DIRECTORY_CONTROL #define IRP_MJ_FILE_SYSTEM_CONTROL #define IRP_MJ_DEVICE_CONTROL #define IRP_MJ_INTERNAL_DEVICE_CONTROL #define IRP_MJ_SHUTDOWN #define IRP_MJ_LOCK_CONTROL #define IRP_MJ_CLEANUP #define IRP_MJ_CREATE_MAILSLOT #define IRP_MJ_QUERY_SECURITY #define IRP_MJ_SET_SECURITY #define IRP_MJ_POWER #define IRP_MJ_SYSTEM_CONTROL #define IRP_MJ_DEVICE_CHANGE #define IRP_MJ_QUERY_QUOTA 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19

27 #define IRP_MJ_SET_QUOTA #define IRP_MJ_PNP 0x1a 0x1b 예를들어사용자가우리드라이버에게서데이터를읽기위해 ReadFile() 함수를호출하면대략다음과같은과정이이루어집니다. 1. I/O manager는 ReadFile() 함수에서넘어온파라미터들을참고하여 IRP구조체를생성합니다. 2. 드라이버를위한스택공간을생성하고드라이버에서 IRP를처리하는데필요한여러가지보조되는정보들을저장합니다.( 이때스택공간중 majorfunction이차지하는공간에 IRP_MJ_READ값이셋팅이됩니다.) 3. 현재가리키고있는스택포인터위치를 IRP->CurrentStackLocation에저장합니다. 4. 드라이버오브젝트의 MajorFunction[] 테이블을참조하여해당 IRP를처리하도록정의된디스패치함수를호출하면서디바이스오브젝트와 IRP구조체의포인터를파라미터로넘겨줍니다. 5. 디스패치함수에서는 IRP_MJ_READ에대한적절한동작을취하고 IoCompleteRequest() 라고하는함수를이용해서 I/O manager에게작업이완료되었음을알려주고받았던 IRP를 IoCompleteRequest 함수의파라미터로다시넘겨줍니다. 6. I/O manager는드라이버에게서완료되었다는메시지를받으면드라이버가돌려준 IRP에있는상태값을참고하여 ReadFile() 함수에적절한리턴값을넘겨주고 IRP를해제합니다. switch (majorfunc) case IRP_MJ_CREATE: KdPrint(("Hello Device Create!")); break; case IRP_MJ_CLOSE: KdPrint(("Hello Device Close!")); break; case IRP_MJ_CLEANUP: KdPrint(("Hello Device Clean Up!")); break;... default : KdPrint(("I can't dispatch this IRP")); break;

28 위의구문이바로 IRP의 majorfunction값을토대로각각의적절한동작들을수행하도록하는기본루틴입니다. 윈도우프로그래밍에서 WndProc() 함수의기본루틴과흡사합니다. Majorfunction의기본형식은 IRP_MJ_XXX 로되어있으며 XXX부분이해당동작을설명합니다. 우리드라이버는테스트프로그램에서디바이스의핸들을얻기위해 CreateFile() 을호출할때 IRP_MJ_CREATE 값을받게되고마지막에얻어온핸들을반환하기위해 CloseHandle() 을호출할때 IRP_MJ_CLEANUP과 IRP_MJ_CLOSE값을받게됩니다. 우리드라이버에서는특별히해줘야할작업이없으므로제대로메시지를받았다는디버그메시지만을출력하고넘어가도록정의되어있습니다. 그외에받을수있는 majorfunction값으로 IRP_MJ_READ(ReadFile() 함수호출시 ) 과 IRP_MJ_WRITE(WriteFile() 함수호출시 ) 이있는데우선 IRP_MJ_WRITE처리루틴부터살펴보겠습니다. case IRP_MJ_WRITE: KdPrint(("Hello Device Write!")); psysbuffer = irp->associatedirp.systembuffer; dwbuffersize = pirpstack->parameters.write.length; if (dwbuffersize > MAX_BUFFER_SIZE) KdPrint(("Too Many Wrtie Buffer Size!!!")); status = STATUS_INSUFFICIENT_RESOURCES; break; RtlCopyMemory(pDevExt->pDevBuffer, psysbuffer, dwbuffersize); pdevext->dwbuffersize = dwbuffersize; irp->iostatus.information = pdevext->dwbuffersize; break; 테스트프로그램에서 WriteFile() 함수호출시디바이스에쓰고자하는데이터의버퍼포인터와데이터사이즈를파라미터로넘겨줄것입니다. 우리디바이스는 Buffered I/O 기능수행하도록정의되어있으므로앞에서언급했듯이 I/O manager에서는쓰기작업요청이들어오면데이터사이즈를참조하여유저데이터를충분히수용할만한버퍼를생성합니다. 그리고디바이스드라이버에서그버퍼를참조할수있도록 IRP- >AssociatedIrp.SystemBuffer 에해당버퍼포인터를, 그리고 pirpstack->parameters.write.length에버퍼의사이즈를집어넣습니다. 따라서드라이버에서는이값들을이용하여이멤버의포인터에위치한데이터를미리할당한 pdevext->pdevbuffer에복사하게됩니다.(rtlcopymemory() 함수는유저모드에서사용하는 memcpy() 와같은기능을수행합니다.) Irp->IoStatus.Information 값은나중에작업이완료된후 I/O manager에서참조하는값으로써여기서는테스트프로그램에서호출한 WriteFile() 함수의파라미터중하나인 lpnumberofbytestowrite 값으로들어가게됩니다.

29 이제 IRP_MJ_READ 처리루틴을살펴보겠습니다. case IRP_MJ_READ: KdPrint(("Hello Device Read!")); psysbuffer = irp->associatedirp.systembuffer; dwbuffersize = pirpstack->parameters.read.length; dwbuffersize = (dwbuffersize < pdevext->dwbuffersize)? dwbuffersize : pdevext- >dwbuffersize; RtlCopyMemory(pSysBuffer, pdevext->pdevbuffer, dwbuffersize); irp->iostatus.information = dwbuffersize; break; WriteFile() 함수와마찬가지로 I/O manager는읽기요청이들어오면버퍼를생성하고 SystemBuffer멤버에포인터를저장하며버퍼사이즈값을 pirpstack->parameters.read.length에저장합니다. 디바이스는단순히저장하고있던데이터를자신이가지고있는버퍼에카피를해주면 ReadFile() 에대한작업이완료됩니다. 여기서한가지주의할사항은 irp->iostatus.information에정확하게복사한데이터사이즈를저장해줘야한다는점입니다. 그이유는읽기요청이완료되면 I/O manager가자신이생성한버퍼에서 IoStatus.Information 에저장된사이즈만큼만유저메모리에복사를하기때문입니다. 따라서이값을 0( 혹은실제복사한데이터사이즈보다작은값 ) 으로셋팅하게되면디바이스드라이버에서복사를했다하더라도유저메모리에그데이터가정확하게저장되지않게됩니다. irp->iostatus.status = status; irp->iostatus.status 는 I/O manager가넘겨준 IRP요청이성공했는지여부를나타내는멤버입니다. 만약이값이 STATUS_SUCCESS라면 I/O manager는 ReadFile() 이나 WriteFile() 과같은유저가호출한함수에성공했다는리턴값 (0이아닌값 ) 을넘겨줄것이고그외에값을넘겨준다면실패값 (0) 을리턴할것입니다. 예를들어 IRP_MJ_WRITE 처리구문에서보여주는것처럼유저모드에서넘겨준데이터가디바이스에서할당된버퍼크기보다도크면조건문에의해 status값을 STATUS_INSUFFICIENT_RESOURCES로셋팅하고넘겨주게되고 WriteFile() 은 0을리턴하게됩니다. 이때 GetLastError() 함수를통해해당에러의원인을찾으면리소스가부족하다는메시지를얻게됩니다.( 그림 2_4 참조 ) IoCompleteRequest(irp, IO_NO_INCREMENT); IoCompleteRequest() 함수는해당 irp 처리가완료되었음을 I/O manager에게알려주는역할을수행합니다. 이함수를호출하지않으면 Hello_Dispatch() 함수를완료하더라도해당요청이완료되었음을 I/O manager나유저프로그램은알지못하고계속완료메시지를기다리게됩니다. 첫번째파라미터는어떠한 IRP의처리가완료되었는지를 I/O manager에게알려주는역할을하며두번째파라미터는해당완료메시지가처리돼야

30 할우선순위를가리킵니다.( 이것은특별한경우가아니면 IO_NO_INCREMENT로셋팅합니다. 이렇게해서 Hello Driver Ver.2에대한설명을마쳤습니다. 사실이드라이버소스에대해자세하게설명하려면 I/O manager가하는역할이나수행과정에대해좀더자세한설명이필요하고디바이스이름과 Symbolic Link Name에관련하여오브젝트관리자 (Object Manager) 라고하는또다른윈도우의구성요소에대해서도설명이필요합니다. 그외에 CreateFile(), ReadFile(), WriteFile() 과같은 API가어떻게해서드라이버와통신을할수있는지에대해서도좀더자세한설명을위해 Windows Subsystem에대한이해도필요할것입니다. 이런것들에대해서는 Inside Windows 2000에너무나잘설명이되어있으므로꼭읽어보시고그수행메커니즘이나구성에대해서이해하시고넘어가시기바랍니다. 물론다른분야의프로그래밍도마찬가지일테지만 - 디바이스드라이버프로그래밍은윈도우의수행원리에대한정확한이해가없이는공부하기가힘든분야이기때문입니다. 그럼다음번에는드라이버와 App간에통신을할수있는또다른방법인 DeviceIoControl() 에대해알아보도록하겠습니다.

<4D F736F F F696E74202D C7D4BFEEC3B6B1B3BCF6B4D4205BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D C7D4BFEEC3B6B1B3BCF6B4D4205BC8A3C8AF20B8F0B5E55D> Windows XP 에서의장치관리자 : Device Driver 에관하여 May 29, 2015. CHONBUK NATIONAL UNIVERSITY Prof. Woonchul Ham 2015-05-28 1 개요 1. 장치관리자란? 2. Device Driver 작업환경은? 3. Driver 의구조 4. Plug & Play 5. Device Driver 응용사례

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

WinDBG 실무

WinDBG 실무 하제소프트 주식회사하제소프트 (www.hajesoft.co.kr) 강사이봉석 하제소프트 과정소개 윈도우응용프로그램, 윈도우서비스프로그램, 윈도우디바이스드라이버를개발하는개발자들로하여금고급디버깅기술을제공하는 윈도우디버거 (WinDBG) 사용방법을익히게하여, 고급시스템프로그래머를양성하는데있습니다 윈도우디버거 (WinDBG) 를사용하는개발자는실무에서고급시스템프로그래머가갖추어야할중요한디버깅지식을습득함과동시에시간과비용을최대한아끼는프로그래밍습관과우수한결과물을만들어낼수있습니다

More information

Chapter #01 Subject

Chapter #01  Subject Device Driver March 24, 2004 Kim, ki-hyeon 목차 1. 인터럽트처리복습 1. 인터럽트복습 입력검출방법 인터럽트방식, 폴링 (polling) 방식 인터럽트서비스등록함수 ( 커널에등록 ) int request_irq(unsigned int irq, void(*handler)(int,void*,struct pt_regs*), unsigned

More information

슬라이드 1

슬라이드 1 -Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역

More information

Sharing Memory Between Drivers and Applications

Sharing Memory Between Drivers and Applications 본컬럼에대한모든저작권은 DevGuru에있습니다. 컬럼을타사이트등에기재및링크또는컬럼내용을인용시반드시출처를밝히셔야합니다. 컬럼들을 CD나기타매체로배포하고자할경우 DevGuru에동의를얻으셔야합니다. c DevGuru Corporation. All rights reserved 기타자세한질문사항들은웹게시판이나 support@devguru.co.kr 으로 문의하기바랍니다.

More information

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Example 3.1 Files 3.2 Source code 3.3 Exploit flow

More information

VC++ 6

VC++ 6 VC++ 6.0 툴을사용한디바이스드라이버제작방법 1. win32 App 타입으로새로운프로젝트를생성한다. 2. 메뉴에서프로젝트셋팅을선택한후다음과같이설정을해준다. A. C/C++ Tab의 general Category에서 Debug Info를 Program Database로설정한다. B. C/C++ Tab의 C++ language Category에서 Enable

More information

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수

More information

<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F494454486F6F6B696E672E687770>

<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F494454486F6F6B696E672E687770> IDT Hooking을 이용한 Simple KeyLogger 이동수 alonglog@is119.jnu.ac.kr 개 요 커널 Hooking에 관하여 공부하는 중에 IDT Hooking에 관하여 알게 되었다. 이전에 공부하 였던 SSDT Hooking과는 다른 요소가 많다. IDT Hooking을 공부하면서 컴퓨터의 인터럽트 과정을 이해할 수 있는 좋은 계기가

More information

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-2pointer.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.

More information

슬라이드 1

슬라이드 1 파일 I/O 와디렉터리컨트롤 1 목차 기본적인파일처리 파일검색 파일열기 & 닫기 파일읽기 & 쓰기 삭제, 복사, 이동 (?) 파일의시간정보얻기 파일특성정보얻기 파일포인터 directory 생성 & 삭제 경로설정 경로얻기 2 파일생성 / 열기 HANDLE CreateFile ( LPCTSTR lpfilename, DWORD dwdesiredaccess, 파일이름

More information

API 매뉴얼

API 매뉴얼 PCI-DIO12 API Programming (Rev 1.0) Windows, Windows2000, Windows NT and Windows XP are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations mentioned

More information

Sharing Memory Between Drivers and Applications

Sharing Memory Between Drivers and Applications 본컬럼에대한모든저작권은 DevGuru에있습니다. 컬럼을타사이트등에기재및링크또는컬럼내용을인용시반드시출처를밝히셔야합니다. 컬럼들을 CD나기타매체로배포하고자할경우 DevGuru에동의를얻으셔야합니다. c DevGuru Corporation. All rights reserved 기타자세한질문사항들은웹게시판이나 support@devguru.co.kr 으로 문의하기바랍니다.

More information

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures 단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 KeyPad Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착 4x4 Keypad 2 KeyPad 를제어하기위하여 FPGA 내부에 KeyPad controller 가구현 KeyPad controller 16bit 로구성된

More information

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

Microsoft Word - windows server 2003 수동설치_non pro support_.doc Windows Server 2003 수동 설치 가이드 INDEX 운영체제 설치 준비과정 1 드라이버를 위한 플로피 디스크 작성 2 드라이버를 위한 USB 메모리 작성 7 운영체제 설치 과정 14 Boot Sequence 변경 14 컨트롤러 드라이버 수동 설치 15 운영체제 설치 17 운영체제 설치 준비 과정 Windows Server 2003 에는 기본적으로

More information

11장 포인터

11장 포인터 Dynamic Memory and Linked List 1 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 int i, j; int buffer[80]; char name[] = data structure"; 처음에결정된크기보다더큰입력이들어온다면처리하지못함

More information

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,

More information

ISP and CodeVisionAVR C Compiler.hwp

ISP and CodeVisionAVR C Compiler.hwp USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler http://www.avrmall.com/ November 12, 2007 Copyright (c) 2003-2008 All Rights Reserved. USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler

More information

Microsoft PowerPoint - chap06-5 [호환 모드]

Microsoft PowerPoint - chap06-5 [호환 모드] 2011-1 학기프로그래밍입문 (1) chapter 06-5 참고자료 변수의영역과데이터의전달 박종혁 Tel: 970-6702 Email: jhpark1@seoultech.ac.kr h k 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- ehanbit.net 자동변수 지금까지하나의함수안에서선언한변수는자동변수이다. 사용범위는하나의함수내부이다. 생존기간은함수가호출되어실행되는동안이다.

More information

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P Duplicator 는기본적으로원본하드디스크를빠르게복사본하드디스크에복사하는기능을하는것입니다.. 복사본 하드디스크가원본하드디스크와똑같게하는것을목적으로하는것이어서저용량에서고용량으로복사시몇 가지문제점이발생할수있습니다. 하드디스크는사용하려면, 디스크초기화를한후에포맷을해야사용가능합니다. Windows PC는 MBR과 GPT 2 개중에 1개로초기화합니다. -Windows

More information

UI TASK & KEY EVENT

UI TASK & KEY EVENT T9 & AUTOMATA 2007. 3. 23 PLATFORM TEAM 정용학 차례 T9 개요 새로운언어 (LDB) 추가 T9 주요구조체 / 주요함수 Automata 개요 Automata 주요함수 추후세미나계획 질의응답및토의 T9 ( 2 / 30 ) T9 개요 일반적으로 cat 이라는단어를쓸려면... 기존모드 (multitap) 2,2,2, 2,8 ( 총 6번의입력

More information

Lab 3. 실습문제 (Single linked list)_해답.hwp

Lab 3. 실습문제 (Single linked list)_해답.hwp Lab 3. Singly-linked list 의구현 실험실습일시 : 2009. 3. 30. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 5. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Singly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Singly-linked list의각함수를구현한다.

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 7-Segment Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 의 M3 Module 에는 6 자리를가지는 7-Segment 모듈이아래그림처럼실장 6 Digit 7-Segment 2 6-Digit 7-Segment LED controller 16비트로구성된 2개의레지스터에의해제어 SEG_Sel_Reg(Segment

More information

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc NTAS and FRAME BUILDER Install Guide NTAS and FRAME BUILDER Version 2.5 Copyright 2003 Ari System, Inc. All Rights reserved. NTAS and FRAME BUILDER are trademarks or registered trademarks of Ari System,

More information

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include

More information

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt 변수와상수 1 변수란무엇인가? 변수 : 정보 (data) 를저장하는컴퓨터내의특정위치 ( 임시저장공간 ) 메모리, register 메모리주소 101 번지 102 번지 변수의크기에따라 주로 byte 단위 메모리 2 기본적인변수형및변수의크기 변수의크기 해당컴퓨터에서는항상일정 컴퓨터마다다를수있음 short

More information

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher( 실행할페이지.jsp); 다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp"); dispatcher.forward(request, response); - 위의예에서와같이 RequestDispatcher

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 7-Segment Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 의 M3 Module 에는 6 자리를가지는 7-Segment 모듈이아래그림처럼실장 6 Digit 7-Segment 2 6-Digit 7-Segment LED Controller 16비트로구성된 2개의레지스터에의해제어 SEG_Sel_Reg(Segment

More information

Install stm32cubemx and st-link utility

Install stm32cubemx and st-link utility STM32CubeMX and ST-LINK Utility for STM32 Development 본문서는 ST Microelectronics 의 ARM Cortex-M 시리즈 Microcontroller 개발을위해제공되는 STM32CubeMX 와 STM32 ST-LINK Utility 프로그램의설치과정을설명합니다. 본문서는 Microsoft Windows 7

More information

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - chap06-1Array.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-1 참고자료 배열 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 배열의선언과사용 같은형태의자료형이많이필요할때배열을사용하면효과적이다. 배열의선언 배열의사용 배열과반복문 배열의초기화 유연성있게배열다루기 한빛미디어

More information

ActFax 4.31 Local Privilege Escalation Exploit

ActFax 4.31 Local Privilege Escalation Exploit NSHC 2013. 05. 23 악성코드 분석 보고서 [ Ransomware 악성코드 ] 사용자의 컴퓨터를 강제로 잠그고 돈을 요구하는 형태의 공격이 기승을 부리고 있 습니다. 이러한 형태의 공격에 이용되는 악성코드는 Ransomware로 불리는 악성코 드 입니다. 한번 감염 시 치료절차가 복잡하며, 보고서 작성 시점을 기준으로 지속 적인 피해자가 발생되고

More information

6. 설치가시작되는동안 USB 드라이버가자동으로로드됩니다. USB 드라이버가성공적으로로드되면 Setup is starting( 설치가시작되는중 )... 화면이표시됩니다. 7. 화면지침에따라 Windows 7 설치를완료합니다. 방법 2: 수정된 Windows 7 ISO

6. 설치가시작되는동안 USB 드라이버가자동으로로드됩니다. USB 드라이버가성공적으로로드되면 Setup is starting( 설치가시작되는중 )... 화면이표시됩니다. 7. 화면지침에따라 Windows 7 설치를완료합니다. 방법 2: 수정된 Windows 7 ISO Windows 7 설치및 PCIE RAID 설정정보 DK173 초판 11월 2016 A. Windows 7 및 USB 드라이버설치 칩셋사양에따라 Windows 7 설치중에 USB 키보드 / 마우스를사용하려면시스템에서 USB 드라이버를사전로드해야합니다. 이절에서는 USB 드라이버사전로드방법과 Windows 7 설치방법에대해서설명합니다. 방법 1: SATA ODD

More information

JVM 메모리구조

JVM 메모리구조 조명이정도면괜찮조! 주제 JVM 메모리구조 설미라자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조장. 최지성자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조원 이용열자료조사, 자료작성, PPT 작성, 보고서작성. 이윤경 자료조사, 자료작성, PPT작성, 보고서작성. 이수은 자료조사, 자료작성, PPT작성, 보고서작성. 발표일 2013. 05.

More information

API 매뉴얼

API 매뉴얼 PCI-TC03 API Programming (Rev 1.0) Windows, Windows2000, Windows NT, Windows XP and Windows 7 are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations

More information

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - chap01-C언어개요.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을

More information

K&R2 Reference Manual 번역본

K&R2 Reference Manual 번역본 typewriter structunion struct union if-else if if else if if else if if if if else else ; auto register static extern typedef void char short int long float double signed unsigned const volatile { } struct

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 7-SEGMENT DEVICE CONTROL - DEVICE DRIVER Jo, Heeseung 디바이스드라이버구현 : 7-SEGMENT HBE-SM5-S4210 의 M3 Module 에는 6 자리를가지는 7-Segment 모듈이아래그림처럼실장 6 Digit 7-Segment 2 디바이스드라이버구현 : 7-SEGMENT 6-Digit 7-Segment LED

More information

C# Programming Guide - Types

C# Programming Guide - Types C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든

More information

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D> 뻔뻔한 AVR 프로그래밍 The Last(8 th ) Lecture 유명환 ( yoo@netplug.co.kr) INDEX 1 I 2 C 통신이야기 2 ATmega128 TWI(I 2 C) 구조분석 4 ATmega128 TWI(I 2 C) 실습 : AT24C16 1 I 2 C 통신이야기 I 2 C Inter IC Bus 어떤 IC들간에도공통적으로통할수있는 ex)

More information

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조 - Part2- 제 2 장다차원배열이란무엇인가 학습목차 2.1 다차원배열이란 2. 2 2 차원배열의주소와값의참조 2.1 다차원배열이란 2.1 다차원배열이란 (1/14) 다차원배열 : 2 차원이상의배열을의미 1 차원배열과다차원배열의비교 1 차원배열 int array [12] 행 2 차원배열 int array [4][3] 행 열 3 차원배열 int array [2][2][3]

More information

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2 제 17 장동적메모리와연결리스트 유준범 (JUNBEOM YOO) Ver. 2.0 jbyoo@konkuk.ac.kr http://dslab.konkuk.ac.kr 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다. 이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다.

More information

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F > 10주차 문자 LCD 의인터페이스회로및구동함수 Next-Generation Networks Lab. 5. 16x2 CLCD 모듈 (HY-1602H-803) 그림 11-18 19 핀설명표 11-11 번호 분류 핀이름 레벨 (V) 기능 1 V SS or GND 0 GND 전원 2 V Power DD or V CC +5 CLCD 구동전원 3 V 0 - CLCD 명암조절

More information

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp Lab 4. Circular singly-linked list 의구현 실험실습일시 : 2009. 4. 6. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 12. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Circular Singly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Circular

More information

슬라이드 1

슬라이드 1 핚국산업기술대학교 제 14 강 GUI (III) 이대현교수 학습안내 학습목표 CEGUI 라이브러리를이용하여, 게임메뉴 UI 를구현해본다. 학습내용 CEGUI 레이아웃의로딩및렌더링. OIS 와 CEGUI 의연결. CEGUI 위젯과이벤트의연동. UI 구현 : 하드코딩방식 C++ 코드를이용하여, 코드내에서직접위젯들을생성및설정 CEGUI::PushButton* resumebutton

More information

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - additional01.ppt [호환 모드] 1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능

More information

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - chap13-입출력라이브러리.pptx #include int main(void) int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; 1 학습목표 스트림의 기본 개념을 알아보고,

More information

Tablespace On-Offline 테이블스페이스 온라인/오프라인

Tablespace On-Offline 테이블스페이스 온라인/오프라인 2018/11/10 12:06 1/2 Tablespace On-Offline 테이블스페이스온라인 / 오프라인 목차 Tablespace On-Offline 테이블스페이스온라인 / 오프라인... 1 일반테이블스페이스 (TABLESPACE)... 1 일반테이블스페이스생성하기... 1 테이블스페이스조회하기... 1 테이블스페이스에데이터파일 (DATA FILE) 추가

More information

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D> 리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1

More information

Microsoft Word - Armjtag_문서1.doc

Microsoft Word - Armjtag_문서1.doc ARM JTAG (wiggler 호환 ) 사용방법 ( IAR EWARM 에서 ARM-JTAG 로 Debugging 하기 ) Test Board : AT91SAM7S256 IAR EWARM : Kickstart for ARM ARM-JTAG : ver 1.0 ( 씨링크테크 ) 1. IAR EWARM (Kickstart for ARM) 설치 2. Macraigor

More information

Chapter 4. LISTS

Chapter 4. LISTS C 언어에서리스트구현 리스트의생성 struct node { int data; struct node *link; ; struct node *ptr = NULL; ptr = (struct node *) malloc(sizeof(struct node)); Self-referential structure NULL: defined in stdio.h(k&r C) or

More information

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont 12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다. 12.1 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont( in LPDIRECT3DDEVICE9 pdevice, in INT Height, in UINT

More information

PowerPoint Presentation

PowerPoint Presentation #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을작성하면서 C 프로그램의구성요소에대하여알아본다.

More information

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100 2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack

More information

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 (   ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각 JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( http://java.sun.com/javase/6/docs/api ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각선의길이를계산하는메소드들을작성하라. 직사각형의가로와세로의길이는주어진다. 대각선의길이는 Math클래스의적절한메소드를이용하여구하라.

More information

OCW_C언어 기초

OCW_C언어 기초 초보프로그래머를위한 C 언어기초 2 장 : C 프로그램시작하기 2012 년 이은주 학습목표 을작성하면서 C 프로그램의구성요소 주석 (comment) 이란무엇인지알아보고, 주석을만드는방법 함수란무엇인지알아보고, C 프로그램에반드시필요한 main 함수 C 프로그램에서출력에사용되는 printf 함수 변수의개념과변수의값을입력받는데사용되는 scanf 함수 2 목차 프로그램코드

More information

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부 Eclipse (IDE) JDK Android SDK with ADT IDE: Integrated Development Environment JDK: Java Development Kit (Java SDK) ADT: Android Development Tools 2 JDK 설치 Eclipse

More information

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요 . 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요소로써안드로이드시스템에서는 Activities, Services, Content Providers,

More information

기초컴퓨터프로그래밍

기초컴퓨터프로그래밍 구조체 #include int main() { } printf("structure\n"); printf("instructor: Keon Myung Lee\n"); return 0; 내용 구조체 (struct) Typedef 공용체 (union) 열거형 (enum) 구조체 구조체 (structure) 어떤대상을표현하는서로연관된항목 ( 변수 )

More information

<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F F6F6B696E672E687770>

<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F F6F6B696E672E687770> SSDT HOOKING을이용한프로세스와파일숨기기 이동수 alonglog@is119.jnu.ac.kr 개 요 기존에만들었던메시지후킹프로그램을숨겨보고싶어서 SSDT후킹을공부하였다. 그리고그결과를정리하여이문서를작성하였다. 프로세스를숨기고파일을숨기기위해서 Native API를후킹했다. 메시지후킹과다르게 SSDT후킹은커널모드에서후킹을해야하므로디바이스드라이버로프로그램이작성되어있다.

More information

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - ch07 - 포인터 pm0415 2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자

More information

Frama-C/JESSIS 사용법 소개

Frama-C/JESSIS 사용법 소개 Frama-C 프로그램검증시스템소개 박종현 @ POSTECH PL Frama-C? C 프로그램대상정적분석도구 플러그인구조 JESSIE Wp Aorai Frama-C 커널 2 ROSAEC 2011 동계워크샵 @ 통영 JESSIE? Frama-C 연역검증플러그인 프로그램분석 검증조건추출 증명 Hoare 논리에기초한프로그램검증도구 사용법 $ frama-c jessie

More information

Microsoft Word - [Windows Hook] 6.HideProcess.doc

Microsoft Word - [Windows Hook] 6.HideProcess.doc Hide Process Last Update : 2007 년 6 월 11 일 Written by Jerald Lee Contact Me : lucid78@gmail.com 본문서는 SSDT Hook을이용한프로세스를감추는기술에대해정리한것입니다. 제가알고있는지식이너무짧아가급적이면다음에언제보아도쉽게이해할수있도록쓸려고노력하였습니다. 기존에나와있는여러훌륭한문서들을토대로짜집기의형태로작성되었으며기술하지못한원문저자들에게매우죄송할따름입니다.

More information

UI TASK & KEY EVENT

UI TASK & KEY EVENT 2007. 2. 5 PLATFORM TEAM 정용학 차례 CONTAINER & WIDGET SPECIAL WIDGET 질의응답및토의 2 Container LCD에보여지는화면한개 1개이상의 Widget을가짐 3 Container 초기화과정 ui_init UMP_F_CONTAINERMGR_Initialize UMP_H_CONTAINERMGR_Initialize

More information

PowerPoint Template

PowerPoint Template JavaScript 회원정보 입력양식만들기 HTML & JavaScript Contents 1. Form 객체 2. 일반적인입력양식 3. 선택입력양식 4. 회원정보입력양식만들기 2 Form 객체 Form 객체 입력양식의틀이되는 태그에접근할수있도록지원 Document 객체의하위에위치 속성들은모두 태그의속성들의정보에관련된것

More information

11장 포인터

11장 포인터 누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리

More information

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습니다. 여러분모두 Windows 에서 hex editor(hex dump, hex viewer) 라는것을사용해보셨을겁니다. 바로바이너리파일을 16 진수

More information

chap 5: Trees

chap 5: Trees 5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경

More information

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770> 연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.

More information

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Microsoft PowerPoint - chap03-변수와데이터형.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num %d\n", num); return 0; } 1 학습목표 의 개념에 대해 알아본다.

More information

<C1A4C8B8BFF8C6F2B0A15FB1E2BCFAB9AEBCAD5F444B4F4D5FC0CCB5BFBCF62E687770>

<C1A4C8B8BFF8C6F2B0A15FB1E2BCFAB9AEBCAD5F444B4F4D5FC0CCB5BFBCF62E687770> DKOM을이용한은닉기법 이동수 alonglog@is119.jnu.ac.kr 개 요 유저모드에서프로세스나디바이스드라이버등을확인할수없도록만드는기법중하나가커널 Hooking과 DKOM 기법이있다. DKOM 기법은 Hooking과다르게커널개체를직접변경한다. 이는 Hooking보다훨씬강력하고탐지가힘들다. 이문서에서는 DKOM에대해서다룰것이다. DKOM 기법을통해다양한효과를얻을수있다.

More information

HLS(HTTP Live Streaming) 이용가이드 1. HLS 소개 Apple iphone, ipad, ipod의운영체제인 ios에서사용하는표준 HTTP 기반스트리밍프로토콜입니다. 2. HLS 지원대상 - 디바이스 : iphone/ipad/ipod - 운영체제 :

HLS(HTTP Live Streaming) 이용가이드 1. HLS 소개 Apple iphone, ipad, ipod의운영체제인 ios에서사용하는표준 HTTP 기반스트리밍프로토콜입니다. 2. HLS 지원대상 - 디바이스 : iphone/ipad/ipod - 운영체제 : HLS(HTTP Live Streaming) 이용가이드 1. HLS 소개 Apple iphone, ipad, ipod의운영체제인 ios에서사용하는표준 HTTP 기반스트리밍프로토콜입니다. 2. HLS 지원대상 - 디바이스 : iphone/ipad/ipod - 운영체제 : ios 3.0 이상 - 콘텐츠형식 : MP4 (H264,AAC ), MP3 * 디바이스별해상도,

More information

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을 (structures) 구조체정의 구조체선언및초기화 구조체배열 구조체포인터 구조체배열과포인터 구조체와함수 중첩된구조체 구조체동적할당 공용체 (union) 1 구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Web server porting 2 Jo, Heeseung Web 을이용한 LED 제어 Web 을이용한 LED 제어프로그램 web 에서데이터를전송받아타겟보드의 LED 를조작하는프로그램을작성하기위해다음과같은소스파일을생성 2 Web 을이용한 LED 제어 LED 제어프로그램작성 8bitled.html 파일을작성 root@ubuntu:/working/web# vi

More information

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning C Programming Practice (II) Contents 배열 문자와문자열 구조체 포인터와메모리관리 구조체 2/17 배열 (Array) (1/2) 배열 동일한자료형을가지고있으며같은이름으로참조되는변수들의집합 배열의크기는반드시상수이어야한다. type var_name[size]; 예 ) int myarray[5] 배열의원소는원소의번호를 0 부터시작하는색인을사용

More information

untitled

untitled int i = 10; char c = 69; float f = 12.3; int i = 10; char c = 69; float f = 12.3; printf("i : %u\n", &i); // i printf("c : %u\n", &c); // c printf("f : %u\n", &f); // f return 0; i : 1245024 c : 1245015

More information

WinDBG 실무

WinDBG 실무 주식회사하제소프트 (www.hajesoft.co.kr) 강사이봉석 과정소개 윈도우응용프로그램, 윈도우서비스프로그램, 윈도우디바이스드라이버를개발하는개발자들로하여금고급디버깅기술을제공하는 윈도우디버거 (WinDBG) 사용방법을익히게하여, 고급시스템프로그래머를양성하는데있습니다 윈도우디버거 (WinDBG) 를사용하는개발자는실무에서고급시스템프로그래머가갖추어야할중요한디버깅지식을습득함과동시에시간과비용을최대한아끼는프로그래밍습관과우수한결과물을만들어낼수있습니다

More information

Microsoft Word doc

Microsoft Word doc 2. 디바이스드라이버 [ DIO ] 2.1. 개요 타겟보드의데이터버스를이용하여 LED 및스위치동작을제어하는방법을설명하겠다. 2.2. 회로도 2.3. 준비조건 ARM 용크로스컴파일러가설치되어있어야한다. 하드웨어적인점검을하여정상적인동작을한다고가정한다. NFS(Network File System) 를사용할경우에는 NFS가마운트되어있어야한다. 여기서는소스전문을포함하지않았다.

More information

Windows 8에서 BioStar 1 설치하기

Windows 8에서 BioStar 1 설치하기 / 콘텐츠 테이블... PC에 BioStar 1 설치 방법... Microsoft SQL Server 2012 Express 설치하기... Running SQL 2012 Express Studio... DBSetup.exe 설정하기... BioStar 서버와 클라이언트 시작하기... 1 1 2 2 6 7 1/11 BioStar 1, Windows 8 BioStar

More information

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - chap11-포인터의활용.pptx #include int main(void) int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; 1 학습목표 포인터를 사용하는 다양한 방법에

More information

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

Microsoft PowerPoint - 09-CE-5-윈도우 핸들 순천향대학교컴퓨터학부이상정 1 학습내용 윈도우핸들 윈도우찿기 윈도우확인및제거 윈도우숨기기 윈도우포커스 윈도우텍스트 윈도우핸들 순천향대학교컴퓨터학부이상정 3 핸들 (handle) 윈도우에서구체적인어떤대상을구분하기위해지정되는고유의번호 32비트의정수값 핸들은운영체제가발급하고사용자가이값을사용 실제값이무엇인지는몰라도상관없음 윈도우, DC, 브러쉬등등 순천향대학교컴퓨터학부이상정

More information

슬라이드 1

슬라이드 1 정적메모리할당 (Static memory allocation) 일반적으로프로그램의실행에필요한메모리 ( 변수, 배열, 객체등 ) 는컴파일과정에서결정되고, 실행파일이메모리에로드될때할당되며, 종료후에반환됨 동적메모리할당 (Dynamic memory allocation) 프로그램의실행중에필요한메모리를할당받아사용하고, 사용이끝나면반환함 - 메모리를프로그램이직접관리해야함

More information

게시판 스팸 실시간 차단 시스템

게시판 스팸 실시간 차단 시스템 오픈 API 2014. 11-1 - 목 차 1. 스팸지수측정요청프로토콜 3 1.1 스팸지수측정요청프로토콜개요 3 1.2 스팸지수측정요청방법 3 2. 게시판스팸차단도구오픈 API 활용 5 2.1 PHP 5 2.1.1 차단도구오픈 API 적용방법 5 2.1.2 차단도구오픈 API 스팸지수측정요청 5 2.1.3 차단도구오픈 API 스팸지수측정결과값 5 2.2 JSP

More information

adfasdfasfdasfasfadf

adfasdfasfdasfasfadf C 4.5 Source code Pt.3 ISL / 강한솔 2019-04-10 Index Tree structure Build.h Tree.h St-thresh.h 2 Tree structure *Concpets : Node, Branch, Leaf, Subtree, Attribute, Attribute Value, Class Play, Don't Play.

More information

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

var answer = confirm( 확인이나취소를누르세요.); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write( 확인을눌렀습니다.); else { document.write( 취소를눌렀습니다.); 자바스크립트 (JavaScript) - HTML 은사용자에게인터페이스 (interface) 를제공하는언어 - 자바스크립트는서버로데이터를전송하지않고서할수있는데이터처리를수행한다. - 자바스크립트는 HTML 나 JSP 에서작성할수있고 ( 내부스크립트 ), 별도의파일로도작성이가능하다 ( 외 부스크립트 ). - 내부스크립트 - 외부스크립트

More information

Microsoft PowerPoint - es-arduino-lecture-03

Microsoft PowerPoint - es-arduino-lecture-03 임베디드시스템개론 : Arduino 활용 Lecture #3: Button Input & FND Control 2012. 3. 25 by 김영주 강의목차 디지털입력 Button switch 입력 Button Debounce 7-Segment FND : 직접제어 7-Segment FND : IC 제어 2 디지털입력 : Switch 입력 (1) 실습목표 아두이노디지털입력처리실습

More information

Microsoft Word - LKP-RTD 사용자 설명서

Microsoft Word - LKP-RTD 사용자 설명서 LKP-RTD 보드 사용자설명서 Version Information H/W Version : Version 1.0 소속 : ( 주 ) 엘케이일레븐연구소주소 : 성남시중원구상대원동 190-1 SKn테크노파크메가센터 1306호전화 : 031-776-4120 / FAX : 031-766-4119 목차 1. 개요... 5 2. 사양... 6 3. 블록도... 7 4.

More information

슬라이드 1

슬라이드 1 마이크로컨트롤러 2 (MicroController2) 2 강 ATmega128 의 external interrupt 이귀형교수님 학습목표 interrupt 란무엇인가? 기본개념을알아본다. interrupt 중에서가장사용하기쉬운 external interrupt 의사용방법을학습한다. 1. Interrupt 는왜필요할까? 함수동작을추가하여실행시키려면? //***

More information

UI TASK & KEY EVENT

UI TASK & KEY EVENT KEY EVENT & STATE 구현 2007. 1. 25 PLATFORM TEAM 정용학 차례 Key Event HS TASK UI TASK LONG KEY STATE 구현 소스코드및실행화면 질의응답및토의 2 KEY EVENT - HS TASK hs_task keypad_scan_keypad hs_init keypad_pass_key_code keypad_init

More information

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070> 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include "QuickSort.h" 7 using namespace std; 8 9 10 Node* Queue[100]; // 추가입력된데이터를저장하기위한 Queue

More information

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE> 쉽게풀어쓴 C 언어 Express 제 17 장동적메모리와연결리스트 이번장에서학습할내용 동적메모리할당의이해 동적메모리할당관련함수 연결리스트 동적메모리할당에대한개념을이해하고응용으로연결리스트를학습합니다. 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것

More information

03_queue

03_queue Queue Data Structures and Algorithms 목차 큐의이해와 ADT 정의 큐의배열기반구현 큐의연결리스트기반구현 큐의활용 덱 (Deque) 의이해와구현 Data Structures and Algorithms 2 큐의이해와 ADT 정의 Data Structures and Algorithms 3 큐 (Stack) 의이해와 ADT 정의 큐는 LIFO(Last-in,

More information

vi 사용법

vi 사용법 네트워크프로그래밍 6 장과제샘플코드 - 1:1 채팅 (udp 버전 ) 과제 서버에서먼저 bind 하고그포트를다른사람에게알려줄것 클라이언트에서알려준포트로접속 서로간에키보드입력을받아상대방에게메시지전송 2 Makefile 1 SRC_DIR =../../common 2 COM_OBJS = $(SRC_DIR)/addressUtility.o $(SRC_DIR)/dieWithMessage.o

More information

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2 제 8 장. 포인터 목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2 포인터의개요 포인터란? 주소를변수로다루기위한주소변수 메모리의기억공간을변수로써사용하는것 포인터변수란데이터변수가저장되는주소의값을 변수로취급하기위한변수 C 3 포인터의개요 포인터변수및초기화 * 변수데이터의데이터형과같은데이터형을포인터 변수의데이터형으로선언 일반변수와포인터변수를구별하기위해

More information

슬라이드 1

슬라이드 1 / 유닉스시스템개요 / 파일 / 프로세스 01 File Descriptor file file descriptor file type unix 에서의파일은단지바이트들의나열임 operating system 은파일에어떤포맷도부과하지않음 파일의내용은바이트단위로주소를줄수있음 file descriptor 는 0 이나양수임 file 은 open 이나 creat 로 file

More information

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우. 소프트웨어매뉴얼 윈도우드라이버 Rev. 3.03 SLP-TX220 / TX223 SLP-TX420 / TX423 SLP-TX400 / TX403 SLP-DX220 / DX223 SLP-DX420 / DX423 SLP-DL410 / DL413 SLP-T400 / T403 SLP-T400R / T403R SLP-D220 / D223 SLP-D420 / D423

More information

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부 개발환경구조및설치순서 JDK 설치 Eclipse 설치 안드로이드 SDK 설치 ADT(Androd Development Tools) 설치 AVD(Android Virtual Device) 생성 Hello Android! 2 Eclipse (IDE) JDK Android SDK with

More information