2011-01-28 8 views
3

필자는 필자의 시스템에서 특정 크기로 생성 된 메모리 매핑 된 파일은 기본적으로 항상 완전히 제로화되어 있음을 경험적으로 판단했습니다. 예를 들어, 전화Windows 메모리 매핑 파일 내용은 기본적으로 항상 0으로 설정되어 있습니까?

HANDLE hMM = 
    CreateFileMapping (h, 
         NULL, 
         PAGE_READWRITE, 
         0, 
         0x01400000,//20MB 
         NULL); 

를 사용하여 .. 해당 파일의 매핑 된 뷰에 쓰기는 항상 완전히 I 제로가 아닌 데이터를 작성한 경우를 제외하고 0으로 채우 약 20MB의 파일에 발생합니다.

파일의 초기화되지 않은 부분을 0으로 가정 할 수 있는지 궁금합니다. 이 동작은 일반적으로 Windows에서 보장됩니까?

답변

6

CreateFileMapping 문서 (설명 절) 명시 적으로 파일이 확장되는 경우, 파일의 이전 끝과 파일의 새 끝 사이의 파일의 내용이 보장되지 않습니다

한다고 0이되도록; 동작은 파일 시스템에 의해 정의됩니다. 디스크에있는 파일이 비어 시작하면

때문에, 그것은 (당신이 그것을 확장되기 때문에) 하지 보장이 제로가 될 수 있어요; 나는 파일 시스템 드라이버가 잠재적으로 민감한 정보를 누설 할 위험을 감수하고 있다고 생각하지만, 일부 파일 시스템 드라이버는 이미 프로세스에 사용 된 페이지를 재활용합니다 (보안 위험이 있어서는 안됩니다).

반면에 보안을 전혀 제공하지 않는 파일 시스템 (예 : FAT)이 클러스터의 새 부분에 할당 된 클러스터의 컨텐츠를 제공 할 수 있을지는 모르겠습니다. 파일.

당신이 얻을 메모리가 모두 제로입니다 대신에, 당신은 디스크에있는 파일이 아니라이 보장된다 페이징 파일이 백업되지 메모리 섹션을 만들, 경우 :의 페이지의

초기 내용을 운영 체제 페이징 파일이 지원하는 파일 매핑 개체는 0입니다.

메모리 전용 페이징 파일을 만들 때 메모리 관리자가 현재 진행 상황을 완벽하게 제어하고 비어있는 페이지 풀에서 페이지를 가져 오기 때문입니다.

6

새로 할당 된 모든 페이지는 커널 모드 나 다른 프로세스에서 민감한 정보가 유출 될 수 있기 때문에 사용자 모드에 액세스하기 전에 0으로 설정됩니다. 이는 NtAllocateVirtualMemory/VirtualAllocNtCreateSection/CreateFileMapping과 같은 항목에 적용됩니다.

괜찮은 파일 시스템이 이런 방식으로 정보를 유출하고 싶지 않기 때문에 동일한 개념이 파일로 확장된다고 상상해보십시오.

EDIT : 그러나 마지막 단락을 소금으로 만듭니다. CreateFileMapping에 대한 설명서와 SetEndOfFile은 파일의 확장 부분이 정의되지 않았다고 주장합니다. 좀 더 조사 할게.

EDIT 2 : 확인, Win32 MSDN 설명서 은 틀림없이입니다.ZwSetInformationFile 상태에 대한 문서 : 당신이 FileEndOfFileInformation에 FileInformationClass을 설정하고 FILE_END_OF_FILE_INFORMATION의 EndOfFile 구성원이 지정하는 경우

현재 파일 끝 마크를 넘어 오프셋, ZwSetInformationFile 파일 및 패드를 확장 0을 포함한 확장입니다.

여기에 있습니다. 확장 부분 이 0으로 보장됩니다.

+1

그래도 구현 세부 정보가 아닌 사용중인 인터페이스 계약을 준수해야합니다. 'CreateFileMapping' 문서가 보증되지 않는다고 (* 명시 적으로!) 밝혀 졌다면 * 보장되지 않습니다 *. 'ZwSetInformationFile' *은 구현 세부 사항입니다. Windows 9x에서는'ZwSetInformationFile'이 존재하지 않았고 Windows 12에서는 더 이상 존재하지 않습니다. –

+0

@Matteo Italia : 거짓말. Win32는 거짓말로 가득차 있으며 Native API를 사용하여 MSDN에서 Win32 설명서를 신뢰할 수 없었습니다. Windows Internals Expert로서 필자는 Win32에서 주장하는 진실이 아니라 실제로 일어난 일에 대해 진실을 말하기 위해 왔습니다. : D – wj32

+2

@ wj32 : 실제로 Win32는 응용 프로그램을 Win32s에서 NT, 9x 및 Microsoft가 미래에 생각할 커널에서 원활하게 작동하도록하기 위해 플랫폼에 특정한 구현에 의존하지 않고 "거짓으로 가득 차게"설계되었습니다. 세부. 잘 작동하는 Win32 응용 프로그램은 Win32 계약을 통해 향후 Windows 버전에서 계속 작동해야합니다. Raymond Chen의 블로그를 읽지 않으셨습니까? ':)' –

1

예, wj32에서 지적한대로. 이것은 NT가 태어난 이래로 만난 c2 요구 사항과 관련이 있습니다. 그러나 무엇을하려고하는지에 따라 스파 스 파일을 조사해야합니다.