유저 모드에서 커널모드로 마우스 이벤트를 보내면
커널 모드에서 처리하는 마우스 필터 드라이버를 만들었습니다. 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;
}
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;
>}