如下是參考張帆的《Windows 驅動開發技術詳解》第9章IRP同步完成與異步完成小節中的代碼:
內核read IRP處理函式:
#pragma PAGEDCODE
NTSTATUS WDK_IRP_Read(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
NTSTATUS status= STATUS_SUCCESS;
//得到當前堆疊
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
//得到設備擴展
PDEVICE_EXTENSION pDevExt =(PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
//記錄當前IRP進入鏈表
PIRP_ENTRY pIrp_Entry = (PIRP_ENTRY) ExAllocatePool(PagedPool,sizeof(IRP_ENTRY));
pIrp_Entry->pIrp = Irp;
//插入佇列
InsertHeadList(pDevExt->plinklistHead_IRP,&pIrp_Entry->ListEntry);
//將當前Irp掛起
IoMarkIrpPending(Irp);
return STATUS_PENDING;
}
應用層呼叫如下:
//當異步讀取完成時候呼叫的函式;
VOID CALLBACK MyFileIoCompletionRoutine1(DWORD dwErroeCode,
DWORD dwNumberOfByte,
LPOVERLAPPED lpOverlapped)
{
printf("回呼函式1中:讀取了 %d 位元組:\n",dwNumberOfByte);
nReadLen = dwNumberOfByte;
}
Main函式中:
BOOL bRet = ReadFileEx(hDevice,pbuffer,ulReadLen,&overlap,MyFileIoCompletionRoutine1);
printf("GetLastError = %d\n",GetLastError());
if (!bRet && GetLastError() == ERROR_IO_PENDING)
{
printf("請求1被掛起\n");
}
遇到的問題(異步處理):
1、IRP_MJ_READ處理函式中,我掛起了IRP_MJ_READ的請求;但是在用戶層呼叫ReadFileEx介面時,回傳值為TRUE;而且GetLastError()的回傳值也是0,而不是書上所說的ERROR_IO_PENDING錯誤碼?
求指點;
uj5u.com熱心網友回復:
HANDLE hDevice = CreateFile("\\\\.\\MyWDMCap1SymLink",GENERIC_READ |GENERIC_WRITE,
0, //非共享
NULL, //沒有使用安全描述符
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED|FILE_ATTRIBUTE_NORMAL,//異步操作//FILE_ATTRIBUTE_NORMAL, //設備屬性
NULL);
if (hDevice == INVALID_HANDLE_VALUE)
{
printf("驅動設備打開失敗,驅動名稱:%s;錯誤碼:%d\n","MyWDMCap1SymLink",GetLastError());
return -1;
}
以上是驅動打開方式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/83411.html
