実行可能ファイルは、メモリ マップされたイメージ ファイルを使用してプロセスのアドレス空間に読み込まれます。 マッピングはセクションによって行われるため、ファイル自体を開く必要も、ハンドルを作成する必要もありません。 ファイル システムは、メモリ マップファイルをサポートしていると仮定して、これらの特別なセマンティクスを適用することを確認する必要があります。 たとえば、このケースを確認する FASTFAT ファイル システム コードは、WDK に含まれている fastfat サンプルの Create.c ソース ファイルの FatOpenExistingFCB 関数にあります。
//
// If the user wants write access to the file, make sure there
// is not a process mapping this file as an image. Any attempt to
// delete the file will be stopped in fileinfo.c
//
// If the user wants to delete on close, check at this
// point though.
//
if (FlagOn(*DesiredAccess, FILE_WRITE_DATA) || DeleteOnClose) {
Fcb->OpenCount += 1;
DecrementFcbOpenCount = TRUE;
if (!MmFlushImageSection( &Fcb->NonPaged->SectionObjectPointers,
MmFlushForWrite )) {
Iosb.Status = DeleteOnClose ? STATUS_CANNOT_DELETE :STATUS_SHARING_VIOLATION;
try_return( Iosb );
}
}
したがって、ファイル システムは、ファイルが開かなくても、実行可能イメージを含むメモリ マップファイルを削除できないようにします。