Почему мой код 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
исходный код?