메뉴 건너뛰기

그외 개발정보


제가 뭐하는지는 아시죠?ㅋㅋ

유저 모드에서 커널모드로 마우스 이벤트를 보내면
커널 모드에서 처리하는 마우스 필터 드라이버를 만들었습니다. moufiltr 예제를 수정해서 사용하고 있습니다.

저번에 도와주셔서 필터 드라이버는 잘 설치 되었고
잘 로드도 됩니다.

그리고 DriverEntry에서 사용자 정의 오브젝트 생성하고 심볼릭링크도 해주고 AddDevice에서는 커널에서 사용하는 오브젝트를 생성합니다.
그래서 테스트 해보면 유저모드 요청도 잘 호출 되구요~~
근데 classcallback을 호출하면 죽는데 원인을 모르겠네요...

그리고 전역으로 connect data를 생성한 이유는 유저 디바이스 오브젝트가 MouFilter_IoCtl에서 connect object가 Null이라서 저장합니다.

뭐가 문제 일까요?
코드를 너무 많이 붙여서 좀 지저분해 보이긴 하네요


PDEVICE_OBJECT pDeviceObject;
CONNECT_DATA gpUpperConnectData;

PDEVICE_OBJECT pDeviceObject;
CONNECT_DATA gpUpperConnectData;

NTSTATUS
MouFilter_InternIoCtl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
.......................
switch (irpStack->Parameters.DeviceIoControl.IoControlCode) {

case IOCTL_INTERNAL_MOUSE_CONNECT:

if (devExt->UpperConnectData.ClassService != NULL) {
status = STATUS_SHARING_VIOLATION;
break;
}
else if (irpStack->Parameters.DeviceIoControl.InputBufferLength <
sizeof(CONNECT_DATA)) {
status = STATUS_INVALID_PARAMETER;
break;
}


connectData = ((PCONNECT_DATA)
(irpStack->Parameters.DeviceIoControl.Type3InputBuffer));

devExt->UpperConnectData = *connectData;

connectData->ClassService = MouFilter_ServiceCallback;
connectData->ClassDeviceObject = devExt->Self;

gpUpperConnectData.ClassService = devExt->UpperConnectData.ClassService;
gpUpperConnectData.ClassDeviceObject = devExt->UpperConnectData.ClassDeviceObject;

break;
........................
}
}

NTSTATUS MouFilter_IoCtl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
// 만약 사용자 정의 IOCTL을 처리하기 위해 만든 Object가 아니라면...
if(DeviceObject != pDeviceObject)
{
...............................
// kmoufir.sys 필터 드라이버의 아랫단으로 패스 시킨다.
return MouFilter_DispatchPassThrough(DeviceObject, Irp);
}

status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
irpStack = IoGetCurrentIrpStackLocation (Irp);
switch (irpStack->MajorFunction) {
case IRP_MJ_CREATE:
break;
case IRP_MJ_CLOSE:
break;
case IRP_MJ_CLEANUP:
break;
case IRP_MJ_DEVICE_CONTROL:
switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_IMOU_LBUTTON:
devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

.................................. 데이터 세팅

if((gpUpperConnectData.ClassService != NULL) && (gpUpperConnectData.ClassDeviceObject != NULL))
{
KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
(*(PSERVICE_CALLBACK_ROUTINE) gpUpperConnectData.ClassService)
(gpUpperConnectData.ClassDeviceObject, &InputDataStart,
&InputDataEnd, &InputDataConsumed);
KeLowerIrql(oldIrql);
}
break;
default:
status = STATUS_INVALID_PARAMETER;
break;
}
default:
break;
}
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = dwDataWritten;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return status;
}




  • profile
    콜백함수를 호출하기전에 콜백함수 포인터가 제대로 얻어졌는지 확인해 보시겠습니까?
    NULL이거나, 잘못된 주소가 들어가 있다거나..할지도 모르겠네요...

    도움이 되었길 바라겠습니다.

    >제가 뭐하는지는 아시죠?ㅋㅋ
    >
    >유저 모드에서 커널모드로 마우스 이벤트를 보내면
    >커널 모드에서 처리하는 마우스 필터 드라이버를 만들었습니다. moufiltr 예제를 수정해서 사용하고 있습니다.
    >
    >저번에 도와주셔서 필터 드라이버는 잘 설치 되었고
    >잘 로드도 됩니다.
    >
    >그리고 DriverEntry에서 사용자 정의 오브젝트 생성하고 심볼릭링크도 해주고 AddDevice에서는 커널에서 사용하는 오브젝트를 생성합니다.
    >그래서 테스트 해보면 유저모드 요청도 잘 호출 되구요~~
    >근데 classcallback을 호출하면 죽는데 원인을 모르겠네요...
    >
    >그리고 전역으로 connect data를 생성한 이유는 유저 디바이스 오브젝트가 MouFilter_IoCtl에서 connect object가 Null이라서 저장합니다.
    >
    >뭐가 문제 일까요?
    >코드를 너무 많이 붙여서 좀 지저분해 보이긴 하네요
    >
    >
    >PDEVICE_OBJECT pDeviceObject;
    >CONNECT_DATA gpUpperConnectData;
    >
    >PDEVICE_OBJECT pDeviceObject;
    >CONNECT_DATA gpUpperConnectData;
    >
    >NTSTATUS
    >MouFilter_InternIoCtl(
    > IN PDEVICE_OBJECT DeviceObject,
    > IN PIRP Irp
    > )
    >{
    > .......................
    > switch (irpStack->Parameters.DeviceIoControl.IoControlCode) {
    >
    > case IOCTL_INTERNAL_MOUSE_CONNECT:
    >
    > if (devExt->UpperConnectData.ClassService != NULL) {
    > status = STATUS_SHARING_VIOLATION;
    > break;
    > }
    > else if (irpStack->Parameters.DeviceIoControl.InputBufferLength <
    > sizeof(CONNECT_DATA)) {
    > status = STATUS_INVALID_PARAMETER;
    > break;
    > }
    >
    >
    > connectData = ((PCONNECT_DATA)
    > (irpStack->Parameters.DeviceIoControl.Type3InputBuffer));
    >
    > devExt->UpperConnectData = *connectData;
    >
    > connectData->ClassService = MouFilter_ServiceCallback;
    > connectData->ClassDeviceObject = devExt->Self;
    >
    > gpUpperConnectData.ClassService = devExt->UpperConnectData.ClassService;
    > gpUpperConnectData.ClassDeviceObject = devExt->UpperConnectData.ClassDeviceObject;
    >
    > break;
    > ........................
    > }
    >}
    >
    >NTSTATUS MouFilter_IoCtl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    >{
    > // 만약 사용자 정의 IOCTL을 처리하기 위해 만든 Object가 아니라면...
    > if(DeviceObject != pDeviceObject)
    > {
    > ...............................
    > // kmoufir.sys 필터 드라이버의 아랫단으로 패스 시킨다.
    > return MouFilter_DispatchPassThrough(DeviceObject, Irp);
    > }
    >
    > status = STATUS_SUCCESS;
    > Irp->IoStatus.Information = 0;
    > irpStack = IoGetCurrentIrpStackLocation (Irp);
    > switch (irpStack->MajorFunction) {
    > case IRP_MJ_CREATE:
    > break;
    > case IRP_MJ_CLOSE:
    > break;
    > case IRP_MJ_CLEANUP:
    > break;
    > case IRP_MJ_DEVICE_CONTROL:
    > switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
    > {
    > case IOCTL_IMOU_LBUTTON:
    > devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    >
    > .................................. 데이터 세팅
    >
    > if((gpUpperConnectData.ClassService != NULL) && (gpUpperConnectData.ClassDeviceObject != NULL))
    > {
    > KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
    > (*(PSERVICE_CALLBACK_ROUTINE) gpUpperConnectData.ClassService)
    > (gpUpperConnectData.ClassDeviceObject, &InputDataStart,
    > &InputDataEnd, &InputDataConsumed);
    > KeLowerIrql(oldIrql);
    > }
    > break;
    > default:
    > status = STATUS_INVALID_PARAMETER;
    > break;
    > }
    > default:
    > break;
    > }
    > Irp->IoStatus.Status = status;
    > Irp->IoStatus.Information = dwDataWritten;
    > IoCompleteRequest (Irp, IO_NO_INCREMENT);
    > return status;
    >}

제목 날짜
mouclass 접근.. 3 2010.03.13
[TIP] NEXUS(넥서스) 5x 루팅 방법입니다. 2016.01.05
class callback호출시 에러가 나는데 뭐가 문제인지 모르겠습니다..ㅠㅠ 1 2006.07.22
혹시 PCI보드에 사용할수 있는 예제 있으신가요?? 4 2005.10.17
한 가지만 더 올리겠습니다. 1 2006.07.18
필터 드라이버 질문입니다. 1 2006.07.12
필터 드라이버 설치문의.. 1 2004.05.18
플로피 필터 드라이버 관련 질문입니다..답변좀해주세요.. 2 2006.12.12
프로세스 숨기기 4 2006.06.09
토글키 만들기 예제를 키 인풋으로 전환하는데 1 2004.01.13
터치스크린 - 마우스제어 2 2010.03.10
키보드 인터럽트에 대해서 2 2005.07.11
최근에 찾은 드라이버 관련 사이트들 2002.10.14
전에 질문드렸던 내용에 대한 자답입니다. 1 2006.07.25
저번 질문에 이어서...책 소스 이용건.. 1 2005.10.24
재질문 드립니다. 1 2005.10.25
잘구현된 uC/OS Task Switching 데모 2002.07.09
인터럽트에 대한 질문 하나더 드립니다. 1 2006.01.25
인터럽트 루틴에 대한 문의 2 2006.01.12
이쪽은 처음이라 황당한 질문을 드리겠습니다. 1 2005.05.11
이건우님 감사합니다. 내친김에 마우스동작을 바꿔보려고합니다. 1 2005.05.12
이 소스대로 하면 열여야 하는거 아닌가요? 1 2004.06.23
웹에서하드웨어제어하기 1 에 관한질문입니다!!!! 1 2005.10.24
태그 목록
위로