📄 fastio.c
字号:
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Vcb = (PFFS_VCB)DeviceObject->DeviceExtension;
ASSERT(Vcb != NULL);
Fcb = (PFFS_FCB)FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == FFSVCB)
{
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == FFSFCB) &&
(Fcb->Identifier.Size == sizeof(FFS_FCB)));
FFSPrint((DBG_INFO,
"%-16.16s %-31s %s\n",
PsGetCurrentProcess()->ImageFileName,
"FASTIO_QUERY_NETWORK_OPEN_INFO",
Fcb->AnsiFileName.Buffer));
FsRtlEnterFileSystem();
if (!ExAcquireResourceSharedLite(
&Fcb->MainResource,
Wait))
{
Status = FALSE;
__leave;
}
FcbMainResourceAcquired = TRUE;
RtlZeroMemory(Buffer, sizeof(FILE_NETWORK_OPEN_INFORMATION));
/*
typedef struct _FILE_NETWORK_OPEN_INFORMATION {
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER AllocationSize;
LARGE_INTEGER EndOfFile;
ULONG FileAttributes;
} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
*/
if (FS_VERSION == 1)
{
Buffer->CreationTime = FFSSysTime(Fcb->dinode1->di_ctime);
Buffer->LastAccessTime = FFSSysTime(Fcb->dinode1->di_atime);
Buffer->LastWriteTime = FFSSysTime(Fcb->dinode1->di_mtime);
Buffer->ChangeTime = FFSSysTime(Fcb->dinode1->di_mtime);
Buffer->FileAttributes = Fcb->FFSMcb->FileAttr;
Buffer->AllocationSize.QuadPart =
(LONGLONG)(Fcb->dinode1->di_size);
Buffer->EndOfFile.QuadPart =
(LONGLONG)(Fcb->dinode1->di_size);
}
else
{
Buffer->CreationTime = FFSSysTime((ULONG)Fcb->dinode2->di_ctime);
Buffer->LastAccessTime = FFSSysTime((ULONG)Fcb->dinode2->di_atime);
Buffer->LastWriteTime = FFSSysTime((ULONG)Fcb->dinode2->di_mtime);
Buffer->ChangeTime = FFSSysTime((ULONG)Fcb->dinode2->di_mtime);
Buffer->FileAttributes = Fcb->FFSMcb->FileAttr;
Buffer->AllocationSize.QuadPart =
(LONGLONG)(Fcb->dinode2->di_size);
Buffer->EndOfFile.QuadPart =
(LONGLONG)(Fcb->dinode2->di_size);
}
Buffer->FileAttributes = Fcb->FFSMcb->FileAttr;
IoStatus->Information = sizeof(FILE_NETWORK_OPEN_INFORMATION);
IoStatus->Status = STATUS_SUCCESS;
Status = TRUE;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
IoStatus->Status = GetExceptionCode();
Status = TRUE;
}
}
__finally
{
if (FcbMainResourceAcquired)
{
ExReleaseResourceForThreadLite(
&Fcb->MainResource,
ExGetCurrentResourceThread()
);
}
FsRtlExitFileSystem();
}
if (Status == FALSE)
{
FFSPrint((DBG_ERROR,
"%s %s *** Status: FALSE ***\n",
PsGetCurrentProcess()->ImageFileName,
"FASTIO_QUERY_NETWORK_OPEN_INFO"));
}
else if (IoStatus->Status != STATUS_SUCCESS)
{
FFSPrint((DBG_ERROR,
"%s %s *** Status: %s (%#x) ***\n",
PsGetCurrentProcess()->ImageFileName,
"FASTIO_QUERY_NETWORK_OPEN_INFO",
FFSNtStatusToString(IoStatus->Status),
IoStatus->Status));
}
return Status;
}
BOOLEAN
FFSFastIoLock(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN PLARGE_INTEGER Length,
IN PEPROCESS Process,
IN ULONG Key,
IN BOOLEAN FailImmediately,
IN BOOLEAN ExclusiveLock,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject)
{
BOOLEAN Status = FALSE;
PFFS_FCB Fcb;
__try
{
__try
{
if (DeviceObject == FFSGlobal->DeviceObject)
{
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Fcb = (PFFS_FCB)FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == FFSVCB)
{
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == FFSFCB) &&
(Fcb->Identifier.Size == sizeof(FFS_FCB)));
if (IsDirectory(Fcb))
{
FFSBreakPoint();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
FFSPrint((DBG_INFO,
"FFSFastIoLock: %s %s %s\n",
FFSGetCurrentProcessName(),
"FASTIO_LOCK",
Fcb->AnsiFileName.Buffer));
FFSPrint((DBG_INFO,
"FFSFastIoLock: Offset: %I64xh Length: %I64xh Key: %u %s%s\n",
FileOffset->QuadPart,
Length->QuadPart,
Key,
(FailImmediately ? "FailImmediately " : ""),
(ExclusiveLock ? "ExclusiveLock " : "")));
if (Fcb->Header.IsFastIoPossible != FastIoIsQuestionable)
{
FFSPrint((DBG_INFO,
"FFSFastIoLock: %s %s %s\n",
(PUCHAR) Process + ProcessNameOffset,
"FastIoIsQuestionable",
Fcb->AnsiFileName.Buffer));
Fcb->Header.IsFastIoPossible = FastIoIsQuestionable;
}
FsRtlEnterFileSystem();
Status = FsRtlFastLock(
&Fcb->FileLockAnchor,
FileObject,
FileOffset,
Length,
Process,
Key,
FailImmediately,
ExclusiveLock,
IoStatus,
NULL,
FALSE);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
IoStatus->Status = GetExceptionCode();
Status = TRUE;
}
}
__finally
{
FsRtlExitFileSystem();
}
#if DBG
if (Status == FALSE)
{
FFSPrint((DBG_ERROR,
"FFSFastIoLock: %s %s *** Status: FALSE ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_LOCK"));
}
else if (IoStatus->Status != STATUS_SUCCESS)
{
FFSPrint((DBG_ERROR,
"FFSFastIoLock: %s %s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_LOCK",
FFSNtStatusToString(IoStatus->Status),
IoStatus->Status));
}
#endif
return Status;
}
BOOLEAN
FFSFastIoUnlockSingle(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN PLARGE_INTEGER Length,
IN PEPROCESS Process,
IN ULONG Key,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject)
{
BOOLEAN Status = FALSE;
PFFS_FCB Fcb;
__try
{
__try
{
if (DeviceObject == FFSGlobal->DeviceObject)
{
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Fcb = (PFFS_FCB)FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == FFSVCB)
{
FFSBreakPoint();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == FFSFCB) &&
(Fcb->Identifier.Size == sizeof(FFS_FCB)));
if (IsDirectory(Fcb))
{
FFSBreakPoint();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
FFSPrint((DBG_INFO,
"FFSFastIoUnlockSingle: %s %s %s\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_SINGLE",
Fcb->AnsiFileName.Buffer));
FFSPrint((DBG_INFO,
"FFSFastIoUnlockSingle: Offset: %I64xh Length: %I64xh Key: %u\n",
FileOffset->QuadPart,
Length->QuadPart,
Key));
FsRtlEnterFileSystem();
IoStatus->Status = FsRtlFastUnlockSingle(
&Fcb->FileLockAnchor,
FileObject,
FileOffset,
Length,
Process,
Key,
NULL,
FALSE);
IoStatus->Information = 0;
Status = TRUE;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
IoStatus->Status = GetExceptionCode();
Status = TRUE;
}
}
__finally
{
FsRtlExitFileSystem();
}
#if DBG
if (Status == FALSE)
{
FFSPrint((DBG_ERROR,
"FFSFastIoUnlockSingle: %s %s *** Status: FALSE ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_SINGLE"));
}
else if (IoStatus->Status != STATUS_SUCCESS)
{
FFSPrint((DBG_ERROR,
"FFSFastIoUnlockSingle: %s %s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_SINGLE",
FFSNtStatusToString(IoStatus->Status),
IoStatus->Status));
}
#endif
return Status;
}
BOOLEAN
FFSFastIoUnlockAll(
IN PFILE_OBJECT FileObject,
IN PEPROCESS Process,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject)
{
BOOLEAN Status = FALSE;
PFFS_FCB Fcb;
__try
{
__try
{
if (DeviceObject == FFSGlobal->DeviceObject)
{
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Fcb = (PFFS_FCB)FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == FFSVCB)
{
FFSBreakPoint();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == FFSFCB) &&
(Fcb->Identifier.Size == sizeof(FFS_FCB)));
if (IsDirectory(Fcb))
{
FFSBreakPoint();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
FFSPrint((DBG_INFO,
"FFSFastIoUnlockSingle: %s %s %s\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_ALL",
Fcb->AnsiFileName.Buffer));
FsRtlEnterFileSystem();
IoStatus->Status = FsRtlFastUnlockAll(
&Fcb->FileLockAnchor,
FileObject,
Process,
NULL);
IoStatus->Information = 0;
Status = TRUE;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
IoStatus->Status = GetExceptionCode();
Status = TRUE;
}
}
__finally
{
FsRtlExitFileSystem();
}
#if DBG
if (Status == FALSE)
{
FFSPrint((DBG_ERROR,
"FFSFastIoUnlockSingle: %s %s *** Status: FALSE ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_ALL"));
}
else if (IoStatus->Status != STATUS_SUCCESS)
{
FFSPrint((DBG_ERROR,
"FFSFastIoUnlockSingle: %s %s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_ALL",
FFSNtStatusToString(IoStatus->Status),
IoStatus->Status));
}
#endif
return Status;
}
BOOLEAN
FFSFastIoUnlockAllByKey(
IN PFILE_OBJECT FileObject,
IN PEPROCESS Process,
IN ULONG Key,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject)
{
BOOLEAN Status = FALSE;
PFFS_FCB Fcb;
__try
{
__try
{
if (DeviceObject == FFSGlobal->DeviceObject)
{
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Fcb = (PFFS_FCB)FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == FFSVCB)
{
FFSBreakPoint();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == FFSFCB) &&
(Fcb->Identifier.Size == sizeof(FFS_FCB)));
if (IsDirectory(Fcb))
{
FFSBreakPoint();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
FFSPrint((DBG_INFO,
"FFSFastIoUnlockAllByKey: %s %s %s\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_ALL_BY_KEY",
Fcb->AnsiFileName.Buffer));
FFSPrint((DBG_INFO,
"FFSFastIoUnlockAllByKey: Key: %u\n",
Key));
FsRtlEnterFileSystem();
IoStatus->Status = FsRtlFastUnlockAllByKey(
&Fcb->FileLockAnchor,
FileObject,
Process,
Key,
NULL);
IoStatus->Information = 0;
Status = TRUE;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
IoStatus->Status = GetExceptionCode();
Status = TRUE;
}
}
__finally
{
FsRtlExitFileSystem();
}
#if DBG
if (Status == FALSE)
{
FFSPrint((DBG_ERROR,
"FFSFastIoUnlockAllByKey: %s %s *** Status: FALSE ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_ALL_BY_KEY"));
}
else if (IoStatus->Status != STATUS_SUCCESS)
{
FFSPrint((DBG_ERROR,
"FFSFastIoUnlockAllByKey: %s %s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_ALL_BY_KEY",
FFSNtStatusToString(IoStatus->Status),
IoStatus->Status));
}
#endif
return Status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -