0

System Internals が提供する SDelete アプリケーションを使用して安全な方法でファイルを削除していましたが、いくつかのファイルが残っているという問題に遭遇しました。私はなんとかSDeleteソースコードを入手し、少し掘り下げた後、ファイルシステム圧縮オプションを使用して圧縮されたファイルでのみ問題が発生し、それらが728バイト未満である場合にのみ発生することがわかりました。問題が発生するコード行は次のとおりです。

    startVcn = 0;
    endOfPrevRun = LLINVALID;
    fileMappings = (PGET_RETRIEVAL_DESCRIPTOR) fileMap;
    while( !(status = NtFsControlFile( FileHandle, NULL, NULL, 0, &ioStatus, FSCTL_GET_RETRIEVAL_POINTERS, &startVcn, sizeof( startVcn ),fileMappings, FILEMAPSIZE * sizeof(ULONGLONG) ) ) 
        || status == STATUS_BUFFER_OVERFLOW 
        || status == STATUS_PENDING )

この関数が、圧縮された 728 バイト未満のファイルのファイルハンドルを指定して呼び出された場合、戻り値は 3221225489 "ファイルの終わりに到達しました" です。

おそらく、アプリケーションが最初に作成されたとき、これは古いファイル システム (Windows 7 の場合) で機能しましたが、Windows 7 の変更によりこれが失敗したと思います。

当分の間、GetCompressedFileSize関数を呼び出して問題を回避しました。ファイルが小さすぎる場合は、728 バイトを超えるまでジャンクでパディングします。これは機能しますが、誰かがこれを行うためのより良い方法を提案できるかどうか、または Windows 7 の代替手段があるかどうかを知りたいNtFsControlFileですか?

4

1 に答える 1