Where do Database Snapshots store the information what pages have been copied to the snapshot files? Database snapshot files are sparse files. Only when a page is modified the sparse file is being written to. Reads of the snapshot must be able to know whether the sparse file contains a copied page or not. How does SQL Server know where to read from? Where is this information stored?
From the Microsoft SQL Server 2012 Internals book:

The snapshot files contain only the data that has changed from the source.  For every file, SQL Server creates a bitmap that is kept in cache, with a bit for each page of the file, indicating whether that page has been copied to the snapshot.  Every time a page in the source is updated, SQL Server checks the bitmap for the file to see if the page has already been copied and if hasn't it is copied at that time.  This operation is called a copy-on-write operation.
The bitmap is stored in cache, not the file itself, so it is always readily available.  When SQL Server shuts down or the database is closed, the bitmaps are lost and need to be reconstructed at database startup.

When performing reads, SQL Server checks the snapshot bitmap to determine where to read from.