IO_STACK_LOCATION 结构和处理过程

    IO_STACK_LOCATION 结构

The IO_STACK_LOCATION structure defines an I/O
stack location

, which is an entry in the I/O stack that is
associated with each IRP. Each I/O stack location in an IRP has some
common members and some request-type-specific members.

 

       typedef struct _IO_STACK_LOCATION {
UCHAR MajorFunction;
UCHAR MinorFunction;
UCHAR Flags;
UCHAR Control;
//
// The following user parameters are based on the service that is being
// invoked. Drivers and file systems can determine which set to use based
// on the above major and minor function codes.
//
union {
//
// System service parameters for: NtCreateFile
//
struct {
PIO_SECURITY_CONTEXT SecurityContext;
ULONG Options;
USHORT POINTER_ALIGNMENT FileAttributes;
USHORT ShareAccess;
ULONG POINTER_ALIGNMENT EaLength;
} Create;

//
// System service parameters for: NtReadFile
//
struct {
ULONG Length;
ULONG POINTER_ALIGNMENT Key;
LARGE_INTEGER ByteOffset;
} Read;
//
// System service parameters for: NtWriteFile
//
struct {
ULONG Length;
ULONG POINTER_ALIGNMENT Key;
LARGE_INTEGER ByteOffset;
} Write;

//
// System service parameters for: NtQueryInformationFile
//
struct {
ULONG Length;
FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
} QueryFile;
//
// System service parameters for: NtSetInformationFile
//
struct {
ULONG Length;
FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
PFILE_OBJECT FileObject;
union {
struct {
BOOLEAN ReplaceIfExists;
BOOLEAN AdvanceOnly;
};
ULONG ClusterCount;
HANDLE DeleteHandle;
};
} SetFile;

//
// System service parameters for: NtQueryVolumeInformationFile
//
struct {
ULONG Length;
FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
} QueryVolume;

//
// System service parameters for: NtFlushBuffersFile
//
// No extra user-supplied parameters.
//

//
// System service parameters for: NtDeviceIoControlFile
//
// Note that the user's output buffer is stored in the UserBuffer field
// and the user's input buffer is stored in the SystemBuffer field.
//
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT IoControlCode;
PVOID Type3InputBuffer;
} DeviceIoControl;
// end_wdm
//
// System service parameters for: NtQuerySecurityObject
//
struct {
SECURITY_INFORMATION SecurityInformation;
ULONG POINTER_ALIGNMENT Length;
} QuerySecurity;
//
// System service parameters for: NtSetSecurityObject
//
struct {
SECURITY_INFORMATION SecurityInformation;
PSECURITY_DESCRIPTOR SecurityDescriptor;
} SetSecurity;
// begin_wdm
//
// Non-system service parameters.
//
// Parameters for MountVolume
//
struct {
PVPB Vpb;
PDEVICE_OBJECT DeviceObject;
} MountVolume;
//
// Parameters for VerifyVolume
//
struct {
PVPB Vpb;
PDEVICE_OBJECT DeviceObject;
} VerifyVolume;
//
// Parameters for Scsi with internal device contorl.
//
struct {
struct _SCSI_REQUEST_BLOCK *Srb;
} Scsi;

//
// Parameters for IRP_MN_QUERY_DEVICE_RELATIONS
//
struct {
DEVICE_RELATION_TYPE Type;
} QueryDeviceRelations;
//
// Parameters for IRP_MN_QUERY_INTERFACE
//
struct {
CONST GUID *InterfaceType;
USHORT Size;
USHORT Version;
PINTERFACE Interface;
PVOID InterfaceSpecificData;
} QueryInterface;
// end_ntifs
//
// Parameters for IRP_MN_QUERY_CAPABILITIES
//
struct {
PDEVICE_CAPABILITIES Capabilities;
} DeviceCapabilities;
//
// Parameters for IRP_MN_FILTER_RESOURCE_REQUIREMENTS
//
struct {
PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
} FilterResourceRequirements;
//
// Parameters for IRP_MN_READ_CONFIG and IRP_MN_WRITE_CONFIG
//
struct {
ULONG WhichSpace;
PVOID Buffer;
ULONG Offset;
ULONG POINTER_ALIGNMENT Length;
} ReadWriteConfig;
//
// Parameters for IRP_MN_SET_LOCK
//
struct {
BOOLEAN Lock;
} SetLock;
//
// Parameters for IRP_MN_QUERY_ID
//
struct {
BUS_QUERY_ID_TYPE IdType;
} QueryId;
//
// Parameters for IRP_MN_QUERY_DEVICE_TEXT
//
struct {
DEVICE_TEXT_TYPE DeviceTextType;
LCID POINTER_ALIGNMENT LocaleId;
} QueryDeviceText;
//
// Parameters for IRP_MN_DEVICE_USAGE_NOTIFICATION
//
struct {
BOOLEAN InPath;
BOOLEAN Reserved[3];
DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
} UsageNotification;
//
// Parameters for IRP_MN_WAIT_WAKE
//
struct {
SYSTEM_POWER_STATE PowerState;
} WaitWake;
//
// Parameter for IRP_MN_POWER_SEQUENCE
//
struct {
PPOWER_SEQUENCE PowerSequence;
} PowerSequence;
//
// Parameters for IRP_MN_SET_POWER and IRP_MN_QUERY_POWER
//
struct {
ULONG SystemContext;
POWER_STATE_TYPE POINTER_ALIGNMENT Type;
POWER_STATE POINTER_ALIGNMENT State;
POWER_ACTION POINTER_ALIGNMENT ShutdownType;
} Power;
//
// Parameters for StartDevice
//
struct {
PCM_RESOURCE_LIST AllocatedResources;
PCM_RESOURCE_LIST AllocatedResourcesTranslated;
} StartDevice;
// begin_ntifs
//
// Parameters for Cleanup
//
// No extra parameters supplied
//
//
// WMI Irps
//
struct {
ULONG_PTR ProviderId;
PVOID DataPath;
ULONG BufferSize;
PVOID Buffer;
} WMI;
//
// Others - driver-specific
//
struct {
PVOID Argument1;
PVOID Argument2;
PVOID Argument3;
PVOID Argument4;
} Others;
} Parameters;
//
// Save a pointer to this device driver's device object for this request
// so it can be passed to the completion routine if needed.
//
PDEVICE_OBJECT DeviceObject;
//
// The following location contains a pointer to the file object for this
//
PFILE_OBJECT FileObject;
//
// The following routine is invoked depending on the flags in the above
// flags field.
//
PIO_COMPLETION_ROUTINE CompletionRoutine;
//
// The following is used to store the address of the context parameter
// that should be passed to the CompletionRoutine.
//
PVOID Context;
} IO_STACK_LOCATION, *PIO_STACK_LOCATION;

 

IO_STACK_LOCATION 处理过程

 

define IoSkipCurrentIrpStackLocation( Irp ) /
(Irp)->CurrentLocation++;
/
(Irp)->Tail.Overlay.CurrentStackLocation++;

#define
IoCopyCurrentIrpStackLocationToNext  ( Irp )  
Value:
{ /
   
PIO_STACK_LOCATION irpSp; /
    PIO_STACK_LOCATION nextIrpSp; /
   
irpSp = IoGetCurrentIrpStackLocation( (Irp) ); /
    nextIrpSp =
IoGetNextIrpStackLocation( (Irp) ); /
    RtlCopyMemory( nextIrpSp,
irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); /
   
nextIrpSp->Control = 0; }

 

NTSTATUS
IoCallDriver(
    IN
PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    )
{
   
return IofCallDriver (DeviceObject, Irp);
}

NTSTATUS
FASTCALL
IofCallDriver(
   
IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    )
{
   
//
    // This routine will either jump immediately to
IopfCallDriver, or rather
    // IovCallDriver.
    //
   
return pIofCallDriver(DeviceObject, Irp);
}

 

NTSTATUS
FASTCALL
IopfCallDriver(
   
IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
    )

/*++

Routine Description:

    This routine is invoked to pass an I/O
Request Packet (IRP) to another
    driver at its dispatch routine.

Arguments:

    DeviceObject - Pointer to device object
to which the IRP should be passed.

    Irp - Pointer to IRP for request.

Return Value:

    Return status from driver's dispatch
routine.

--*/

{
    PIO_STACK_LOCATION irpSp;
   
PDRIVER_OBJECT driverObject;
    NTSTATUS status;

    //
    // Ensure that this is really
an I/O Request Packet.
    //

    ASSERT( Irp->Type == IO_TYPE_IRP );

    //
    // Update the IRP stack to
point to the next location.
    //
    Irp->CurrentLocation--;

    if (Irp->CurrentLocation <= 0) {
       
KeBugCheckEx( NO_MORE_IRP_STACK_LOCATIONS, (ULONG_PTR) Irp, 0, 0, 0 );
   
}

    irpSp = IoGetNextIrpStackLocation( Irp
);
    Irp->Tail.Overlay.CurrentStackLocation = irpSp;

    //
    // Save a pointer to the
device object for this request so that it can
    // be used later in
completion.
    //

    irpSp->DeviceObject = DeviceObject;

    //
    // Invoke the driver at its
dispatch routine entry point.
    //

    driverObject =
DeviceObject->DriverObject;

    PERFINFO_DRIVER_MAJORFUNCTION_CALL(Irp,
irpSp, driverObject);

    status =
driverObject->MajorFunction[irpSp->MajorFunction]( DeviceObject,
                                                             
Irp );

   
PERFINFO_DRIVER_MAJORFUNCTION_RETURN(Irp, irpSp, driverObject);

    return status;
}

 

时间: 2024-08-01 01:15:43

IO_STACK_LOCATION 结构和处理过程的相关文章

下拉框 树形结构选择-EXT 2.0版本实现下拉框树形结构选择实现过程和方法

问题描述 EXT 2.0版本实现下拉框树形结构选择实现过程和方法 最近在用EXT 2.0开发一个项目,涉及到一下下拉框选择管理机构的问题,点击下拉框要求是树形选择机构,单选.多选都行.烦请各位大侠指点迷津,一定要详细点啊,我在网上看了挺多, 但也不是很好用. 我只需要从我的框架结果采用Struts2.0+Spring+Ibatis,我只需要从action中返回数据到 页面js这两个地方的解决办法.谢谢 解决方案 //下拉框 var permissCombox=Ext.create('Ext.fo

【C/C++学院】0817-递归汉诺塔 双层递归 /CPP结构体 /面向过程与面向对象的编程模式/类的常识共用体实现一个类的特征/QT应用于类以及类的常识

递归汉诺塔 双层递归 #include <iostream> void han(int n, char A, char B, char C) { static int num = 1; std::cout << "第" << num << "次"; num++; if (n<1) { return; } else { han(n - 1, A, C, B); std::cout << A <&l

行为驱动开发: Cucumber的目录结构和执行过程

Cucumber是Ruby世界的BDD框架,开发人员主要与两类文件打交到,Feature文件和相应的Step文件.Feature文件是以feature为后缀名的文件,以Given-When-Then的方式描述了系统的场景(scenarios)行为:Step文件为普通的Ruby文件,Feature文件中的每个Given/When/Then步骤在Step文件中都有对应的Ruby执行代码,两类文件通过正则表达式相关联.笔者在用Cucumber+Watir做回归测试时对Cucumber工程的目录结构执行

如何使用ASP脚本制作异步装载的树形结构(一)

脚本|异步 树形结构是描述层次数据的常见方法.本文介绍的树形结构生成程序主要由一个ASP页面.二个JavaScript函数构成.该树形结构是异步的,也就是说,节点数据仅在必要时才读取,而不是一次性全部发送到客户端. 一.概述 树形结构中所有的节点都必须包含以下属性:本身的ID,父节点的ID,以及本节点的说明(节点文本).本文用到了一个Access数据库Tree.mdb来保存这些节点信息.Tree.mdb包含表tblTree,其定义如下: 字段名称 类型 说明 ElementID 自动编号 节点的

PL/SQL程序结构

什么是PL/SQL程序     前面第4章学习的标准化的SQL语言对数据库进行各种操作,每次只能执行一条语句,语句以英文的分号";"为结束标识,这样使用起来很不方便,同时效率较低,这是因为Oracle数据库系统不像VB.VC这样的程序设计语言,它侧重于后台数据库的管理,因此提供的编程能力较弱,而结构化编程语言对数据库的支持能力又较弱,如果一些稍微复杂点的管理任务都要借助编程语言来实现的话,这对管理员来讲是很大的负担.    正是在这种需求的驱使下,从Oracle 6开始,Oracle公

PL/SQL过程

     要想利用PL/SQL程序完成比较完整的数据库任务,需要进一步学习一些高级设计要素的内容.前面编写执行的PL/SQL程序,共同的特点是没有名称,只能存储为文件,然后通过执行文件的方式执行,因此称为无名块.与此对应的是在PL/SQL中也引入了高级程序设计的一些概念,其中最重要的就是过程.    过程就是高级程序设计语言中的模块的概念,将一些内部联系的命令组成一个个过程,通过参数在过程之间传递数据是模块化设计思想的重要内容. 创建过程     1. 过程的语法结构    完整的过程结构如下:

利用ASP脚本制作异步装载的树形结构(一)(转)——好东东!!

脚本|异步 树形结构是描述层次数据的常见方法.本文介绍的树形结构生成程序主要由一个ASP页面.二个JavaScript函数构成.该树形结构是异步的,也就是说,节点数据仅在必要时才读取,而不是一次性全部发送到客户端. 一.概述 树形结构中所有的节点都必须包含以下属性:本身的ID,父节点的ID,以及本节点的说明(节点文本).本文用到了一个Access数据库Tree.mdb来保存这些节点信息.Tree.mdb包含表tblTree,其定义如下: 字段名称 类型 说明 ElementID 自动编号 节点的

vb变量、常数和数据类型及过程概述(十一)

提供可选参数的缺省值 也可以给可选参数指定缺省值.在下例中,如果未将可选参数传递到函数过程,则返回一个缺省值.Sub ListText(x As String, Optional y As _Integer = 12345)List1.AddItem xList1.AddItem yEnd Sub Private Sub Command1_Click ()strName = "yourname" '未提供第二个参数.Call ListText (strName) '添加"yo

软件工程之系统建模篇:设计窗口结构

在创建用户接口原型之前,应该先创建窗口结构图,窗口结构用于描述窗口之 间的关系,于UML没有直接的关系,本章介绍窗口结构的设计过程,先介绍窗口结 构的设计方法,然后设计总体窗口结构图,最后设计下一层的窗口结构图. 1.设计方法 窗口结构是窗口之间的切换流程,通过窗口结构,可以直观地看到通过用例的 路径流程.窗口结构非常重要,一个软件系统在实用性上能满足用户的需要还是 远远不够的,如果窗口结构设计不合理,也不会受用户欢迎.我们可以参考前面 的接口类图来设计窗口结构,在"软件工程之系统建模篇[设计接