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