Почему мой код WDK повторяется STATUS_WORKING_SET_QUOTA

Моя функция devWriteFile имитирует ZwWriteFile, Исходный код:

    NTSTATUS devWriteFile(
    _In_ HANDLE FileHandle,
    _In_ PFILE_OBJECT FileObject,
    _Out_ PIO_STATUS_BLOCK IoStatusBlock,
    _In_reads_bytes_(Length) PVOID Buffer,
    _In_ ULONG Length,
    _In_opt_ PLARGE_INTEGER ByteOffset,
    _In_ PDEVICE_OBJECT pDeviceObject
    )
{
    NTSTATUS status;
    PIRP pIrp;
    KEVENT hEvent;
    PIO_STACK_LOCATION stack;
    //因为打算让这个请求同步完成,所以初始化一个事件
    //用来等待请求完成
    /*status = ObReferenceObjectByHandle(FileHandle,FILE_WRITE_DATA,*IoFileObjectType,
                                       KernelMode,(PVOID*)&FileObject,NULL);
    if (!NT_SUCCESS(status)) return status;*/
    KeInitializeEvent(&hEvent, SynchronizationEvent, FALSE);

    //分配IRP
    pIrp = IoAllocateIrp(pDeviceObject->StackSize, FALSE);
    if(NULL == pIrp)
    {
        //ObDereferenceObject(FileObject);
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    //填写IRP的主体

    /*if (FileObject->Flags & FO_WRITE_THROUGH) pIrp->Flags |= SL_WRITE_THROUGH;
    if (FileObject->Flags & FO_NO_INTERMEDIATE_BUFFERING) pIrp->Flags |= IRP_NOCACHE;*/

    //读写缓冲区不要用Systembuffer,用UserBuffer(非缓冲区方式),
    //这样可以防止影响文件缓冲
    pIrp->AssociatedIrp.SystemBuffer = NULL;
    pIrp->MdlAddress = NULL;
    pIrp->UserBuffer = Buffer;
    pIrp->UserEvent = &hEvent;
    pIrp->UserIosb = IoStatusBlock;
    pIrp->Tail.Overlay.Thread = PsGetCurrentThread();
    pIrp->Tail.Overlay.OriginalFileObject = FileObject;
    pIrp->RequestorMode = KernelMode;
    pIrp->Flags = IRP_DEFER_IO_COMPLETION | IRP_WRITE_OPERATION |IRP_NOCACHE;

    //设置stack
    stack = IoGetNextIrpStackLocation(pIrp);
    stack->MajorFunction = IRP_MJ_WRITE;
    stack->MinorFunction = IRP_MN_NORMAL;
    stack->DeviceObject = pDeviceObject;
    stack->FileObject = FileObject;
    //stack->Flags = FileObject->Flags & FO_WRITE_THROUGH ? SL_WRITE_THROUGH : 0;
    stack->Parameters.Write.Key = NULL;
    stack->Parameters.Write.ByteOffset = *ByteOffset;
    stack->Parameters.Write.Length = Length;

    //KdPrint(("%d\n",Length));
    //设置结束例程
    IoSetCompletionRoutine(pIrp, MyCompletionRoutine, 0, TRUE, TRUE, TRUE);

    //发送请求并就等待结束
    status = IoCallDriver(pDeviceObject, pIrp);
    if (STATUS_PENDING == status)//若状态是 挂起
    {
        KdPrint(("等待事件结束\n"));
        KeWaitForSingleObject(&hEvent, Executive, KernelMode, TRUE, 0);
    }
    //ObDereferenceObject(FileObject);
    return pIrp->IoStatus.Status;//return STATUS_WORKING_SET_QUOTA
}

Но при записи размер файла превышает ограничение (10 МБ) и pIrp->IoStatus.Status установлен в STATUS_WORKING_SET_QUOTA, Кто может сказать мне, почему? А у вас есть ZwWriteFile исходный код?

0 ответов

Другие вопросы по тегам