Domanda

Ho determinato empiricamente che, sul mio sistema, un file mappato di memoria creato per essere una certa dimensione è sempre completamente azzerato per impostazione predefinita. Ad esempio, utilizzando la chiamata

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

.. e la scrittura in una vista mappata di quel file sempre risultati in un file di 20 MB che è completamente azzerata, tranne quando ho scritto non-zero di dati.

Mi chiedo se le parti non inizializzate del file possono essere considerate zeri. È questo comportamento garantito su Windows in generale?

È stato utile?

Soluzione

Il CreateFileMapping documentazione ( Note sezione) dichiara esplicitamente che

Se il file viene esteso, il contenuto del file tra il vecchio fine del file e la nuova fine del file non sono garantite pari a zero; il comportamento è definito dal file system.

così, se il file sul disco inizia vuota, è non garanzia di essere azzerato (dal momento che si stanno espandendo esso); Non credo che i driver di file system avrebbe preso il rischio di fuga di informazioni potenzialmente sensibili in quel modo, ma chi lo sa, magari un po 'driver del file system ricicla pagine già utilizzate per il processo (e questo non dovrebbe essere un rischio per la sicurezza).

D'altra parte, non so se i file system che non offrono sicurezza a tutti (ad esempio FAT) sarebbe interessato in modo di darvi il contenuto dei cluster che è successo a destinare per la nuova parte del file .

Se, invece, si sta creando una sezione di memoria non supportato da un file su disco, ma per il file di paging è garantito che la memoria che si ottiene è tutto azzerato:

Il contenuto iniziale delle pagine in un oggetto di file di mapping supportato dal file di paging del sistema operativo sono 0 (zero).

Questa è garantito probabilmente perché quando si crea una memoria di file di sola il gestore di memoria ha il completo controllo su quello che sta succedendo paging, e prende le pagine dalle pagine tranciate piscina.

Altri suggerimenti

Tutte le pagine di recente allocate vengono azzerati prima di essere resi accessibili a modalità utente, in quanto le informazioni sensibili altrimenti potrebbe essere fuoriuscito dal kernel-mode o altri processi. Questo vale per le cose come NtAllocateVirtualMemory / VirtualAlloc e NtCreateSection / CreateFileMapping.

Immagino che lo stesso concetto si estende ai file, perché ogni file di sistema decente non vorrebbe far trapelare le informazioni in questo modo.

EDIT: Tuttavia, prendere quel ultimo paragrafo con un grano di sale - sia la documentazione per CreateFileMapping e SetEndOfFile affermazione che la porzione estesa del file non è definito. Farò un po 'di indagini.

EDIT 2: OK, la documentazione di Win32 MSDN è sicuramente sbagliato . La documentazione per ZwSetInformationFile afferma:

Se si imposta FileInformationClass a FileEndOfFileInformation, e la membro EndOfFile di specifica FILE_END_OF_FILE_INFORMATION un offset oltre l'attuale end-of-file marchio, ZwSetInformationFile estende il file e pastiglie dei estensione con zeri.

Così ci si va. La porzione estesa è garantita zero.

Sì, come sottolineato da wj32. Questo si riferisce ai requisiti C2 che NT ha incontrato fin dalla sua nascita. Tuttavia a seconda di ciò che si sta cercando di fare, probabilmente si dovrebbe guardare in file sparse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top