IRP的超時處理

2021-07-04 09:20:23 字數 3198 閱讀 5266

exe部分

#include #include #include #include "ioctl.h"

int main (void)

dword dwread;

//如果讀irp沒有被完成,readfile一直都不會退出

readfile(hdevice,null,null,&dwread,null);

printf("第乙個readfile返回%d\n",getlasterror());

readfile(hdevice,null,null,&dwread,null);

printf("第二個readfile返回%d\n",getlasterror());

closehandle(hdevice);

getchar();

getchar();

return 0;

}

sys部分

#pragma once

#include #define countarray(array) ( sizeof(array) / sizeof(array[0]) )

typedef struct _device_extension

device_extension,*pdevice_extension;

#ifdef __cplusplus

extern "c" ntstatus driverentry(in pdriver_object driverobject, in punicode_string registrypath);

#endif

void hellounload(in pdriver_object driverobject); //解除安裝函式

ntstatus createdevice(pdriver_object pdevobj); //建立裝置

ntstatus helloddkdispatchroutine(in pdevice_object pdevobj,in pirp pirp); //派遣函式

ntstatus helloddkcontrol(in pdevice_object pdevobj,in pirp pirp); //irp_mj_directory_control

ntstatus helloddkread(in pdevice_object pdevobj,in pirp pirp);

#include "hello.h"

#include "ioctl.h"

ntstatus driverentry(in pdriver_object driverobject, in punicode_string registrypath)

driverobject->majorfunction[irp_mj_read]=helloddkread;

#if dbg

_asm int 3

#endif

//建立裝置

createdevice(driverobject);

return status_success;

}//解除安裝函式

void hellounload(in pdriver_object driverobject) }

ntstatus helloddkcontrol(in pdevice_object pdevobj,in pirp pirp)

break;

default:

status=status_invalid_variant;

} //設定irp的完成狀態

pirp->iostatus.status=status;

pirp->iostatus.information=0;

iocompleterequest(pirp,io_no_increment);

return status;

}void ontimerdpc(in pkdpc pdpc,in pvoid pcontext,in pvoid sysarg1,in pvoid sysarg2)

ntstatus helloddkread(in pdevice_object pdevobj,in pirp pirp)

//建立裝置

ntstatus createdevice(pdriver_object pdriver_object)

pdevobj->flags |= do_buffered_io;;

pdevext=(pdevice_extension)pdevobj->deviceextension;

pdevext->pdevice=pdevobj;

pdevext->ustrdevicename=devname;

pdevext->ustrsymlinkname=symlinkname;

keinitializetimer(&pdevext->pollingtimer);

keinitializedpc(&pdevext->pollingdpc,ontimerdpc,(pvoid)pdevobj);

//建立符號連線

status =iocreatesymboliclink(&symlinkname,&devname) ;

if (!nt_success(status))

return status_success; }

//派遣函式

ntstatus helloddkdispatchroutine(in pdevice_object pdevobj,in pirp pirp)

; uchar type = stack->majorfunction;

if (type >= countarray(irpname))

kdprint(("無效的irp型別 %x\n", type));

else

kdprint(("%s\n", irpname[type]));

pirp->iostatus.status=status_success; //設定完成狀態

pirp->iostatus.information=0; //設定操作位元組為0

iocompleterequest(pirp,io_no_increment); //結束irp派遣函式,第二個引數表示不增加優先順序

return status_success;

}

IRP 處理流程

本文通過開啟乙個檔案物件為例子,描述了乙個帶有兩個i o stack location的irp的詳細處理過程。當然乙個irp可以有多個i o stack location,具體個數取決於將要處理該請求的驅動的層數。下圖詳細描述了驅動程式是如何通過使用i o支援例程 io routines 來處理ir...

對自己裝置的控制IRP的處理

ursaemin ris 10977789 21 20 23 這個irp是deviceiocontrol發下來的,我只返回了status,但是沒skip也沒complete。楚天樂 285008395 21 25 35 deviceiocontrol 楚天樂 285008395 21 25 40 是...

C 超時處理

在網上搜尋了很多c 超時處理的方法,下面一種是我除錯過的 超時處理 public class timeoutchecker public bool wait long timeout this.dispose return flag private void dispose 呼叫超時處理方法 檢查攝...