Wednesday, July 22, 2009

move file cluster in Kernel mode driver

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: