上一篇博文已经谈及了 同步方式 ,,那么现在该说说异步方式访问了...
这里用到上一篇博文所用到的 被测试驱动程序 ,不太清楚的可以先看上一篇博文...
然后先贴图片,再来代码
从图片可以看出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(("读结束"));