반응형

DeviceObject 삭제

 

1.  Driver 서비스 시작 시(StartService호출) ERROR_FILE_NOT_FOUND(0x2)가 발생하는 경우
** 드라이버 서비스 생성시 드라이버 파일 경로를 잘못 설정한 경우는 논외로 함

(1) 현상

1) 재 부팅 후 1회에 한해 StartService 호출이 성공함

2) 서비스 중지 후 다시 서비스를 실행할 경우, ERROR_FILE_NOT_FOUND 에러가 발생함

(2) 원인

1) IoCreateDevice를 통해 생성한 DeviceObject를 드라이버 Unload시 삭제하지 않은 경우 발생한다.

(3) 결론

1) IoCreateDevice를 통해 생성한 DeviceObject는 드라이버 Unload 시점에서 IoDeleteDevice를 호출하여 반드시 삭제 해야함

WDM Driver

u DriverObject->MajorFunction[IRP_MJ_PNP]에 등록한 함수에서 IRP_MN_REMOVE_DEVICE Irp를 받았을 때 삭제

Nt Driver

u DriverObject->DriverUnload에 등록한 함수에서 삭제

u DeviceObject삭제를 위해, DriverEntry에서 해당 포인터를 저장해 놓아야 한다??

 

 

반응형

'Windows Programming > 드라이버' 카테고리의 다른 글

WDK는 VC6.0에서 빌드되지 않는다.  (0) 2008.07.24
Filter-Hook Driver  (0) 2008.07.21
Network Driver의 종류  (0) 2008.07.21
데이타 버퍼 어드레싱  (0) 2008.06.11
Device Object naming  (0) 2008.05.30
반응형

데이타 버퍼 어드레싱

 

n 커널 드라이버는 대부분의 경우 User-Mode 가상 어드레스를 사용하는 메모리에 직접 접근하지 않는다. MS 윈도우즈 NT는 사용자 모드 데이타 버퍼에 접근할 수 있는 3가지 방법을 제공한다.

 

u  Buffered 메소드

ü  I/O 매니저는 User-Mode 데이터 버퍼의 크기와 같은 시스템 버퍼를 만든다. 여러분의 드라이버는 이 시스템 버퍼를 통해 작업할 수 있으며, I/O매니저는 User-Mode 버퍼와 System 버퍼 사이의 데이타를 복사한다.

ü   I/O 매니저가 IRP_MJ_READ 또는 IRP_MJ_WRITE 요청을 만들때 I/O매니저는 새로운 IRP에서 데이터 버퍼를 어떻게 설명하는지를 결정하기 위한 Direct Bufferd 플래그를 조사한다. DO_BUFFERED_IO가 설정되어 있으면 I/O매니저는 사용자 버퍼와 같은 크기의 NonPaged메모리를 할당한다.

ü  메소드 기술

NTSTATUS AddDevice(...)

{

PDEVICE_OBJECT fdo;

IoCreateDevice(..., fdo);

fdo->Flags |= DO_BUFFERED_IO

}

ü  IRP구조체 내의 관련 필드

     Irp->AssociatedIrp.SystemBuffer

ü  IO_STACK_LOCATION 구조체 내의 관련 필드

     READ 요청: stack->Parameters.Read.Length

     WRITE 요청: stact->Parameters.Write.Length

 

u   Direct 메소드

ü  I/O 매니저는 사용자 모드 버퍼를 포함하는 물리적 페이지를 잠그고 잠긴 페이지들을 설명하기 위한 MDL(Memory Descripter List)라고 불리는 보조 데이터 구조체를 생성한다. 여러분은 MDL을 이용하여 작업할 수 있다.

ü  디바이스 객체에 DO_DIRECT_IO 플래그가 설정되어 있다면 I/O매니저는 사용자 모드 데이터버퍼를 포함하는 Locked Page를 설명하는 MDL을 생성한다.

ü  메소드 기술

NTSTATUS AddDevice(...)

{

 PDEVICE_OBJECT fdo;

 IoCreateDevice(..., fdo);

 fdo->Flags |= DO_DIRECT_IO

}

ü  IRP 구조체 내의 관련 필드

     Irp->MdlAddress

ü  메모리를 엑세스하기 위해 MDL 구조체를 직접사용하지는 않으며, 대신 매크로와 서포트 함수를 이용한다.

매크로 또는 함수

IoAllocateMdl

IoBuildPartialMdl

IoFreeMdl

MmBuildMdlForNonPagedPool

MmGetMdlByteCount

MmGetMdlByteOffset

MmGetMdlVirtualAddress

MmGetPhysicalAddress

MmGetSystemAddressForMdl

MmGetSystemAddressForMdlSafe

MmInitializeMdl

MmPrepareMdlForReuse

MmProbeAndLockPages

MmSizeOfMdl

MmUnlockPages

 

u  Neither 메소드

ü  I/O매니저는 단순히 사용자 모드 가상 어드레스를 여러분에게 보낸다. 여러분은 사용자 모드 어드레스와 함께 매우 조심스럽게 작업할 수 있다.

ü  디바이스 객체에 DO_DIRECT_IO 플래그가 설정되어 있다면 I/O매니저는 사용자 모드 데이터버퍼를 포함하는 Locked Page를 설명하는 MDL을 생성한다.

ü  메소드 기술

NTSTATUS AddDevice(...)

{

 PDEVICE_OBJECT fdo;

 IoCreateDevice(..., fdo);

 fdo->Flags |= 0

}

ü  IRP 구조체 내의 관련 필드

     Irp->UserBuffer

ü  IO_STACK_LOCATION 구조체 내의 관련 필드

     stack->Parameters.Read.Length

     stack->Parameters.Write.Length

 

 

반응형

'Windows Programming > 드라이버' 카테고리의 다른 글

WDK는 VC6.0에서 빌드되지 않는다.  (0) 2008.07.24
Filter-Hook Driver  (0) 2008.07.21
Network Driver의 종류  (0) 2008.07.21
DeviceObject 삭제  (1) 2008.06.20
Device Object naming  (0) 2008.05.30
반응형

Device Object naming

 

1. Device Object naming이 필요한 이유

(1) 다른 커널모드 컴포넌트들이 IoGetDeviceObjectPointer()같은 서비스함수 호출을 통해 디바이스를 찾을 수 있게한다.

(2) User-Mode 프로그램이 해당 Device 핸들를 Open할 수 있게 한다

 

2. Device naming 방법

(1) Symbolic Link 생성

PDEVICE_OBJECT  pDeviceObject = NULL;

NTSTATUS                        status = STATUS_SUCCESS;

UNICODE_STRING strNtDeviceName;

UNICODE_STRING strDosDeviceName;

...

 

// Init NtDeviceName

RtlInitUnicodeString( &strNtDeviceName, NT_DEVICE_NAME );

 

// Create Device

status = IoCreateDevice( DriverObject,

                                       0,

                                       &strNtDeviceName,

                                       FILE_DEVICE_UNKNOWN,

                                       0,

                                       FALSE,

                                       &pDeviceObject

                                       );

if ( !NT_SUCCESS( status ) )

{

             return STATUS_SUCCESS;

}

 

// Init SymbolicLink Name

RtlInitUnicodeString( &strDosDeviceName, DOS_DEVICE_NAME );

 

// Create SymbolicLink

status = IoCreateSymbolicLink( &strDosDeviceName, &strNtDeviceName );

if ( !NT_SUCCESS( status ) )

{

            IoDeleteSymbolicLink(&strDosDeviceName);

            IoDeleteDevice(g_pDeviceObject);

 

            return status;

}

 

(2) Device Interface 생성

NTSTATUS                          status;

PDEVICE_OBJECT    fdo;

 

// Create out Functional Device Object in fdo

status = IoCreateDevice( DriverObject

                                        , sizeof( MYWDM_DEVICE_EXTENSION )

                                        , NULL // No Name

                                        , FILE_DEVICE_UNKNOWN

                                        , 0

                                        , FALSE //Not exclusive

                                        , &fdo

                                        );

 

if ( !NT_SUCCESS( status ) )

{

             return status;

}

 

// Register and enable our device interface

status = IoRegisterDeviceInterface( pdo, &GUID_DEVINTERFACE, NULL, & ifSymLinkName );

if( !NT_SUCCESS( status ) )

{

             IoDeleteDevice( fdo );

 

             return status;

}

 

IoSetDeviceInterfaceState( &dx->ifSymLinkName, TRUE );

 

...          

 

 

 

 

반응형

'Windows Programming > 드라이버' 카테고리의 다른 글

WDK는 VC6.0에서 빌드되지 않는다.  (0) 2008.07.24
Filter-Hook Driver  (0) 2008.07.21
Network Driver의 종류  (0) 2008.07.21
DeviceObject 삭제  (1) 2008.06.20
데이타 버퍼 어드레싱  (0) 2008.06.11
반응형

VMware를 이용한 원격 디버깅 설정

1. VMware시리얼 포트 추가

    (1) VMware [Edit virtual machine settings] 클릭합니다.

사용자 삽입 이미지

(2) [Add...] 버튼을 클릭합니다.

사용자 삽입 이미지

(3) [Serial Port] 선택 후 계속진행합니다.

사용자 삽입 이미지

(4) [Output to named pipe] 선택 후 계속진행합니다.

사용자 삽입 이미지

(5) Named pipe 이름을 설정합니다.
1) Named pipe 이름 형식은 \\.\pipe\임의지정 형태입니다.

사용자 삽입 이미지

(6) Serial 포트가 추가되었습니다

사용자 삽입 이미지

2. Debugee( VMware내의 OS ) 설정

(1) C드라이브의 boot.ini 파일에 다음 내용을 추가합니다.
아래의 내용은 디버깅 모드와 일반모드의 멀티 부팅을 지원합니다.

[boot loader]

timeout=10

default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

[operating systems]

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /debugport=COM1 /baudrate=115200

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect

(2) 실제 적용한 내용은 아래와 같습니다.

사용자 삽입 이미지

(3) VMware내의 OS를 부팅하면 아래와 같이 표시됩니다.
[
디버거 사용 가능]을 선택하여 부팅하면 디버깅이 가능합니다

사용자 삽입 이미지
   (4) Windows Vista의 경우, boot.ini파일이 존재하지 않습니다.
  
디버깅 설정을 위해, bcdedit.exe 유틸리티를 사용해야 합니다.
  Command 창에서 다음과 같이 입력합니다.
  1) Serial
포트를 이용하는 경우
     c:\> bcdedit /debug on
     c:\> bcdedit /dbgsettings serial debugport:1 baudrate:115200
  2) IEEE 1394
를 이용하는 경우
     c:\> bcdedit /dbgsettings 1394 channel:23


 


3. WinDBG 설정

     (1) WinDBG 바로가기 파일을 원하는 위치에 복사합니다.

사용자 삽입 이미지

(2) 복사된 바로가기 파일을 오른쪽 마우스 클릭한 후 [속성]메뉴를 선택합니다

(3) [대상] 항목을 다음과 같이 설정합니다.

"C:\Program Files\Debugging Tools for Windows\windbg.exe" -k com:port=\\.\pipe\com_dbg,baud=115200,pipe,reconnect

1) 빨간색으로 표시된 com_dbg 부분은 1.(5)에서 설정한 이름을 적어 줍니다.

사용자 삽입 이미지

4. 디버기(Debugee)와의 연결
(1) 3.에서 설정한 바로가기를 실행합니다.


사용자 삽입 이미지

(2) VMware내의 OS를 구동하면 OS가 부팅되면 다음과 같이 WinDBG와 연결됩니다.

사용자 삽입 이미지

(3) Ctrl+Break를 누르면 다음과 같이 디버깅 모드로 전환 됩니다.

사용자 삽입 이미지

5. OS 심볼 설정

    (1) WinDBG [File>Symbol File Path]메뉴를 선택합니다.

사용자 삽입 이미지

(2) 다음과 같이 심볼파일 경로를 설정하면 OS의 심볼을 로드할 수 있습니다.

srv*c:\symbols.pub*http://msdl.microsoft.com/download/symbols;

사용자 삽입 이미지
   


반응형
반응형

COM 모듈만으로 COM 사용하기

 

모듈에 대한 설명 없이 달랑 COM Dll만을 전달 받은 상황. .

 

물론 COM모듈만으로도 사용 가능할 수 있게 하기를 모토로 한다고는 하지만 간단한 인터페이스 설명조차 없이 너무한 거 아니요?

 

암튼 위의 상황에서 삽질하며 알게 된 COM사용 방법에 대해 기술하겠습니다.

 

아래에 기술되는 방법은 제가 테스트를 통해 정상적으로 사용이 가능함을 확인했지만, COM에 대한 소양이 부족한지라, 오류의 가능성이 있을 수 있음을 미리 밝혀둡니다.

 

n  idl 파일 추출하기

     Visual studio도구의 OLE View나 실행>oleview를 실행해서 oleviewer를 실행시킨다.

     2. File>View TypeLib메뉴를 선택해 해당 COM dll혹은 COM exe Open한다.

     디스플레이되는 정보에서 Root로 표시되는 XXX(xxx x.x Type Library)를 클릭하면 오른쪽 윈도우에 idl파일을 생성해서 보여준다.

     해당 내용을 xxx.idl로 저장한다.

 

n  tlb 파일 생성하기

n  방법 1

ü  Win32 Dynamic Linked Library프로젝트 생성해 빈프로젝트를 만든다.

ü  위에서 생성한 idl파일을 프로젝트에 포함한 후 Build하면 *.tlb파일이 생성된다.
( VC++
[ Project>setting>mi] 탭에 MkTypLib commpatible 항목이 체크되어 있어야 한다.

n  방법 2

ü  명령프롬프트 창에서 다음과 같이 입력해 tlb파일을 생성한다.
C:\>midl /mktyplib203 xxx.idl

 

n  tlb파일 import

n  방법 1

ü  #import "xxx.tlb"를 추가 후 컴파일하면 xxx.tlh파일이 생성된다.
xxx.tlh
파일을 열어보면, namespace CLSID, IID등의 정의 부분이 존재한다.

ü  최종적으로,

#import "xxx.tlb" named_guids

using namespace XXXX;

를 코드에 삽입한 후 사용하면 된다.

n  방법2 - MFC를 이용하는 경우

ü  Ctrl+w를 눌러 클래스 위자드를 실행시킨후, New Class버튼을 눌러 From TypeLib를 선택한다.

ü  위에서 생성된 tlb파일을 선택하면, 해당 COM모듈을 사용할 수 있는 wrapper class를 자동으로 생성해 준다

 

반응형

'Windows Programming' 카테고리의 다른 글

Windows Mobile 전원 상태 감시  (0) 2008.08.12
듀얼 모니터에서의 좌표값 확인  (1) 2008.07.04
Afx의 의미  (0) 2008.04.14
스크린 크기 구하기  (0) 2008.04.02
[MFC] Windows Control 제어  (0) 2008.03.31
반응형

1.1 생성패턴: Abstract Factory(Kit)

 

n  의도

ü  구체적 클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 제공한다.

 

n  활용성

ü  생성되고 구성되고 표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때

ü  하나 이상의 제품군들 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체할 수 있을 때

ü  관련된 객체군을 함께 사용해서 시스템을 설계하고, 이 제품이 갖는 제약 사항을 따라야 할 때

ü  제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 표현하고 싶을 때

 

n  장점

ü  (+) 구체적 클래스를 분리한다.

ü  (+) 제품 군을 쉽게 대체할 수 있도록 한다.

ü  (+) 제품간의 일관성을 증진한다.

 

n  단점

ü  (-) 새로운 종류의 제품을 제공하기 어렵다

 

n  구현

ü  Factory Singleton으로 정의한다.

ü  제품을 생성한다.

ü  확장가능한 Factory들을 정의한다.

반응형

'개발일반' 카테고리의 다른 글

GitHub private Repository 무료 사용가능  (0) 2019.02.20
DoD 5220.22-M 삭제알고리즘  (0) 2011.10.13
1. 생성패턴  (0) 2008.04.14
디자인패턴(Design Patterns)  (0) 2008.04.14

+ Recent posts