当前位置: 首页 > news >正文

Npfs!NpFsdWrite函数和Npfs!NpCommonWrite函数和Npfs!NpWriteDataQueue函数中的DeferredList

印子:继续第八部分
https://chenghao.blog.csdn.net/article/details/146724782
第八部分:Npfs!NpFsdWrite函数到nt!IopfCompleteRequest函数

1: kd> kc 9
 #
00 nt!IopfCompleteRequest
01 Npfs!NpFsdWrite
02 nt!IofCallDriver
03 nt!IopSynchronousServiceTail
04 nt!NtWriteFile
05 nt!_KiSystemService
06 SharedUserData!SystemCallStub
07 ntdll!ZwWriteFile
08 RPCRT4!UTIL_WriteFile

第一部分:
1: kd> kv 3
 # ChildEBP RetAddr  Args to Child              
00 f794ab9c baaf50e5 e179e288 00000001 007b3990 Npfs!NpWriteDataQueue (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\fs\npfs\writesup.c @ 88]
01 f794ac14 baaf52f6 895824b8 007b3990 00000030 Npfs!NpCommonWrite+0x1b5 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\fs\npfs\write.c @ 457]
02 f794ac54 80a2675c 895a5038 8979ef68 80a03598 Npfs!NpFsdWrite+0xcc (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\fs\npfs\write.c @ 93]

第二部分:
NTSTATUS
NpFsdWrite (
    IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
    IN PIRP Irp
    )
{
    InitializeListHead (&DeferredList);

    (VOID) NpCommonWrite( IrpSp->FileObject,
                          Irp->UserBuffer,
                          IrpSp->Parameters.Write.Length,
                          Irp->Tail.Overlay.Thread,
                          &Iosb,
                          Irp,
                          &DeferredList );

第三部分:
BOOLEAN
NpCommonWrite (
    IN PFILE_OBJECT FileObject,
    IN PVOID WriteBuffer,
    IN ULONG WriteLength,
    IN PETHREAD UserThread,
    OUT PIO_STATUS_BLOCK Iosb,
    IN PIRP Irp OPTIONAL,
    IN PLIST_ENTRY DeferredList
    )
{
。。。。。。
        Iosb->Status = NpWriteDataQueue( WriteQueue,
                                         ReadMode,
                                         WriteBuffer,
                                         WriteLength,
                                         Ccb->Fcb->Specific.Fcb.NamedPipeType,
                                         &WriteRemaining,
                                         Ccb,
                                         NamedPipeEnd,
                                         UserThread,
                                         DeferredList );

第四部分:
NTSTATUS
NpWriteDataQueue (
    IN PDATA_QUEUE WriteQueue,
    IN READ_MODE ReadMode,
    IN PUCHAR WriteBuffer,
    IN ULONG WriteLength,
    IN NAMED_PIPE_TYPE PipeType,
    OUT PULONG WriteRemaining,
    IN PCCB Ccb,
    IN NAMED_PIPE_END NamedPipeEnd,
    IN PETHREAD UserThread,
    IN PLIST_ENTRY DeferredList
    )

{
。。。。。。

        if (*WriteRemaining == 0) {

            DebugTrace(0, Dbg, "Finished up the write remaining\n", 0);

            //**** ASSERT( ReadIrp->IoStatus.Information != 0 );

            NpDeferredCompleteRequest( ReadIrp, STATUS_SUCCESS, DeferredList );


#define NpDeferredCompleteRequest(IRP,STATUS,LIST) {           \
    (IRP)->IoStatus.Status = STATUS;                           \
    InsertTailList ((LIST), &(IRP)->Tail.Overlay.ListEntry);   \
}

第五部分:


    (VOID) NpCommonWrite( IrpSp->FileObject,
                          Irp->UserBuffer,
                          IrpSp->Parameters.Write.Length,
                          Irp->Tail.Overlay.Thread,
                          &Iosb,
                          Irp,
                          &DeferredList );

    NpReleaseVcb();

    //
    // Complete any deferred IRPs now we have dropped the locks
    //
    NpCompleteDeferredIrps (&DeferredList);

VOID
FORCEINLINE
NpCompleteDeferredIrps (
    IN PLIST_ENTRY DeferredList
    )
{
    PIRP Irp;
    PLIST_ENTRY Entry, NextEntry;

    Entry = DeferredList->Flink;
    while (Entry != DeferredList) {
        Irp = CONTAINING_RECORD (Entry, IRP, Tail.Overlay.ListEntry);
        NextEntry = Entry->Flink;
        NpCompleteRequest (Irp, Irp->IoStatus.Status);
        Entry = NextEntry;
    }
}


#define NpCompleteRequest(IRP,STATUS) FsRtlCompleteRequest( (IRP), (STATUS) );

#define FsRtlCompleteRequest(IRP,STATUS) {         \
    (IRP)->IoStatus.Status = (STATUS);             \
    IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \
}

#define IO_DISK_INCREMENT               1

http://www.dtcms.com/a/107223.html

相关文章:

  • Python运算符的理解及简单运用
  • 《数字图像处理》教材寻找合作者
  • 【Java NIO】
  • 4.2学习总结 Java:list系列集合
  • 简单路径计数
  • 深度解析Python与ActiveMQ的完美交互
  • CF580B Kefa and Company(滑动窗口)
  • Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
  • 尚语翻译图册翻译|专业图册翻译|北京专业翻译公司推荐|专业文件翻译报价
  • 开发体育赛事直播系统主播认证功能技术实现方案
  • 体重秤PCBA电路方案组成结构
  • 【CSS3】05-定位 + 修饰属性
  • XSS漏洞的分类解释和演示实验
  • dfs(基于BFS的dfs)力扣37.解数独力扣79.单词搜索力扣1219.黄金矿工力扣980.不同路径III
  • linux shell 删除空行(remove empty lines)
  • 12-leveldb优化读性能的方法
  • agent报告
  • Linux命令-inotifywait
  • 继承与组合
  • LlamaIndex实现RAG增强:融合检索(Fusion Retrieval)与混合检索(Hybrid Search)
  • [ 取证 ]取证学习,工具使用, 赛题复现
  • Day 6
  • 在Android中创建DialogFragment
  • 【光电集成电路技术】基于单片机的音乐梦幻灯与USB转接器设计,电子琴硬件组成及仿真电路实现
  • 【Java 优选算法】二分算法(下)
  • OpenGL进阶系列20 - OpenGL SuperBible - bindlesstex 例子学习
  • Flutter求助贴
  • 失效模式分析(FMEA)、控制计划(CP)、流程图(Flowchart)的无缝衔接与高效管理--全星FMEA软件系统
  • 《自然-方法》2024年度技术:空间蛋白质组学(spatial proteomics)
  • PyArrow 核心技术与应用:高效数据处理与跨生态集成实践