fly1101
驱动牛犊
驱动牛犊
  • 注册日期2007-10-22
  • 最后登录2012-04-19
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望93点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:2791回复:4

请教IRP_MJ_READ 和 IRP_MJ_WRITE IO偏移的问题

楼主#
更多 发布于:2009-11-27 10:52
WDK中关于IRP_MJ_READ有如下描述:
Pointer to a LARGE_INTEGER variable that specifies the starting byte offset within the file of the data to be read.
Under certain circumstances, this parameter might validly contain a NULL or negative value. For example, if the file object was opened for synchronous I/O, and one of the following conditions is true, this indicates that the current file position should be used instead of an explicit file offset value:

IrpSp->Parameters.Read.ByteOffset == NULL

IrpSp->Parameters.Read.ByteOffset.LowPart == FILE_USE_FILE_POINTER_POSITION and IrpSp->Parameters.Read.ByteOffset.HighPart == -1.


WDK中关于IRP_MJ_WRITE有如下描述:
A pointer to a LARGE_INTEGER variable that specifies the starting byte offset within the file of the data to be written.
Under certain circumstances, this parameter might validly contain a NULL or negative value. For example:

If the following condition is true, this indicates that the current end of file should be used instead of an explicit file offset value:
IrpSp->Parameters.Write.ByteOffset.LowPart == FILE_WRITE_TO_END_OF_FILE and IrpSp->Parameters.Write.ByteOffset.HighPart == -1

If the file object was opened for synchronous I/O, and one of the following conditions is true, this indicates that the current file position should be used instead of an explicit file offset value:
IrpSp->Parameters.Write.ByteOffset == NULL

IrpSp->Parameters.Write.ByteOffset.LowPart == FILE_USE_FILE_POINTER_POSITION and IrpSp->Parameters.Write.ByteOffset.HighPart == -1


***************************************************************************************************************************************
其中有IrpSp->Parameters.Read.ByteOffset == NULL和IrpSp->Parameters.Write.ByteOffset == NULL,
可结构中IrpSp->Parameters.xxx.ByteOffset 并不是指针,请问是WDK上写错了吗?

如果是WDK写错了,那么关于IrpSp->Parameters.Write.ByteOffset == NULL的情况,正确的应该是怎样呢?
如果没有写错,请问该怎么理解呢?
JeTus
驱动牛犊
驱动牛犊
  • 注册日期2007-09-22
  • 最后登录2010-01-17
  • 粉丝3
  • 关注0
  • 积分84分
  • 威望781点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-11-27 11:00
NULL = 0
fly1101
驱动牛犊
驱动牛犊
  • 注册日期2007-10-22
  • 最后登录2012-04-19
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望93点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-11-27 11:16
IrpSp->Parameters.Read.ByteOffset == NULL或者
IrpSp->Parameters.Read.ByteOffset == 0 编译通不过,
IrpSp->Parameters.Read.ByteOffset 是个结构体。

如果IrpSp->Parameters.Read.ByteOffset == NULL时,也就是
IrpSp->Parameters.Read.ByteOffset .QuadPart  == 0 ,这个哪儿有文档可循呢?
x-star
驱动小牛
驱动小牛
  • 注册日期2007-04-26
  • 最后登录2018-11-17
  • 粉丝0
  • 关注0
  • 积分65分
  • 威望664点
  • 贡献值1点
  • 好评度39点
  • 原创分1分
  • 专家分1分
  • 社区居民
地板#
发布于:2009-11-27 11:44
ByteOffset 是不个LargerInteger
fly1101
驱动牛犊
驱动牛犊
  • 注册日期2007-10-22
  • 最后登录2012-04-19
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望93点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-11-27 11:53
ByteOffset 是联合体 LARGE_INTEGER

包含两个结构体和一个LONGLONG类型

#if defined(MIDL_PASS)
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
    struct {
        ULONG LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        ULONG LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;

IrpSp->Parameters.Read.ByteOffset == NULL 的意思是
IrpSp->Parameters.Read.ByteOffset .QuadPart  == 0 吗?
游客

返回顶部