📄 wd_irp.h
字号:
/**
@file wd_irp.h
@brief Irp相关头文件.
如果你直接包含这个头文件,在包含之前必须包含DDK相关头文件.(你可以
选择WDM或者IFS或者NDIS相关头文件.)
你也可以不使用这个头文件,直接使用DDK中的IRP等数据结构进行操作.
这个头文件被wd_sys等模块使用.但是需要用到的地方,都已经自行包含
了这个头文件.所以一般你不需要自己包含它.
@author tan wen 谭文
@date 2005-12-20
*/
#ifndef _WD_IRP_HEADER_
#define _WD_IRP_HEADER_
#include "wdf.h"
typedef IRP wd_irp;
typedef PIRP wd_pirp;
typedef IO_STACK_LOCATION wd_io_stack;
typedef IO_STACK_LOCATION wd_irpsp;
typedef PIO_STACK_LOCATION wd_pio_stack;
typedef IO_STATUS_BLOCK wd_io_stat_block; //< old
typedef IO_STATUS_BLOCK wd_io_stat;
/* old */
enum {
wd_mn_mdl = IRP_MN_MDL,
wd_mn_mdl_comp = IRP_MN_COMPLETE_MDL,
wd_mn_normal = IRP_MN_NORMAL
};
enum { wd_mj_read = IRP_MJ_READ };
// */
_inline wd_stat wd_irp_stat(wd_irp *irp)
{
return irp->IoStatus.Status;
}
_inline wd_stat wd_irp_over(wd_irp *irp)
{
wd_stat status = irp->IoStatus.Status;
IoCompleteRequest(irp, IO_NO_INCREMENT);
return status;
}
_inline wd_ulong wd_irp_flags(wd_irp *irp)
{ return irp->Flags; }
_inline wd_void wd_irp_flags_set(wd_irp *irp,wd_ulong flags)
{ irp->Flags = flags; }
_inline wd_stat wd_irp_failed(wd_pirp irp,wd_stat status_error)
{
irp->IoStatus.Status = status_error;
irp->IoStatus.Information = 0;
return wd_irp_over(irp);
}
_inline wd_dev* wd_irpsp_dev(wd_irpsp *irpsp)
{ return irpsp->DeviceObject; }
_inline wd_void wd_irpsp_dev_set(wd_irpsp *irpsp,wd_dev *dev)
{ irpsp->DeviceObject = dev; }
_inline wd_uchar wd_irpsp_minor(wd_io_stack *irpsp)
{ return irpsp->MinorFunction; }
_inline wd_ulong wd_irpsp_devctrl_code(wd_io_stack *irpsp)
{ return irpsp->Parameters.DeviceIoControl.IoControlCode; }
_inline wd_uchar wd_irpsp_major(wd_io_stack *irpsp)
{ return irpsp->MajorFunction; }
_inline wd_uchar wd_irpsp_minor_set(wd_io_stack *irpsp,wd_uchar minor)
{ return irpsp->MinorFunction = minor; }
_inline wd_uchar wd_irpsp_major_set(wd_io_stack *irpsp,wd_uchar major)
{ return irpsp->MajorFunction = major; }
_inline wd_ulong wd_irpsp_fs_ctl_code(wd_io_stack *irpsp)
{ return irpsp->Parameters.FileSystemControl.FsControlCode; }
// old
_inline wd_void wd_skip_io_stack(wd_pirp irp)
{ IoSkipCurrentIrpStackLocation(irp); }
// old
_inline wd_void wd_copy_io_stack(wd_irp *irp)
{ IoCopyCurrentIrpStackLocationToNext(irp); }
_inline wd_stat wd_irp_call(wd_dev *dev,wd_pirp irp)
{ return IoCallDriver(dev,irp); }
_inline wd_proc_mode wd_irp_req_mode(wd_irp *irp)
{ return irp->RequestorMode; }
_inline wd_void wd_irp_req_mode_set(wd_irp *irp,wd_proc_mode req_mode)
{ irp->RequestorMode = req_mode; }
_inline wd_void* wd_irp_sys_buf(wd_irp *irp)
{ return irp->AssociatedIrp.SystemBuffer; }
_inline wd_ulong wd_irpsp_devctrl_in_len(wd_irpsp *irpsp)
{ return irpsp->Parameters.DeviceIoControl.InputBufferLength; }
_inline wd_ulong wd_irpsp_devctrl_out_len(wd_irpsp *irpsp)
{ return irpsp->Parameters.DeviceIoControl.OutputBufferLength; }
_inline wd_stat wd_irp_status(wd_irp *irp)
{ return irp->IoStatus.Status; }
_inline wd_stat wd_irp_stat_set(wd_irp *irp,wd_stat status)
{ return (irp->IoStatus.Status = status); }
_inline wd_void wd_irp_infor_set(wd_irp *irp,wd_ulong infor)
{ irp->IoStatus.Information = infor; }
_inline wd_ulong wd_irp_infor(wd_irp *irp)
{ return irp->IoStatus.Information; }
_inline wd_io_stack *wd_cur_io_stack(wd_irp *irp)
{ return IoGetCurrentIrpStackLocation(irp); }
_inline wd_irpsp *wd_irp_cur_sp(wd_irp *irp)
{ return IoGetCurrentIrpStackLocation(irp); }
_inline wd_irpsp *wd_irp_next_sp(wd_irp *irp)
{ return IoGetNextIrpStackLocation(irp); }
typedef PIO_COMPLETION_ROUTINE wd_irp_comp_func;
_inline wd_void wd_irp_comp(wd_irp *irp,
wd_irp_comp_func complete,
wd_void *context)
{ IoSetCompletionRoutine(irp,complete,context,
wd_true,wd_true,wd_true); }
_inline wd_irp *wd_irp_fsd_alloc(wd_uchar major,wd_dev *dev,
wd_void *buf,wd_ulong length,
wd_lgint *offset,
wd_io_stat_block *io_stat)
{ return IoBuildAsynchronousFsdRequest(major,dev,buf,length,
offset,io_stat); }
_inline wd_byte *wd_irp_buf(wd_irp *irp)
{
if(irp->MdlAddress)
{
return (wd_byte *)MmGetSystemAddressForMdlSafe(
irp->MdlAddress,
NormalPagePriority);
}
else if(irp->UserBuffer)
{
return (wd_byte *)irp->UserBuffer;
}
else
{
return (wd_byte *)irp->AssociatedIrp.SystemBuffer;
}
}
_inline wd_void wd_irp_send_by_myself_free(wd_irp *irp)
{
if (irp->MdlAddress)
{
MmUnmapLockedPages(MmGetSystemAddressForMdl(irp->MdlAddress),
irp->MdlAddress);
MmUnlockPages(irp->MdlAddress);
IoFreeMdl(irp->MdlAddress);
}
IoFreeIrp(irp);
};
_inline wd_void wd_irp_set_comp(wd_irp *irp,
wd_irp_comp_func comp,
wd_void *context)
{
IoSetCompletionRoutine(irp,comp,context,
wd_true,wd_true,
wd_true);
}
_inline wd_file *wd_irp_file(wd_irpsp *irpsp)
{
return irpsp->FileObject;
}
_inline wd_file *wd_irpsp_file(wd_irpsp *irpsp)
{
return irpsp->FileObject;
}
_inline wd_void wd_irpsp_file_set(wd_irpsp *irpsp,
wd_file *file)
{
irpsp->FileObject = file;
}
_inline wd_lgint wd_irp_write_offset(wd_irpsp *irpsp)
{
return irpsp->Parameters.Write.ByteOffset;
}
_inline wd_size wd_irp_write_length(wd_irpsp *irpsp)
{
return irpsp->Parameters.Write.Length;
}
_inline wd_void wd_irp_read_offset_set(wd_irpsp *irpsp,wd_lgint offset)
{
irpsp->Parameters.Read.ByteOffset = offset;
}
_inline wd_lgint wd_irp_read_offset(wd_irpsp *irpsp)
{
return irpsp->Parameters.Read.ByteOffset;
}
_inline wd_void wd_irp_read_length_set(wd_irpsp *irpsp,
wd_ulong length)
{
irpsp->Parameters.Read.Length = length;
}
_inline wd_mdl *wd_irp_mdl_address(wd_irp *irp)
{
return irp->MdlAddress;
}
_inline wd_mdl *wd_irp_mdl(wd_irp *irp)
{
return irp->MdlAddress;
}
_inline wd_void wd_irp_mdl_address_set(wd_irp *irp,
wd_mdl *mdl)
{
irp->MdlAddress = mdl;
}
_inline wd_void wd_irp_mdl_set(wd_irp *irp,
wd_mdl *mdl)
{
irp->MdlAddress = mdl;
}
_inline wd_void wd_irp_user_buf_set(wd_irp *irp,
wd_void *user_buf)
{
irp->UserBuffer = user_buf;
}
_inline wd_void * wd_irp_user_buf(wd_irp *irp)
{
return irp->UserBuffer;
}
_inline wd_size wd_irp_read_length(wd_irpsp *irpsp)
{
return irpsp->Parameters.Read.Length;
}
_inline wd_ulong wd_irpsp_file_opts(wd_irpsp *irpsp) // old
{
return irpsp->Parameters.Create.Options;
}
_inline wd_ulong wd_irpsp_create_opts(wd_irpsp *irpsp)
{ return irpsp->Parameters.Create.Options; }
_inline wd_void wd_irpsp_create_opts_set(wd_irpsp *irpsp,wd_ulong opts)
{ irpsp->Parameters.Create.Options = opts; }
_inline wd_ushort wd_irpsp_file_attrs(wd_irpsp *irpsp)
{ return irpsp->Parameters.Create.FileAttributes; }
#endif //_WD_IRP_HEADER_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -