异步方式访问其它驱动程序

上一篇博文已经谈及了 同步方式 ,,那么现在该说说异步方式访问了...

这里用到上一篇博文所用到的 被测试驱动程序 ,不太清楚的可以先看上一篇博文...

然后先贴图片,再来代码



从图片可以看出ZwReadFile直接就返回了.不等待...


VOID fnReadCompelete(PVOID context,PIO_STATUS_BLOCK block,ULONG l){
	// 这玩意参数我在msdn查不到...或者说我不知道怎么查吧o(︶︿︶)o 唉

	KdPrint(("fnReadCompelete"));
	KeSetEvent((PKEVENT)context,IO_NO_INCREMENT,FALSE);
}
KdPrint(("开始读"));
	HANDLE hDevice;
	OBJECT_ATTRIBUTES  ObjectAttributes;
	UNICODE_STRING ustrDeviceName;
	RtlInitUnicodeString(&ustrDeviceName,L"\\Device\\DRIVERTEST_DeviceName");
	InitializeObjectAttributes(&ObjectAttributes,&ustrDeviceName,OBJ_CASE_INSENSITIVE,NULL,NULL);
	IO_STATUS_BLOCK  IoStatusBlock;
	NTSTATUS status2=ZwCreateFile(&hDevice,GENERIC_ALL,//没有|SYNCHRONIZE参数,异步
		&ObjectAttributes,&IoStatusBlock,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN_IF,NULL,//不是FILE_SYNCHRONOUS_IO_NONALERT,
		NULL,0);
	if (NT_SUCCESS(status2))
	{
		KEVENT kEvent;
		KeInitializeEvent(&kEvent,SynchronizationEvent,FALSE);
		LARGE_INTEGER liOffet=RtlConvertLongToLargeInteger(0);
		if(STATUS_PENDING==ZwReadFile(hDevice,NULL,fnReadCompelete,&kEvent,&IoStatusBlock,NULL,NULL,&liOffet //尼玛,,就算是0也要写LARGE_INTEGER
			,NULL)){
			KdPrint(("开始 KeWaitForSingleObject "));
			KeWaitForSingleObject(&kEvent,Executive,KernelMode,FALSE,NULL);
			KdPrint(("完成 KeWaitForSingleObject "));
	
		}else{
			KdPrint(("ZwReadFile !=STATUS_PENDING "));

		}


	}
	ZwClose(hDevice);
	KdPrint(("读结束"));


评论列表