首页
社区
课程
招聘
[求助]IRP HOOK 蓝屏 DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
发表于: 2016-7-21 13:17 10939

[求助]IRP HOOK 蓝屏 DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS

2016-7-21 13:17
10939
IRP HOOK之后,在系统刚进入桌面的几分钟内卸载驱动,会出现这个蓝屏,可是之后的时间卸载这个驱动,一切正常。实在是想不明白为什么。以下是代码
NTSTATUS NtfsCreateDispatchHook(
	IN PDEVICE_OBJECT		DeviceObject,
	IN PIRP					Irp
	)
{
	NTSTATUS 			Status = 			STATUS_UNSUCCESSFUL;
	PIO_STACK_LOCATION 	IoStackLocation = 	NULL;
	PFILE_OBJECT 		FileObject = 		NULL;

	IoStackLocation = IoGetCurrentIrpStackLocation( Irp );
	KeResetEvent( &Event );

	if ( IoStackLocation == NULL )
		goto End;

	FileObject = IoStackLocation->FileObject;
	
	if ( FileObject == NULL )
		goto End;
	
	if ( KeGetCurrentIrql() == PASSIVE_LEVEL )
	{
		BOOLEAN Bad = FALSE;

		Bad = RtlFindSubString( &FileObject->FileName, &QQProtectUpd );

		if( Bad )
		{
			Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
			IoCompleteRequest( Irp, IO_NO_INCREMENT );
			KeSetEvent( &Event, IO_DISK_INCREMENT + 1, FALSE );
			
			return STATUS_ACCESS_DENIED;
		}
	}
	
End:
	Status = NtfsCreateDispatch( DeviceObject, Irp );
	KeSetEvent( &Event, IO_DISK_INCREMENT + 1, FALSE );
	return Status;
}

NTSTATUS FSDHookControl( IN BOOLEAN IsHook )
{
	NTSTATUS status = STATUS_SUCCESS;
	UNICODE_STRING uNTFS = {0};
	PDRIVER_OBJECT NTFS = NULL;

	RtlInitUnicodeString( &uNTFS, L"\\FileSystem\\Ntfs" );

	status = ObReferenceObjectByName(	&uNTFS, 
										OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
										NULL,
										0,
										*IoDriverObjectType,
										KernelMode,
										NULL,
										&NTFS);
	
	if ( ! NT_SUCCESS( status ) )
		return status;

	if( IsHook )
		NtfsCreateDispatch = InterlockedExchangePointer(
									( PVOID )&NTFS->MajorFunction[ IRP_MJ_CREATE ],
									NtfsCreateDispatchHook );
	
	if( ! IsHook && MmIsAddressValid( NtfsCreateDispatch ) )
	{
		if( NTFS->MajorFunction[ IRP_MJ_CREATE ] == NtfsCreateDispatchHook )
		{
			KeWaitForSingleObject( &Event, Executive, KernelMode, FALSE, NULL );
			
			InterlockedExchangePointer(	( PVOID )&( NTFS->MajorFunction[ IRP_MJ_CREATE ] ),
										NtfsCreateDispatch );
		}
	}	
	
	ObDereferenceObject( NTFS );
	
	return STATUS_SUCCESS;
}

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
字面意思

卸载驱动之前请确保所有IRP都已完成
2016-7-21 21:13
0
雪    币: 198
活跃值: (932)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
我也遇到此类情况,怎么着手处理呢
2016-7-22 16:29
0
雪    币: 24
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
蓝屏的时候 WinDBG指向哪里啊?
2016-7-25 15:21
0
雪    币: 407
活跃值: (1746)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
啥意思啊
2016-7-26 09:35
0
雪    币: 24
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
那你是怎么分析蓝屏的啊?

我是用Windbg挂到虚拟机上或者分析dump。
2016-8-1 08:56
0
雪    币: 407
活跃值: (1746)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我表示汇编看不太明白
2016-8-2 20:12
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
还有IRP派遣没有完成,这时候卸载驱动就会蓝屏
必须确保所有IRP派遣完成才可以
2016-8-2 21:00
0
雪    币: 407
活跃值: (1746)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
可是无法确定Pending IRP啥时候完成呀,那么就可能需要等好久才会完成卸载,因为是FSD的HOOK,如果直接完成的话,可能会出问题
2016-8-3 10:49
0
雪    币: 362
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
改成inline hook  pushad popad jmp 回原来函数的形式 别调用NtfsCreateDispatch
2020-4-21 02:01
0
游客
登录 | 注册 方可回帖
返回
//