/* File was accessed */
FileObject->Flags |= FO_FILE_FAST_IO_READ;
- if (Result == TRUE)
+ if (Result != FALSE)
{
ASSERT((IoStatus->Status == STATUS_END_OF_FILE) ||
(((ULONGLONG)FileOffset->QuadPart + IoStatus->Information) <=
}
/* Update the current file offset */
- if (Result == TRUE)
+ if (Result != FALSE)
{
FileObject->CurrentByteOffset.QuadPart = FileOffset->QuadPart + IoStatus->Information;
}
return FALSE;
}
+ /* Already init IO_STATUS_BLOCK */
+ IoStatus->Status = STATUS_SUCCESS;
+ IoStatus->Information = Length;
+
/* No actual read */
if (!Length)
{
- IoStatus->Status = STATUS_SUCCESS;
- IoStatus->Information = Length;
return TRUE;
}
* If we append, use the file size as offset.
* Also, check that we aren't crossing the 4GB boundary.
*/
- if (FileOffsetAppend == TRUE)
+ if (FileOffsetAppend != FALSE)
{
Offset.LowPart = FcbHeader->FileSize.LowPart;
NewSize.LowPart = FcbHeader->FileSize.LowPart + Length;
/* Then we need to acquire the resource exclusive */
ExReleaseResourceLite(FcbHeader->Resource);
ExAcquireResourceExclusiveLite(FcbHeader->Resource, TRUE);
- if (FileOffsetAppend == TRUE)
+ if (FileOffsetAppend != FALSE)
{
Offset.LowPart = FcbHeader->FileSize.LowPart; // ??
NewSize.LowPart = FcbHeader->FileSize.LowPart + Length;
PsGetCurrentThread()->TopLevelIrp = 0;
/* Did the operation succeed? */
- if (Result == TRUE)
+ if (Result != FALSE)
{
/* Update the valid file size if necessary */
if (NewSize.LowPart > FcbHeader->ValidDataLength.LowPart)
}
/* Check if we are appending */
- if (FileOffsetAppend == TRUE)
+ if (FileOffsetAppend != FALSE)
{
Offset.QuadPart = FcbHeader->FileSize.QuadPart;
NewSize.QuadPart = FcbHeader->FileSize.QuadPart + Length;
}
/* Check if we are appending */
- if (FileOffsetAppend == TRUE)
+ if (FileOffsetAppend != FALSE)
{
Offset.QuadPart = FcbHeader->FileSize.QuadPart;
NewSize.QuadPart = FcbHeader->FileSize.QuadPart + Length;
Exclusive = TRUE;
ResourceToAcquire = FcbHeader->Resource;
}
- else if (!FcbHeader->PagingIoResource ||
+ else if (!FcbHeader->PagingIoResource ||
(FcbHeader->Flags & FSRTL_FLAG_ACQUIRE_MAIN_RSRC_SH))
{
/* Acquire main resource shared if flag is specified or
*--*/
NTSTATUS
NTAPI
-FsRtlRegisterFileSystemFilterCallbacks(IN PDRIVER_OBJECT FilterDriverObject,
- IN PFS_FILTER_CALLBACKS Callbacks)
+FsRtlRegisterFileSystemFilterCallbacks(
+ PDRIVER_OBJECT FilterDriverObject,
+ PFS_FILTER_CALLBACKS Callbacks)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PFS_FILTER_CALLBACKS NewCallbacks;
+ PEXTENDED_DRIVER_EXTENSION DriverExtension;
+ PAGED_CODE();
+
+ /* Verify parameters */
+ if ((FilterDriverObject == NULL) || (Callbacks == NULL))
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Allocate a buffer for a copy of the callbacks */
+ NewCallbacks = ExAllocatePoolWithTag(NonPagedPool,
+ Callbacks->SizeOfFsFilterCallbacks,
+ 'gmSF');
+ if (NewCallbacks == NULL)
+ {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Copy the callbacks */
+ RtlCopyMemory(NewCallbacks, Callbacks, Callbacks->SizeOfFsFilterCallbacks);
+
+ /* Set the callbacks in the driver extension */
+ DriverExtension = (PEXTENDED_DRIVER_EXTENSION)FilterDriverObject->DriverExtension;
+ DriverExtension->FsFilterCallbacks = NewCallbacks;
+
+ return STATUS_SUCCESS;
}