[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