This is what I use for wPos-reconstruction:
Code:
void VS(		
in float4 vPos		   : POSITION,

out float2 OutTex	      : TEXCOORD0,			
out float3 npPos	      : TEXCOORD1,						
out float4 Pos	         : POSITION
)
{
	Pos.xyzw = float4(vPos.xy, 1.f, 1.f);
	
	float2 XY = tan(radians(30)) * float2(1, vecViewPort.y * vecViewPort.z);

	npPos = mul(float4((vPos.xy) * XY, 1, 0), matViewInv).xyz;
	
	OutTex.xy = Pos.xy * float2(1,-1) * 0.5 + 0.5;
	OutTex.xy += vecViewPort.zw * 0.5f;
}

void PS(	
in float2 Tex	      : TEXCOORD0,			
in float3 npPos	   : TEXCOORD1,
//in float4 vPos	      : TEXCOORD2,

out float4 COL :COLOR0
) 
{	
	float Depth = tex2Dlod(DSmp, float4(Tex.xy, 0, 0)).x;
	
	COL.xyz = npPos.xyz * Depth + vecViewPos.xyz;

	//	COL.xyz = tex2D(WPosSmp, Tex).xyz;
	COL.xyz = length(COL.xyz - tex2Dlod(WPosSmp, float4(Tex.xy, 0, 0)).xyz) * 1000;
	COL.w=1;
}

technique Shading
{
	pass P0
	{	
		VertexShader = compile vs_3_0 VS();
		PixelShader  = compile ps_3_0 PS();
	}
}


I'm not using the GS standard pp-stuff since you can't use a custom vertex shader with it and the texture coordinates are weird sometimes. The FOV is hardcoded to 60° here. Note that this is not the actual default arc for views even it is documented this way in the manual (15 is also not the default clip_near..should probably post that in the manual forum too).