반응형

IE 관련 Registry

 

[ HTTP USER-AGENT 태그 ]

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent\Post Platform


[ 설치된 ActiveX 컨트롤 관련 정보 ]

HKLM\SOFTWARE\Microsoft\Code Store Database\Distribution Units


[ 영역별 설정 정보 저장위치]

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones

[0] – Computer(내컴퓨터)
[1] - Local intranet(
로컬 인트라넷
)
[2] - Trusted sites(
신뢰할 수 있는 사이트
)
[3] – Internet(
인터넷
)
[4] - Restricted sites(
제한된 사이트
)


[ 보호모드 해제(인터넷 영역)]

HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3]

보호모드 해제 - "2500" = dword:00000003

 

반응형
반응형

듀얼 모니터에서의 좌표값 확인

 

듀얼모니터를 사용하는 경우 윈도우나 마우스의 좌표가 음수(-)값이 나올 수 있다.
디스플레이 설정에서 우측의 모니터를 Primary모니터로 잡는 경우, 우측 모니터의 좌 상단이 (0,0)좌표가 되며, 왼쪽 모니터의 X좌표는 음수 값을 갖게 된다.

마우스나 윈도우의 좌표를 LPARAM의 전달하는 메시지의 경우,
보통 HIWORD(lParam), LOWORD(lParam)를 사용해서 좌표를 파싱하게 되는데

HIWORD()
LOWORD() 매크로의 경우, WORD값 즉 양수만을 리턴 하므로 정상적인 좌표가 계산되지 않는다.

이경우,

HIWORD() 대신 GET_X_LPARAM()
LOWORD() 대신 GET_Y_LPARAM()

을 사용하면 정상적인 좌표값을 얻울 수 있다.

 

GET_X_LPARAM()GET_Y_LPARAM()은 다음과 같이 정의 되어 있으며, <windowsx.h>에 정의되어 있다.

#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp) ((int)(short
)HIWORD(lp))

참고로 HIWORD() LOWORD()의 정의는 다음과 같다

#define HIWORD(l) ((WORD) (((DWORD) (l) >> 16) & 0xFFFF))
#define LOWORD(l) ((WORD) (l))

참고 페이지
http://msdn.microsoft.com/en-us/library/ms534600(VS.85).aspx

 

 

반응형

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

[Win32] Windows Message – Control 제어  (0) 2009.06.02
Windows Mobile 전원 상태 감시  (0) 2008.08.12
COM DLL만으로 tlb파일 생성및 COM사용하기  (0) 2008.04.28
Afx의 의미  (0) 2008.04.14
스크린 크기 구하기  (0) 2008.04.02
반응형

XP Firewall을 관장하는 서비스

 

n  서비스 관리자를 통해 서비스 목록을 살펴보면 'Windows Firewall/Internet Connection Sharing(ICS)'라는 서비스가 존재하며 이 서비스가 Firewall을 관장하는 서비스로 추측된다.

n  근거는 다음과 같다.

1) 서비스 항목의 설명
  
네트워크 주소 변환, 주소 지정, 이름 확인 및/또는 홈 네트워크나 소규모 네트워크에의 침입을 방지
  
하는 서비스를 공급합니다.

 

2) 해당 서비스를 중지하면, 방화벽 해제 프로세스(Windows 보안경고 창)가 팝업 되지 않는다.



사용자 삽입 이미지

반응형
반응형

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

+ Recent posts