📄 fastio.c
字号:
__try {
if (DeviceObject == RfsdGlobal->DeviceObject) {
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Fcb = (PRFSD_FCB) FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == RFSDVCB) {
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == RFSDFCB) &&
(Fcb->Identifier.Size == sizeof(RFSD_FCB)));
if (IsDirectory(Fcb)) {
DbgBreak();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
RfsdPrint((DBG_INFO,
"RfsdFastIoLock: %s %s %s\n",
RfsdGetCurrentProcessName(),
"FASTIO_LOCK",
Fcb->AnsiFileName.Buffer ));
RfsdPrint((DBG_INFO,
"RfsdFastIoLock: Offset: %I64xh Length: %I64xh Key: %u %s%s\n",
FileOffset->QuadPart,
Length->QuadPart,
Key,
(FailImmediately ? "FailImmediately " : ""),
(ExclusiveLock ? "ExclusiveLock " : "") ));
if (Fcb->Header.IsFastIoPossible != FastIoIsQuestionable) {
RfsdPrint((DBG_INFO,
"RfsdFastIoLock: %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) {
RfsdPrint((DBG_ERROR,
"RfsdFastIoLock: %s %s *** Status: FALSE ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_LOCK"
));
} else if (IoStatus->Status != STATUS_SUCCESS) {
RfsdPrint((DBG_ERROR,
"RfsdFastIoLock: %s %s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_LOCK",
RfsdNtStatusToString(IoStatus->Status),
IoStatus->Status
));
}
#endif
return Status;
}
BOOLEAN
RfsdFastIoUnlockSingle (
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;
PRFSD_FCB Fcb;
__try {
__try {
if (DeviceObject == RfsdGlobal->DeviceObject) {
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Fcb = (PRFSD_FCB) FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == RFSDVCB) {
DbgBreak();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == RFSDFCB) &&
(Fcb->Identifier.Size == sizeof(RFSD_FCB)));
if (IsDirectory(Fcb)) {
DbgBreak();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
RfsdPrint((DBG_INFO,
"RfsdFastIoUnlockSingle: %s %s %s\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_SINGLE",
Fcb->AnsiFileName.Buffer ));
RfsdPrint((DBG_INFO,
"RfsdFastIoUnlockSingle: 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) {
RfsdPrint((DBG_ERROR,
"RfsdFastIoUnlockSingle: %s %s *** Status: FALSE ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_SINGLE" ));
} else if (IoStatus->Status != STATUS_SUCCESS) {
RfsdPrint((DBG_ERROR,
"RfsdFastIoUnlockSingle: %s %s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_SINGLE",
RfsdNtStatusToString(IoStatus->Status),
IoStatus->Status ));
}
#endif
return Status;
}
BOOLEAN
RfsdFastIoUnlockAll (
IN PFILE_OBJECT FileObject,
IN PEPROCESS Process,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject)
{
BOOLEAN Status = FALSE;
PRFSD_FCB Fcb;
__try {
__try {
if (DeviceObject == RfsdGlobal->DeviceObject) {
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Fcb = (PRFSD_FCB) FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == RFSDVCB) {
DbgBreak();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == RFSDFCB) &&
(Fcb->Identifier.Size == sizeof(RFSD_FCB)));
if (IsDirectory(Fcb)) {
DbgBreak();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
RfsdPrint((DBG_INFO,
"RfsdFastIoUnlockSingle: %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) {
RfsdPrint((DBG_ERROR,
"RfsdFastIoUnlockSingle: %s %s *** Status: FALSE ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_ALL"
));
} else if (IoStatus->Status != STATUS_SUCCESS) {
RfsdPrint((DBG_ERROR,
"RfsdFastIoUnlockSingle: %s %s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_ALL",
RfsdNtStatusToString(IoStatus->Status),
IoStatus->Status
));
}
#endif
return Status;
}
BOOLEAN
RfsdFastIoUnlockAllByKey (
IN PFILE_OBJECT FileObject,
IN PEPROCESS Process,
IN ULONG Key,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
)
{
BOOLEAN Status = FALSE;
PRFSD_FCB Fcb;
__try {
FsRtlEnterFileSystem();
__try {
if (DeviceObject == RfsdGlobal->DeviceObject) {
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Fcb = (PRFSD_FCB) FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == RFSDVCB) {
DbgBreak();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == RFSDFCB) &&
(Fcb->Identifier.Size == sizeof(RFSD_FCB)));
if (IsDirectory(Fcb)) {
DbgBreak();
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
RfsdPrint((DBG_INFO,
"RfsdFastIoUnlockAllByKey: %s %s %s\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_ALL_BY_KEY",
Fcb->AnsiFileName.Buffer
));
RfsdPrint((DBG_INFO,
"RfsdFastIoUnlockAllByKey: Key: %u\n",
Key
));
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) {
RfsdPrint((DBG_ERROR,
"RfsdFastIoUnlockAllByKey: %s %s *** Status: FALSE ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_ALL_BY_KEY"
));
} else if (IoStatus->Status != STATUS_SUCCESS) {
RfsdPrint((DBG_ERROR,
"RfsdFastIoUnlockAllByKey: %s %s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + ProcessNameOffset,
"FASTIO_UNLOCK_ALL_BY_KEY",
RfsdNtStatusToString(IoStatus->Status),
IoStatus->Status
));
}
#endif
return Status;
}
BOOLEAN
RfsdFastIoQueryNetworkOpenInfo (
IN PFILE_OBJECT FileObject,
IN BOOLEAN Wait,
IN OUT PFILE_NETWORK_OPEN_INFORMATION PFNOI,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
)
{
BOOLEAN bResult = FALSE;
PRFSD_FCB Fcb = NULL;
BOOLEAN FcbResourceAcquired = FALSE;
__try {
FsRtlEnterFileSystem();
if (DeviceObject == RfsdGlobal->DeviceObject) {
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
__leave;
}
Fcb = (PRFSD_FCB) FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == RFSDVCB) {
DbgBreak();
IoStatus->Status = STATUS_INVALID_PARAMETER;
__leave;
}
ASSERT((Fcb->Identifier.Type == RFSDFCB) &&
(Fcb->Identifier.Size == sizeof(RFSD_FCB)));
RfsdPrint((DBG_INFO,
"%-16.16s %-31s %s\n",
PsGetCurrentProcess()->ImageFileName,
"FASTIO_QUERY_NETWORK_OPEN_INFO",
Fcb->AnsiFileName.Buffer
));
if (FileObject->FsContext2) {
__leave;
}
if (!FlagOn(Fcb->Flags, FCB_PAGE_FILE)) {
if (!ExAcquireResourceSharedLite(
&Fcb->MainResource,
Wait
)) {
__leave;
}
FcbResourceAcquired = TRUE;
}
if (IsDirectory(Fcb)) {
PFNOI->AllocationSize.QuadPart = 0;
PFNOI->EndOfFile.QuadPart = 0;
} else {
PFNOI->AllocationSize = Fcb->Header.AllocationSize;
PFNOI->EndOfFile = Fcb->Header.FileSize;
}
PFNOI->FileAttributes = Fcb->RfsdMcb->FileAttr;
if (PFNOI->FileAttributes == 0) {
PFNOI->FileAttributes = FILE_ATTRIBUTE_NORMAL;
}
PFNOI->CreationTime = RfsdSysTime(Fcb->Inode->i_ctime);
PFNOI->LastAccessTime = RfsdSysTime(Fcb->Inode->i_atime);
PFNOI->LastWriteTime = RfsdSysTime(Fcb->Inode->i_mtime);
PFNOI->ChangeTime = RfsdSysTime(Fcb->Inode->i_mtime);
bResult = TRUE;
IoStatus->Status = STATUS_SUCCESS;
IoStatus->Information = sizeof(FILE_NETWORK_OPEN_INFORMATION);
} __finally {
if (FcbResourceAcquired) {
ExReleaseResource(&Fcb->MainResource);
}
FsRtlExitFileSystem();
}
return bResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -