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 呼叫超時處理方法 檢查攝...