Hi,Driver experts.Help! I am working for a volume filtering.I am build a IRP to write file,but ,I find the file size is not change.then ,I also build the IRP to write the file on other volume device,still failed to change the file size.
codes like as
NTSTATUS IrpWriteFile(
IN PFILE_OBJECT pFileObject,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID Buffer,
IN ULONG BufferLength,
IN PLARGE_INTEGER ByteOffset OPTIONAL)
{
NTSTATUS status = STATUS_SUCCESS;
PDEVICE_OBJECT pDevObj = NULL;
PIRP pIRP = NULL;
KEVENT kEvent = { 0 };
PIO_STACK_LOCATION pIoStackLocation = NULL;
if (NULL == pFileObject)
{
return STATUS_UNSUCCESSFUL;
}
if (NULL == pFileObject->Vpb)
{
return STATUS_UNSUCCESSFUL;
}
pDevObj = pFileObject->Vpb->DeviceObject;
if (NULL == pDevObj)
{
return STATUS_UNSUCCESSFUL;
}
if (NULL == ByteOffset)
{
if (0 == (FO_SYNCHRONOUS_IO & pFileObject->Flags))
{
return STATUS_INVALID_PARAMETER;
}
ByteOffset = &pFileObject->CurrentByteOffset;
}
pIRP = IoAllocateIrp(pDevObj->StackSize, FALSE);
if (NULL == pIRP)
{
return STATUS_UNSUCCESSFUL;
}
KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE);
pIRP->MdlAddress = MmCreateMdl(NULL, Buffer, BufferLength);
if (NULL == pIRP->MdlAddress)
{
IoFreeIrp(pIRP);
return STATUS_INSUFFICIENT_RESOURCES;
}
MmBuildMdlForNonPagedPool(pIRP->MdlAddress);
pIRP->UserEvent = &kEvent;
pIRP->UserIosb = IoStatusBlock;
pIRP->Flags = IRP_WRITE_OPERATION;
pIRP->RequestorMode = KernelMode;
pIRP->Tail.Overlay.Thread = PsGetCurrentThread();
pIRP->Tail.Overlay.OriginalFileObject = pFileObject;
pIoStackLocation = IoGetNextIrpStackLocation(pIRP);
pIoStackLocation->MajorFunction = IRP_MJ_WRITE;
pIoStackLocation->MinorFunction = IRP_MN_NORMAL;
pIoStackLocation->DeviceObject = pDevObj;
pIoStackLocation->FileObject = pFileObject;
pIoStackLocation->Parameters.Write.Length = BufferLength;
pIoStackLocation->Parameters.Write.ByteOffset = *ByteOffset;
IoSetCompletionRoutine(pIRP, CompleteRoutine, NULL, TRUE, TRUE, TRUE);
status = IoCallDriver(pDevObj, pIRP);
if (STATUS_PENDING == status)
{
KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL);
}
return IoStatusBlock->Status;
}