Can someone explain me the rationale behind having these two functions, instead of just one with the combined functionality?
Are there cases when these two are not used as a tight couple?
The reason to have distinct functions is, that aside from defining uniform parameters like the ones for page and cache, CreateFileMapping() can be used to lock a file/range, which is larger than the available address space. MapViewOfFile() can then place and shift a sub range appropriately to make actual contents available in address space.
Because that would disable an important usage scenario, mapping a file that's larger than the amount of virtual memory you are willing to spend.
Or have available. Address space fragmentation puts a limit on the size of the view you can create since a single view requires a contiguous address range. On the 32-bit version of Windows that peters out at around 650 megabytes. Entirely dependent on what DLLs got loaded and the number of heaps created. Creating multiple views is entirely reasonable as well.
You can easily write a little helper function to combine the two.