I didn't remember the normal mapping tutorial uses tangent space in sun lighting. I am not sure if it helps or bothers crazy

As far as I understand there is no way of computing enviroment reflexion in tangent space because they need same coordinate system on every screen pixel.

You will need to perform the tangent space to world space texture normal transformation pixel side so vertex shaders incoming tangent is needed for pixel shading.

Code:
void SpecularVS( 
  in float4 InPos: POSITION, 
  in float3 InNormal: NORMAL,
  in float2 InTex: TEXCOORD0, 
  in float4 InTangent: TEXCOORD2, 
  out float4 OutPos: POSITION, 
  out float2 OutTex: TEXCOORD0, 
  out float3 OutNormal: TEXCOORD1, 
  out float3 OutTangent: TEXCOORD2, 
  out float3 OutViewDir: TEXCOORD3) 
{ 
// Transform the vertex from object space to clip space: 
  OutPos = mul(InPos, matWorldViewProj); 
// Transform the normal from object space to world space: 
  OutNormal = normalize(mul(InNormal, matWorld));
// Transform the tangent from object space to world space: 
  OutTangent = mul( InTangent.xyz, matWorld );
// Pass the texture coordinate to the pixel shader: 
  OutTex = InTex; 
// Calculate a vector from the vertex to the view: 
  OutViewDir = vecViewPos - mul(InPos, matWorld); 
}



then you can compute the world space normal into the pixel shader

Code:
// Read the normal from the normal map and convert from [0..1] to [-1..1] range 
float3 TSNormal = normalize ( ( NormalSample.rgb * 2.0f ) - 1.0f ); 
// Transform tangent space normal to world space
InNormal = normalize(InNormal); 
InTangent = normalize(InTangent); 
float3 BumpNormal = TSNormal.z * inNormal + TSNormal.x * inTangent + TSNormal.y * cross ( InNormal, InTangent );
...


Then you will only need to sustitute 'inNormal' by 'BumpNormal' in next code lines of the shader that worked in world space, not this last version you showed that works in tangent space.

Salud!