diff --git a/dlls/d3dx9_36/Makefile.in b/dlls/d3dx9_36/Makefile.in
index 3b0f062..d10561c 100644
--- a/dlls/d3dx9_36/Makefile.in
+++ b/dlls/d3dx9_36/Makefile.in
@@ -7,7 +7,8 @@ IMPORTLIB = d3dx9
 IMPORTS   = d3d9 d3dx8 kernel32
 
 C_SRCS = \
-	d3dx9_36_main.c
+	d3dx9_36_main.c \
+	effect.c
 
 @MAKE_DLL_RULES@
 
diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec
index c859e94..d4e9d76 100644
--- a/dlls/d3dx9_36/d3dx9_36.spec
+++ b/dlls/d3dx9_36/d3dx9_36.spec
@@ -53,10 +53,10 @@
 @ stub D3DXCreateEffectCompilerFromResourceA
 @ stub D3DXCreateEffectCompilerFromResourceW
 @ stub D3DXCreateEffectEx
-@ stub D3DXCreateEffectFromFileA
-@ stub D3DXCreateEffectFromFileExA
-@ stub D3DXCreateEffectFromFileExW
-@ stub D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr)
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr)
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr)
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr)
 @ stub D3DXCreateEffectFromResourceA
 @ stub D3DXCreateEffectFromResourceExA
 @ stub D3DXCreateEffectFromResourceExW
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
new file mode 100644
index 0000000..2ee7769
--- /dev/null
+++ b/dlls/d3dx9_36/effect.c
@@ -0,0 +1,128 @@
+/*
+ * Direct3D X 9 effect file
+ *
+ * Copyright (C) 2008 Luis Busquets
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#include "config.h"
+#include "wine/port.h"
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "d3dx9.h"
+
+typedef struct D3DXMACRO {
+    LPCSTR Name;
+    LPCSTR Definition;
+} D3DXMACRO, *LPD3DXMACRO;
+
+typedef interface ID3DXInclude *LPD3DXINCLUDE;
+typedef interface ID3DXEffectPool *LPD3DXEFFECTPOOL;
+typedef interface ID3DXEffect *LPD3DXEFFECT;
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
+
+HRESULT WINAPI D3DXCreateEffectFromFileExW(
+  LPDIRECT3DDEVICE9 pDevice,
+  LPWSTR pSrcFile,
+  CONST D3DXMACRO * pDefines,
+  LPD3DXINCLUDE pInclude,
+  LPWSTR pSkipConstants,
+  DWORD Flags,
+  LPD3DXEFFECTPOOL pPool,
+  LPD3DXEFFECT * ppEffect,
+  LPD3DXBUFFER * ppCompilationErrors
+)
+{
+ FIXME("Stub\n");
+ return E_OUTOFMEMORY;
+}
+
+HRESULT WINAPI D3DXCreateEffectFromFileW(
+  LPDIRECT3DDEVICE9 pDevice,
+  LPWSTR pSrcFileW,
+  CONST D3DXMACRO * pDefines,
+  LPD3DXINCLUDE pInclude,
+  DWORD Flags,
+  LPD3DXEFFECTPOOL pPool,
+  LPD3DXEFFECT * ppEffect,
+  LPD3DXBUFFER * ppCompilationErrors
+)
+{
+  HRESULT hr;
+  LPWSTR pSkipConstants;
+  pSkipConstants = HeapAlloc( GetProcessHeap(), 0, 1 * sizeof(WCHAR) );
+  pSkipConstants=NULL;
+  hr=D3DXCreateEffectFromFileExW(pDevice, pSrcFileW, pDefines, pInclude, pSkipConstants, Flags, pPool, ppEffect, ppCompilationErrors);
+  HeapFree( GetProcessHeap(), 0, pSkipConstants);
+  return hr;
+}
+
+HRESULT D3DXCreateEffectFromFileExA(
+  LPDIRECT3DDEVICE9 pDevice,
+  LPCSTR pSrcFile,
+  CONST D3DXMACRO * pDefines,
+  LPD3DXINCLUDE pInclude,
+  LPCSTR pSkipConstants,
+  DWORD Flags,
+  LPD3DXEFFECTPOOL pPool,
+  LPD3DXEFFECT * ppEffect,
+  LPD3DXBUFFER * ppCompilationErrors
+)
+{
+  HRESULT hr;
+  LPWSTR pSrcFileW;
+  LPWSTR pSkipConstantsW;
+  DWORD len;
+  if (!pSrcFile) return D3DXERR_INVALIDDATA;
+  len = MultiByteToWideChar( CP_ACP, 0, pSrcFile, -1, NULL, 0 );
+  pSrcFileW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+  MultiByteToWideChar( CP_ACP, 0, pSrcFile, -1, pSrcFileW, len );
+  len = MultiByteToWideChar( CP_ACP, 0, pSkipConstants, -1, NULL, 0 );
+  pSkipConstantsW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+  MultiByteToWideChar( CP_ACP, 0, pSrcFile, -1, pSrcFileW, len );
+  hr=D3DXCreateEffectFromFileExW(pDevice, pSrcFileW, pDefines, pInclude, pSkipConstantsW, Flags, pPool, ppEffect, ppCompilationErrors);
+  return hr;
+}
+
+HRESULT WINAPI D3DXCreateEffectFromFileA(
+  LPDIRECT3DDEVICE9 pDevice,
+  LPSTR pSrcFile,
+  CONST D3DXMACRO * pDefines,
+  LPD3DXINCLUDE pInclude,
+  DWORD Flags,
+  LPD3DXEFFECTPOOL pPool,
+  LPD3DXEFFECT * ppEffect,
+  LPD3DXBUFFER * ppCompilationErrors
+)
+{
+  HRESULT hr;
+  LPWSTR pSrcFileW = NULL;
+  DWORD len;
+  TRACE ("Reading Shader file %s  \n", pSrcFile);
+  if (!pSrcFile) return D3DXERR_INVALIDDATA;
+  len = MultiByteToWideChar( CP_ACP, 0, pSrcFile, -1, NULL, 0 );
+  pSrcFileW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+  MultiByteToWideChar( CP_ACP, 0, pSrcFile, -1, pSrcFileW, len );
+  hr=D3DXCreateEffectFromFileW(pDevice, pSrcFileW, pDefines, pInclude, Flags, pPool, ppEffect, ppCompilationErrors);
+  return hr;
+}

