Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp	(revision 82717)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp	(revision 82718)
@@ -6908,10 +6908,10 @@
     {
     case SVGA3D_SHADERTYPE_VS:
-        rc = ShaderCreateVertexShader(pContext->pShaderContext, (const uint32_t *)pShaderData, &pShader->u.pVertexShader);
+        rc = ShaderCreateVertexShader(pContext->pShaderContext, (const uint32_t *)pShaderData, cbData, &pShader->u.pVertexShader);
         AssertRC(rc);
         break;
 
     case SVGA3D_SHADERTYPE_PS:
-        rc = ShaderCreatePixelShader(pContext->pShaderContext, (const uint32_t *)pShaderData, &pShader->u.pPixelShader);
+        rc = ShaderCreatePixelShader(pContext->pShaderContext, (const uint32_t *)pShaderData, cbData, &pShader->u.pPixelShader);
         AssertRC(rc);
         break;
Index: /trunk/src/VBox/Devices/Graphics/shaderlib/shader.c
===================================================================
--- /trunk/src/VBox/Devices/Graphics/shaderlib/shader.c	(revision 82717)
+++ /trunk/src/VBox/Devices/Graphics/shaderlib/shader.c	(revision 82718)
@@ -1568,5 +1568,5 @@
     }
     shader->baseShader.frontend = fe;
-    shader->baseShader.frontend_data = fe->shader_init(byte_code, output_signature);
+    shader->baseShader.frontend_data = fe->shader_init(byte_code, shader->baseShader.functionLength / 4, output_signature);
     if (!shader->baseShader.frontend_data)
     {
Index: /trunk/src/VBox/Devices/Graphics/shaderlib/shader_sm1.c
===================================================================
--- /trunk/src/VBox/Devices/Graphics/shaderlib/shader_sm1.c	(revision 82717)
+++ /trunk/src/VBox/Devices/Graphics/shaderlib/shader_sm1.c	(revision 82718)
@@ -213,4 +213,5 @@
 {
     struct wined3d_shader_version shader_version;
+    const DWORD *end;
     const struct wined3d_sm1_opcode_info *opcode_table;
 };
@@ -518,5 +519,5 @@
 }
 
-static void *shader_sm1_init(const DWORD *byte_code, const struct wined3d_shader_signature *output_signature)
+static void *shader_sm1_init(const DWORD *byte_code, DWORD tokens_num, const struct wined3d_shader_signature *output_signature)
 {
     struct wined3d_sm1_data *priv;
@@ -537,4 +538,6 @@
         return NULL;
     }
+    
+    priv->end = byte_code + tokens_num;
 
     if (output_signature)
@@ -674,4 +677,11 @@
 static BOOL shader_sm1_is_end(void *data, const DWORD **ptr)
 {
+    struct wined3d_sm1_data *priv = data;
+
+    if (*ptr >= priv->end)
+    {
+        return TRUE;
+    }
+
     if (**ptr == WINED3DSP_END)
     {
Index: /trunk/src/VBox/Devices/Graphics/shaderlib/shader_sm4.c
===================================================================
--- /trunk/src/VBox/Devices/Graphics/shaderlib/shader_sm4.c	(revision 82717)
+++ /trunk/src/VBox/Devices/Graphics/shaderlib/shader_sm4.c	(revision 82718)
@@ -229,5 +229,5 @@
 }
 
-static void *shader_sm4_init(const DWORD *byte_code, const struct wined3d_shader_signature *output_signature)
+static void *shader_sm4_init(const DWORD *byte_code, DWORD tokens_num, const struct wined3d_shader_signature *output_signature)
 {
     struct wined3d_sm4_data *priv = HeapAlloc(GetProcessHeap(), 0, sizeof(*priv));
@@ -238,4 +238,5 @@
     }
 
+    priv->end = byte_code + tokens_num;
     priv->output_signature = output_signature;
 
@@ -425,5 +426,5 @@
 {
     struct wined3d_sm4_data *priv = data;
-    return *ptr == priv->end;
+    return *ptr >= priv->end;
 }
 
Index: /trunk/src/VBox/Devices/Graphics/shaderlib/shaderapi.c
===================================================================
--- /trunk/src/VBox/Devices/Graphics/shaderlib/shaderapi.c	(revision 82717)
+++ /trunk/src/VBox/Devices/Graphics/shaderlib/shaderapi.c	(revision 82718)
@@ -314,5 +314,5 @@
 }
 
-SHADERDECL(int) ShaderCreateVertexShader(void *pShaderContext, const uint32_t *pShaderData, void **pShaderObj)
+SHADERDECL(int) ShaderCreateVertexShader(void *pShaderContext, const uint32_t *pShaderData, uint32_t cbShaderData, void **pShaderObj)
 {
     IWineD3DDeviceImpl *This;
@@ -329,4 +329,6 @@
         return VERR_NO_MEMORY;
     }
+
+    object->baseShader.functionLength = cbShaderData;
 
     hr = vertexshader_init(object, This, (DWORD const *)pShaderData, NULL, NULL, NULL);
@@ -356,5 +358,5 @@
 }
 
-SHADERDECL(int) ShaderCreatePixelShader(void *pShaderContext, const uint32_t *pShaderData, void **pShaderObj)
+SHADERDECL(int) ShaderCreatePixelShader(void *pShaderContext, const uint32_t *pShaderData, uint32_t cbShaderData, void **pShaderObj)
 {
     IWineD3DDeviceImpl *This;
@@ -371,4 +373,6 @@
         return VERR_NO_MEMORY;
     }
+
+    object->baseShader.functionLength = cbShaderData;
 
     hr = pixelshader_init(object, This, (DWORD const *)pShaderData, NULL, NULL, NULL);
Index: /trunk/src/VBox/Devices/Graphics/shaderlib/shaderlib.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/shaderlib/shaderlib.h	(revision 82717)
+++ /trunk/src/VBox/Devices/Graphics/shaderlib/shaderlib.h	(revision 82718)
@@ -72,6 +72,6 @@
 SHADERDECL(int) ShaderContextDestroy(void *pShaderContext);
 
-SHADERDECL(int) ShaderCreateVertexShader(void *pShaderContext, const uint32_t *pShaderData, void **pShaderObj);
-SHADERDECL(int) ShaderCreatePixelShader(void *pShaderContext, const uint32_t *pShaderData, void **pShaderObj);
+SHADERDECL(int) ShaderCreateVertexShader(void *pShaderContext, const uint32_t *pShaderData, uint32_t cbShaderData, void **pShaderObj);
+SHADERDECL(int) ShaderCreatePixelShader(void *pShaderContext, const uint32_t *pShaderData, uint32_t cbShaderData, void **pShaderObj);
 
 SHADERDECL(int) ShaderDestroyVertexShader(void *pShaderContext, void *pShaderObj);
Index: /trunk/src/VBox/Devices/Graphics/shaderlib/wined3d_private.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/shaderlib/wined3d_private.h	(revision 82717)
+++ /trunk/src/VBox/Devices/Graphics/shaderlib/wined3d_private.h	(revision 82718)
@@ -676,5 +676,5 @@
 struct wined3d_shader_frontend
 {
-    void *(*shader_init)(const DWORD *ptr, const struct wined3d_shader_signature *output_signature);
+    void *(*shader_init)(const DWORD *ptr, DWORD tokens_num, const struct wined3d_shader_signature *output_signature);
     void (*shader_free)(void *data);
     void (*shader_read_header)(void *data, const DWORD **ptr, struct wined3d_shader_version *shader_version);
