⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wd_irp.h

📁 国内文件驱动编程知名人物蔡大侠的教程源代码
💻 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 + -