메뉴 건너뛰기

그외 개발정보


안녕하세요....

키보드 에뮬을 만들고 있는데 잘 돼지 않아서 이렇게 문의 올립니다.

제가 드라이버 호출을 하는 부분입니다.

schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (!schSCManager)

{

return TRUE;

}

GetCurrentDirectory( 255, Path );

strcpy( Path + strlen(Path), FILENAME );

schService = CreateService(schSCManager,

SRVNAME,

SRVNAME,

SERVICE_ALL_ACCESS,

SERVICE_KERNEL_DRIVER,

SERVICE_DEMAND_START,

SERVICE_ERROR_NORMAL,

Path,

NULL,

NULL,

NULL,

NULL,

NULL);

if (schService == NULL)

{

schService = OpenService(schSCManager, SRVNAME, SERVICE_ALL_ACCESS );

if (schService == NULL)

{

CloseServiceHandle(schSCManager);

return FALSE;

}

StartService(schService, 0, NULL );

CloseServiceHandle(schService);

CloseServiceHandle(schSCManager);

}

else

{

StartService(schService, 0, NULL );

CloseServiceHandle(schService);

CloseServiceHandle(schSCManager);

}

// Driver를 Open 한다.

handle = CreateFile( CFILENAME,

GENERIC_READorGENERIC_WRITE,

FILE_SHARE_READorFILE_SHARE_WRITE,

0,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

0 );

if ( handle != INVALID_HANDLE_VALUE )

{

printf("File Open Succeed!!!\n");

USHORT keyStatus=0;

DeviceIoControl(handle, IOCTL_DEVGURU_KEYSTATUS, NULL, 0, &keyStatus, sizeof(keyStatus), &dwRet, 0);

CloseHandle(handle);

}

위의 호출에서 DeviceConrol부분에서 호출 되는 것은 확인을 했습니다.

이부분은 갑을 읽어 오는 부분인데 디바이스에 값을 입력하려면 어케 하는지 난감하군요...

정확하게 어디에 넣어야 할지...

USHORT KeyBoardStatus()

/*++

Routine Description:

KeyBoard의 토글키.. 상태를 얻어오는 루틴.

Arguments:

Return Value:

KeyStatus

KEYBOARD_CAPS_LOCK_ON 4

KEYBOARD_NUM_LOCK_ON 2

KEYBOARD_SCROLL_LOCK_ON 1

--*/

{

// ULONG dwType;

USHORT keyStatus;

PIRP irp;

IO_STATUS_BLOCK ioStatus;

NTSTATUS status;

KEYBOARD_INDICATOR_PARAMETERS keyInfo;

KEVENT event;

PDEVICE_OBJECT keyDeviceObject = NULL;

PFILE_OBJECT fileObject;

UNICODE_STRING keyName;

RtlInitUnicodeString( &keyName, NT_KEYBOARD_NAME0 );

// KeyBoard Class DeviceObject를 얻어온다.

status = IoGetDeviceObjectPointer( &keyName,

FILE_READ_ATTRIBUTES,

&fileObject,

&keyDeviceObject );

// 얻지 못할 경우.

if( !keyDeviceObject )

return -1;

// Irp 처리가 완료 되기를 기다리기 위한 이벤트..

KeInitializeEvent(&event, NotificationEvent, FALSE);

// Irp 생성.

irp = IoBuildDeviceIoControlRequest( IOCTL_KEYBOARD_QUERY_INDICATORS,

keyDeviceObject,

&keyInfo,

sizeof(KEYBOARD_INDICATOR_PARAMETERS ),

&keyInfo,

sizeof(KEYBOARD_INDICATOR_PARAMETERS ),

FALSE,

&event,

&ioStatus );

// keyboard Class Driver에게 Irp 전달.

status = IoCallDriver(keyDeviceObject, irp);

// 완료를 기달린다.

status = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);

// 상태값..

keyStatus = keyInfo.LedFlags;

return keyStatus;

}

실제 드라이버에서 호출 되는 함수 입니다.




  • profile
    음...
    DDK에서
    IOCTL_KEYBOARD_QUERY_TYPEMATIC 를 사용하는 방법을 찾아 보셨는지...?
    파라메터가 KEYBOARD_UNIT_ID_PARAMETER
    구조로 되어 있는데...

    DDK와 Keyboard Class Driver 소스를 찬찬히 살펴 보시겠습니까?

  • 안녕하세요.
    현재 TypeMatic에서 정보를 읽어 보려고 하는데
    정보를 정확하게 얻을수 없네요...

    irp = IoBuildDeviceIoControlRequest(IOCTL_KEYBOARD_QUERY_TYPEMATIC,//IOCTL_KEYBOARD_SET_INDICATORS, //
    keyDeviceObject,
    &keyInfo,
    sizeof(KEYBOARD_TYPEMATIC_PARAMETERS ),
    &keyInfo,
    sizeof(KEYBOARD_TYPEMATIC_PARAMETERS ),
    FALSE,
    &event,
    &ioStatus);

    이런 식으로 typematic에서 정보를 읽어 오려는데 맞는지요...

    틀렸다면 어떤식으로 변경을 해야 하는지요.
    답변 부탁 드릴께요

  • profile
    안녕하세요, 반갑습니다.
    데브구루 사이트에서 키보드 상태정보를 읽어오는 소스를 참고하신 것 같네요.^^
    소스의 방식은 대충 이렇습니다.
    키보드클래스 드라이버와 통신을 하여 정보를 읽어오는 데요,
    아래와 같이 그 요구사항을 IRP로 만들어 보내고,
    응답을 이벤트가 세트 될때까지 기다리는 것이죠.
    아래 부분을 수정하시면 될것 같은데요,
    그전에 키보드 클래스 드라이버 소스를 분석하시면 님이 원하시는 답을 얻을 수 있을 것 같습니다.

    IOCTL_KEYBOARD_SET_TYPEMATIC등을 DDK도움말에서 참고해 보시겠습니까?

    irp = IoBuildDeviceIoControlRequest( IOCTL_KEYBOARD_QUERY_INDICATORS,

    keyDeviceObject,

    &keyInfo,

    sizeof(KEYBOARD_INDICATOR_PARAMETERS ),

    &keyInfo,

    sizeof(KEYBOARD_INDICATOR_PARAMETERS ),

    FALSE,

    &event,

    &ioStatus );

제목 날짜
mouclass 접근.. 3 2010.03.13
[TIP] NEXUS(넥서스) 5x 루팅 방법입니다. 2016.01.05
class callback호출시 에러가 나는데 뭐가 문제인지 모르겠습니다..ㅠㅠ 1 2006.07.22
"pc용 dos의 설계 및 구현" 책의 diskette 화일을 구합니다. 1 2009.11.10
232통신 데이타 질문 1 2003.09.08
ado 연결.. 1 2005.11.19
ado 연결과 저장 1 2005.12.05
ado사용 mdb에 저장 2 2005.12.12
CD-ROM WRITE에관한 질문입니다.. 1 2006.12.29
class callback호출시 에러가 나는데 뭐가 문제인지 모르겠습니다..ㅠㅠ 1 2006.07.22
DeviceIoControl 사용법 1 2003.11.05
Directshow 지원하는 드라이버 개발관련에 대해서... 1 2004.11.25
DMA관련 질문... 1 2003.11.05
GSector 플로피->하드로 쓰기가 가능한가요? 1 2007.01.26
GUNClient Download Control 질문 1 2007.06.08
gunshadow 처럼 1 2007.01.26
https 패킷 디버깅 5 2012.04.30
inf 파일을 이용한 드라이버 자동 설치 2 2003.09.23
keyboard filter에 쓰기 기능 3 2003.09.06
mouclass 접근.. 3 2010.03.13
OS 개발관련 사이트 링크 모음 2003.03.14
os를 공부하고 있습니다. 1 2009.12.14
PCI to ISA Bridge를 사용한 경우 드라이버는? 1 2002.11.19
태그 목록
위로