IRP类型
IRP类型 | 来源 |
---|---|
IRP_MJ_ CREATE | CreateFile |
IRP_MJ_CLOSE | CloseHandle 内核对象引用计数位0 |
IRP_MJ_CLEANUP | CloseHandle |
IRP_MJ_ DEVICE_CONTROL | DeviceIoControl |
IRP_MJ_ PNP | 即插即用消息,NT驱动不支持此种IRP,只有WDM驱动才支持 |
IRP_MJ_POWER | 在操作系统处理电源时,产生此IRP |
IRP_MJ_QUERY_INFORMATION | GetFileSize |
IRP_MJ_READ | ReadFile |
IRP_MJ_SET_INFORMATION | GetFileSize |
IRP_MJ_SHUTDOWN | 关闭系统前会产生此IRP |
IRP_MJ_SYSTEM_CONTROL | 系统内部产生的控制消息,类似于内核调用DeviceIoControl函数 |
IRP_MJ_WRITE | 对设备进行WriteFile会产生此IRP |
对派遣函数的简单处理
NTSTATUS IrpCreateProc(PDEVICE_OBJECT pDeviceObject/*设备信息*/, PIRP pIrp/*参数信息*/)
{
DbgPrint("DispatchCreate ... \n");
pIrp->IoStatus.Status = STATUS_SUCCESS; //getlasterror()得到的就是这个值
pIrp->IoStatus.Information = 0; //返回给3环多少数据,没有填0
IoCompleteRequest(pIrp, IO_NO_INCREMENT);//调用该函数完成请求
return STATUS_SUCCESS;
}
例如WriteFile在产生IRP请求后,会让线程进入睡眠,等待IRP的处理。IoCompleteRequest第二个参数指出线程恢复后以何种优先级执行,键盘鼠标等设备需要更快的反应,需要设置相应的优先级