NTSTATUS ddrv_MoveFileBlock( SPEED_DEVICE_EXTENSION* apDevExt, HANDLE ahFile, ULONGLONG aullStartVcn, ULONGLONG aullTargetLcn, ULONGLONG aullClusters )
{
ULONG lulStatus;
IO_STATUS_BLOCK lIoStatusBlock;
if( KeReadStateEvent( &apDevExt->mStopEvent ) == 0x1 )
{
ddrv_exitDefrag( apDevExt , 1 );
return STATUS_ABANDONED;
}
apDevExt->mpMoveFile->FileHandle = ahFile;
apDevExt->mpMoveFile->StartVcn.QuadPart = aullStartVcn;
apDevExt->mpMoveFile->TargetLcn.QuadPart = aullTargetLcn;
#ifdef _WIN64
apDevExt->mpMoveFile->NumVcns = aullClusters;
#else
apDevExt->mpMoveFile->NumVcns = ( ULONG )aullClusters;
#endif
lulStatus = ZwFsControlFile( apDevExt->mhVolume, NULL, NULL, 0, &lIoStatusBlock, FSCTL_MOVE_FILE, apDevExt->mpMoveFile, sizeof( MOVEFILE_DESCRIPTOR ), NULL, 0 );
if( lulStatus == STATUS_PENDING )
{
NtWaitForSingleObject( ahFile, FALSE, NULL );
lulStatus = lIoStatusBlock.Status;
}
if ( lulStatus != STATUS_SUCCESS )
{
DebugPrint("Move Unsuccessful : %x", ( UINT )lulStatus );
DebugPrint(" aullStartVcn %I64u aullTargetLcn %I64u mTotalClusters %I64u", aullStartVcn, aullTargetLcn, apDevExt->mTotalClusters );
}
return lulStatus;
}
No comments:
Post a Comment