【オリジナル】カーネルドライバファイルリダイレクトプラスコード

4939 ワード


作成者:
defddr
時間:2010-11-10,00:02:38
リンク:http://bbs.pediy.com/showthread.php?t=124524
最近、カーネルドライバのファイルリダイレクトについて学びました.今まとめて、みんなに役に立つことを望みます
逆フォーラムでファイルフィルタリングドライバを発表するのは間違いですか?  私はこれらが基礎的なものであることを認めます. しかし、仕事の成果を発表できない私がいくつかの実験プログラムの副産物を発表したのも、皆さんと分かち合うためです.
あれは何? (Mummy) 巨児たちが登ったのはŽižkovのテレビ塔はかつて最も醜い建物に選ばれた. 地元の大衆にも芸術的寛容さで受け入れられたのではないか.
寛容にしてください  大して笑っては通れないだろう  もちろん 管理人がエッセンスをあげるのが一番いいです. ありがとう
MINIFILTER再配置コード(プラス)が最近追加されました 指定したファイルをメモリに再配置する実験コードを添付します.
額  本当は目を引きたいわけじゃない 実験コードだけを強調します
リダイレクトすると、あるAファイルに対する操作が直接Bファイルに移行する.読み書き 、長さやファイル末尾ポインタなどのプロパティ、さらには削除操作を設定します.
カーネルドライバのファイルリダイレクトは主に復号化に使用されます.暗号化されたファイルを開くと、隠した一時ファイルにコピーし、復号化して開き、保存すると一時ファイルを暗号化して元のファイルを上書きします.
あるいは、ファイルなどのオブジェクトのリダイレクトを開き、システムの復元に使用し、リダイレクト技術を使用してアプリケーションデータとオペレーティングシステムデータを分離して記憶し、システムを保護する役割を果たす.
以下は  SFILTERフレームの ファイルリダイレクト
相対MINIFILTERフレームワーク SFILTERは複雑に見えます ただし、パーティション間でボリューム間でファイルのリダイレクトを行うことができます.
設定ファイルのプロパティをクエリーしても 読み書き ファイルなどを削除 ファイルを開くことで始まります カーネルでファイルを開くと--Create
経路を入れ替えて再配置するのもここからです
コード:
PDEVICE_EXTENSION deviceExtension; 
PDEVICE_OBJECT attachedDevice; 


///////////////////////////////////////////////////////////////////
//    IRP         IRP      
//                   
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp); 
NTSTATUS status; 
PFILE_OBJECT FileObject = irpSp->FileObject; 
LARGE_INTEGER offset = irpSp->Parameters.Read.ByteOffset; 
ULONG length = irpSp->Parameters.Read.Length; 


WCHAR nameBuf[512]; 
UNICODE_STRING name; 
UNICODE_STRING sourceName; 
UNICODE_STRING destinationName; 
////////////////////////////////////////////////////
//  IF        
if(!(DeviceObject->DriverObject==FsDriverObject)) 
{ 
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; 
Irp->IoStatus.Information = 0; 
status = Irp->IoStatus.Status; 
IoCompleteRequest(Irp, IO_NO_INCREMENT); 
return status; 
} 


deviceExtension = DeviceObject->DeviceExtension; 
attachedDevice = deviceExtension->FileSystemDeviceObject; 

if(deviceExtension->RealDeviceObject==NULL) 
{ 
IoSkipCurrentIrpStackLocation(Irp); 
return IoCallDriver(attachedDevice,Irp); 
} 


//////////////////////////////////////////////////////////
//               
RtlInitUnicodeString( &sourceName, L"\\\\globaluser.txt" ); 

RtlInitEmptyUnicodeString(&name,nameBuf,512); 
//  IRP                                         
if (FileObject&&RtlCompareUnicodeString( &sourceName, &FileObject->FileName, TRUE ) == 0) 
{ 

RtlCopyUnicodeString(&name,&FileObject->FileName); 

DbgPrint("File Name: %ws",(&name)->Buffer); 

ExFreePool(FileObject->FileName.Buffer); 
FileObject->FileName.Length = 0; 
FileObject->FileName.MaximumLength = name.MaximumLength; 
FileObject->FileName.Buffer=(PWCHAR)ExAllocatePool(NonPagedPool, name.MaximumLength); 

RtlInitUnicodeString( &destinationName, L"\\\\??\\\\G:\\user\\globaluser.txt" ); 
RtlCopyUnicodeString(&FileObject->FileName, &destinationName); 

FileObject->FileName.Buffer[FileObject->FileName.Length/2] = UNICODE_NULL; 
//                              BUFFER         
//           REPARSE         IRP  
Irp->IoStatus.Status = STATUS_REPARSE; 
Irp->IoStatus.Information = IO_REPARSE; 
IoCompleteRequest( Irp, IO_NO_INCREMENT ); 


return STATUS_REPARSE; 

} 
else 
{ 
IoSkipCurrentIrpStackLocation(Irp); 
return IoCallDriver(attachedDevice,Irp); 
} 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
同様にMINIFILTERもCREATEから再配置している
コードは比較的簡単です
パス名を単純に置き換えるかどうか reparseに戻るのは簡単だ
私が把握している情報では、パーティション間でボリューム間で再配置できないようです. 
コード:
FileName = &(FileObject->FileName); //     
FileNameBuffer = ExAllocatePool( NonPagedPool,NewFileName.MaximumLength ); //    UNICODE       
if (!FileNameBuffer) //         
{ 
// Not enough resources. Complete the IRP with the appropriate status. 
Data->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; 
Data->IoStatus.Information = 0; 
return FLT_PREOP_SUCCESS_WITH_CALLBACK; 
} 
ExFreePool( FileName->Buffer );//        BUFFER
FileName->Buffer = FileNameBuffer; //  
FileName->MaximumLength = NewFileName.MaximumLength; 
RtlCopyUnicodeString( FileName, &NewFileName ); 
FltSetCallbackDataDirty(Data); //                    dirty          

MINIFILTERフレームワークPasssthroughで再配置のテストプログラムを書きました
添付ファイルを参照  MINIFILTERの運転方法は passThroughobjchk_へwxp_x 86i 386ディレクトリでINFファイルを右クリックしてインストールを選択  その後DOSウィンドウ(CMDコマンド)を開き「net」と入力 start passthrough  "
「passthroughが正常に実行された」と表示されます.
その後、Cディスクの下にtestフォルダとtest.txtがあることを保証すればよい.  
駆動作用はc:testtest.txtをc:testtestBack.txtに位置決めする
testBack.txtが30 Kになる でもtestは変わらない
このとき読み込み 書き込み などの操作で見られるのもtestBack.txtです
再起動後 testファイルを読み込むと元の内容が見つかります