How to take a screenshot from a DX11 application with MSAA enabled

Being able to create screenshots sequentially from an application is useful if you need to render video or even just for debugging.
Saving a frame buffer as a file can be quite a challenge. Often a frame buffer is not just linear memory, it may be swizzled for improved memory access patterns or in the case of multi-sampling it may actually be larger than you expect.
DX11 provides functions for easily creating screen shots. Here is my code for grabbing an MSAA frame buffer, resolving it into a linear buffer and then saving as a file.
Saving a frame buffer as a file can be quite a challenge. Often a frame buffer is not just linear memory, it may be swizzled for improved memory access patterns or in the case of multi-sampling it may actually be larger than you expect.
DX11 provides functions for easily creating screen shots. Here is my code for grabbing an MSAA frame buffer, resolving it into a linear buffer and then saving as a file.
Source Code
void screenShot(char* filename)
{
HRESULT hr;
ID3D11Texture2D *pBackBuffer = NULL;
hr = g_SwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (LPVOID*)&pBackBuffer );
D3D11_TEXTURE2D_DESC resolveDesc;
pBackBuffer->GetDesc(&resolveDesc);
resolveDesc.Usage = D3D11_USAGE_DEFAULT;
resolveDesc.BindFlags = 0;
resolveDesc.CPUAccessFlags = 0;
resolveDesc.SampleDesc.Count=1; //resolved buffer is not multisampled
resolveDesc.SampleDesc.Quality=0;
ID3D11Texture2D *pResolveBuffer = NULL;
hr = g_d3d11Device->CreateTexture2D(&resolveDesc, NULL, &pResolveBuffer);
g_d3d11DevCon->ResolveSubresource(pResolveBuffer, D3D11CalcSubresource( 0, 0, 1 ), pBackBuffer, D3D11CalcSubresource( 0, 0, 1 ), resolveDesc.Format );
hr=D3DX11SaveTextureToFileA(g_d3d11DevCon,pResolveBuffer,D3DX11_IFF_PNG, filename);
pBackBuffer->Release();
pResolveBuffer->Release();
}
{
HRESULT hr;
ID3D11Texture2D *pBackBuffer = NULL;
hr = g_SwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (LPVOID*)&pBackBuffer );
D3D11_TEXTURE2D_DESC resolveDesc;
pBackBuffer->GetDesc(&resolveDesc);
resolveDesc.Usage = D3D11_USAGE_DEFAULT;
resolveDesc.BindFlags = 0;
resolveDesc.CPUAccessFlags = 0;
resolveDesc.SampleDesc.Count=1; //resolved buffer is not multisampled
resolveDesc.SampleDesc.Quality=0;
ID3D11Texture2D *pResolveBuffer = NULL;
hr = g_d3d11Device->CreateTexture2D(&resolveDesc, NULL, &pResolveBuffer);
g_d3d11DevCon->ResolveSubresource(pResolveBuffer, D3D11CalcSubresource( 0, 0, 1 ), pBackBuffer, D3D11CalcSubresource( 0, 0, 1 ), resolveDesc.Format );
hr=D3DX11SaveTextureToFileA(g_d3d11DevCon,pResolveBuffer,D3DX11_IFF_PNG, filename);
pBackBuffer->Release();
pResolveBuffer->Release();
}