[PATCH 24/27] [Kernel32]: ActCtx: implemented querying the details about files

Eric Pouech eric.pouech at wanadoo.fr
Sat Apr 28 07:23:17 CDT 2007




A+
---

 dlls/kernel32/actctx.c |   74 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 74 insertions(+), 0 deletions(-)

diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index 0983ee1..aac9da2 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -2170,6 +2170,80 @@ BOOL WINAPI QueryActCtxW(DWORD dwFlags, 
         }
         break;
     case FileInformationInAssemblyOfAssemblyInActivationContext:
+        {
+            const ACTIVATION_CONTEXT_QUERY_INDEX* acqi;
+            ASSEMBLY_FILE_DETAILED_INFORMATION* afdi = pvBuff;
+            unsigned            len, dll_len = 0;
+            LPWSTR              ptr;
+            struct assembly*    assembly;
+            struct dll_redirect*dll = NULL;
+
+            if (!pvSubInst)
+            {
+                SetLastError(ERROR_INVALID_PARAMETER);
+                return FALSE;
+            }
+            acqi = pvSubInst;
+            /* FIXME: this is a hack to be validated (add some more tests) */
+            if (acqi->ulAssemblyIndex == 0)
+            {
+                unsigned        idx, c = acqi->ulFileIndexInAssembly;
+                for (idx = 0; idx < actctx->num_assemblies; idx++)
+                {
+                    assembly = &actctx->assemblies[idx];
+                    if (c < assembly->num_dlls)
+                    {
+                        dll = &assembly->dlls[acqi->ulFileIndexInAssembly];
+                        break;
+                    }
+                    c -= assembly->num_dlls;
+                }
+                if (idx == actctx->num_assemblies)
+                {
+                    SetLastError(ERROR_INVALID_PARAMETER);
+                    return FALSE;
+                }
+            }
+            else
+            {
+                if (acqi->ulAssemblyIndex + 1 >= actctx->num_assemblies)
+                {
+                    SetLastError(ERROR_INVALID_PARAMETER);
+                    return FALSE;
+                }
+                assembly = &actctx->assemblies[acqi->ulAssemblyIndex + 1];
+                if (acqi->ulFileIndexInAssembly >= assembly->num_dlls)
+                {
+                    SetLastError(ERROR_INVALID_PARAMETER);
+                    return FALSE;
+                }
+                dll = &assembly->dlls[acqi->ulFileIndexInAssembly];
+            }
+            if (dll->name) dll_len = strlenW(dll->name) + 1;
+
+            len = sizeof(*afdi) + dll_len * sizeof(WCHAR);
+
+            if (!pvBuff || cbBuff < len)
+            {
+                if (pcbLen) *pcbLen = len;
+                SetLastError(ERROR_INSUFFICIENT_BUFFER);
+                return FALSE;
+            }
+            /* yes that's what native does !! */
+            if (pcbLen) *pcbLen = 0;
+            afdi->ulFlags = ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION;
+            afdi->ulFilenameLength = dll_len ? (dll_len - 1) * sizeof(WCHAR) : 0;
+            afdi->ulPathLength = 0; /* FIXME */
+            ptr = (LPWSTR)(afdi + 1);
+            if (dll_len)
+            {
+                afdi->lpFileName = ptr;
+                strcpyW(ptr, dll->name);
+            } else afdi->lpFileName = NULL;
+            afdi->lpFilePath = NULL; /* FIXME */
+        }
+        break;
+    default:
         SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
         return FALSE;
     }




More information about the wine-patches mailing list