📄 fastio.c
字号:
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)
{
Ext2DbgPrint(D_FASTIO,"Ext2FastIoLock: %-16.16s %-31s *** Status: FALSE ***\n",
(PUCHAR) Process + gProcessNameOffset,
"FASTIO_LOCK"
);
}
else if (IoStatus->Status != STATUS_SUCCESS)
{
Ext2DbgPrint(D_FASTIO, "Ext2FastIoLock: %-16.16s %-31s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + gProcessNameOffset,
"FASTIO_LOCK",
Ext2DbgNtStatusToString(IoStatus->Status),
IoStatus->Status
);
}
#endif
return Status;
}
BOOLEAN
Ext2FastIoUnlockSingle (
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;
PEXT2_FCB Fcb;
__try
{
__try
{
if (DeviceObject == gExt2Global->DeviceObject)
{
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Fcb = (PEXT2_FCB) FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == EXT2VCB)
{
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
(Fcb->Identifier.Size == sizeof(EXT2_FCB)));
if (FlagOn(Fcb->Ext2Mcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY))
{
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
#if DBG
Ext2DbgPrint(D_FASTIO,"Ext2FastIoUnlockSingle: %-16.16s %-31s %s\n",
(PUCHAR) Process + gProcessNameOffset,
"FASTIO_UNLOCK_SINGLE",
Fcb->AnsiFileName.Buffer );
#endif
Ext2DbgPrint(D_FASTIO,"Ext2FastIoUnlockSingle: Offset: %I64u Length: %I64u 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)
{
Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockSingle: %-16.16s %-31s *** Status: FALSE ***\n",
(PUCHAR) Process + gProcessNameOffset,
"FASTIO_UNLOCK_SINGLE" );
}
else if (IoStatus->Status != STATUS_SUCCESS)
{
Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockSingle: %-16.16s %-31s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + gProcessNameOffset,
"FASTIO_UNLOCK_SINGLE",
Ext2DbgNtStatusToString(IoStatus->Status),
IoStatus->Status );
}
#endif
return Status;
}
BOOLEAN
Ext2FastIoUnlockAll (
IN PFILE_OBJECT FileObject,
IN PEPROCESS Process,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject)
{
BOOLEAN Status = FALSE;
PEXT2_FCB Fcb;
__try
{
__try
{
if (DeviceObject == gExt2Global->DeviceObject)
{
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Fcb = (PEXT2_FCB) FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == EXT2VCB)
{
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
(Fcb->Identifier.Size == sizeof(EXT2_FCB)));
if (FlagOn(Fcb->Ext2Mcb->FileAttr ,FILE_ATTRIBUTE_DIRECTORY))
{
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
#if DBG
Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockSingle: %-16.16s %-31s %s\n",
(PUCHAR) Process + gProcessNameOffset,
"FASTIO_UNLOCK_ALL",
Fcb->AnsiFileName.Buffer
);
#endif
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)
{
Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockSingle: %-16.16s %-31s *** Status: FALSE ***\n",
(PUCHAR) Process + gProcessNameOffset,
"FASTIO_UNLOCK_ALL"
);
}
else if (IoStatus->Status != STATUS_SUCCESS)
{
Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockSingle: %-16.16s %-31s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + gProcessNameOffset,
"FASTIO_UNLOCK_ALL",
Ext2DbgNtStatusToString(IoStatus->Status),
IoStatus->Status
);
}
#endif
return Status;
}
BOOLEAN
Ext2FastIoUnlockAllByKey (
IN PFILE_OBJECT FileObject,
IN PEPROCESS Process,
IN ULONG Key,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
)
{
BOOLEAN Status = FALSE;
PEXT2_FCB Fcb;
__try
{
__try
{
if (DeviceObject == gExt2Global->DeviceObject)
{
IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
Status = TRUE;
__leave;
}
Fcb = (PEXT2_FCB) FileObject->FsContext;
ASSERT(Fcb != NULL);
if (Fcb->Identifier.Type == EXT2VCB)
{
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
(Fcb->Identifier.Size == sizeof(EXT2_FCB)));
if (FlagOn(Fcb->Ext2Mcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY))
{
IoStatus->Status = STATUS_INVALID_PARAMETER;
Status = TRUE;
__leave;
}
#if DBG
Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockAllByKey: %-16.16s %-31s %s\n",
(PUCHAR) Process + gProcessNameOffset,
"FASTIO_UNLOCK_ALL_BY_KEY",
Fcb->AnsiFileName.Buffer
);
#endif
Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockAllByKey: 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)
{
Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockAllByKey: %-16.16s %-31s *** Status: FALSE ***\n",
(PUCHAR) Process + gProcessNameOffset,
"FASTIO_UNLOCK_ALL_BY_KEY"
);
}
else if (IoStatus->Status != STATUS_SUCCESS)
{
Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockAllByKey: %-16.16s %-31s *** Status: %s (%#x) ***\n",
(PUCHAR) Process + gProcessNameOffset,
"FASTIO_UNLOCK_ALL_BY_KEY",
Ext2DbgNtStatusToString(IoStatus->Status),
IoStatus->Status
);
}
#endif
return Status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -