diff --git a/reactos/lib/kernel32/kernel32.xml b/reactos/lib/kernel32/kernel32.xml
index 46186af2a3c..4852f0375ff 100644
--- a/reactos/lib/kernel32/kernel32.xml
+++ b/reactos/lib/kernel32/kernel32.xml
@@ -52,6 +52,7 @@
virtual.c
+ actctx.c
atom.c
chartype.c
comm.c
diff --git a/reactos/lib/kernel32/misc/ActCtx.c b/reactos/lib/kernel32/misc/ActCtx.c
new file mode 100644
index 00000000000..edd2855c00b
--- /dev/null
+++ b/reactos/lib/kernel32/misc/ActCtx.c
@@ -0,0 +1,96 @@
+#include
+
+#define NDEBUG
+#include "../include/debug.h"
+
+/*
+ * @implemented
+ */
+BOOL
+STDCALL
+FindActCtxSectionStringA(
+ DWORD dwFlags,
+ const GUID *lpExtensionGuid,
+ ULONG ulSectionId,
+ LPCSTR lpStringToFind,
+ PACTCTX_SECTION_KEYED_DATA ReturnedData
+ )
+{
+ BOOL bRetVal;
+ LPWSTR lpStringToFindW;
+
+ /* Convert lpStringToFind */
+ if (lpStringToFind)
+ {
+ BasepAnsiStringToHeapUnicodeString(lpStringToFind,
+ (LPWSTR*) &lpStringToFindW);
+ }
+
+ /* Call the Unicode function */
+ bRetVal = FindActCtxSectionStringA(dwFlags,
+ lpExtensionGuid,
+ ulSectionId,
+ lpStringToFind,
+ ReturnedData);
+
+ /* Clean up */
+ RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*) lpStringToFindW);
+
+ return bRetVal;
+}
+
+
+/*
+ * @implemented
+ */
+HANDLE
+STDCALL
+CreateActCtxA(
+ PCACTCTXA pActCtx
+ )
+{
+ ACTCTXW pActCtxW;
+ HANDLE hRetVal;
+
+ ZeroMemory(&pActCtxW, sizeof(pActCtxW));
+ pActCtxW.cbSize = sizeof(pActCtxW);
+ pActCtxW.dwFlags = pActCtx->dwFlags;
+ pActCtxW.wProcessorArchitecture = pActCtx->wProcessorArchitecture;
+ pActCtxW.dwFlags = pActCtx->wProcessorArchitecture;
+
+ pActCtxW.hModule = pActCtx->hModule;
+
+ /* Convert ActCtx Strings */
+ if (pActCtx->lpAssemblyDirectory)
+ {
+ BasepAnsiStringToHeapUnicodeString(pActCtx->lpSource,
+ (LPWSTR*) &pActCtxW.lpSource);
+ }
+
+ if (pActCtx->lpAssemblyDirectory)
+ {
+ BasepAnsiStringToHeapUnicodeString(pActCtx->lpAssemblyDirectory,
+ (LPWSTR*) &pActCtxW.lpAssemblyDirectory);
+ }
+ if (pActCtx->lpResourceName)
+ {
+ BasepAnsiStringToHeapUnicodeString(pActCtx->lpResourceName,
+ (LPWSTR*) &pActCtxW.lpResourceName);
+ }
+ if (pActCtx->lpApplicationName)
+ {
+ BasepAnsiStringToHeapUnicodeString(pActCtx->lpApplicationName,
+ (LPWSTR*) &pActCtxW.lpApplicationName);
+ }
+
+ /* Call the Unicode function */
+ hRetVal = CreateActCtxW(&pActCtxW);
+
+ /* Clean up */
+ RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*) pActCtxW.lpSource);
+ RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*) pActCtxW.lpAssemblyDirectory);
+ RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*) pActCtxW.lpResourceName);
+ RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*) pActCtxW.lpApplicationName);
+
+ return hRetVal;
+}
diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c
index 19d1b92244d..b1f7d55c304 100644
--- a/reactos/lib/kernel32/misc/stubs.c
+++ b/reactos/lib/kernel32/misc/stubs.c
@@ -453,20 +453,6 @@ CancelDeviceWakeupRequest(
return 0;
}
-
-/*
- * @unimplemented
- */
-HANDLE
-STDCALL
-CreateActCtxA(
- PCACTCTXA pActCtx
- )
-{
- STUB;
- return 0;
-}
-
/*
* @unimplemented
*/
@@ -477,7 +463,7 @@ CreateActCtxW(
)
{
STUB;
- return 0;
+ return INVALID_HANDLE_VALUE;
}
/*
@@ -1050,7 +1036,7 @@ FindActCtxSectionStringW(
)
{
STUB;
- return 0;
+ return FALSE;
}
/*
@@ -1267,23 +1253,6 @@ DnsHostnameToComputerNameA (
return 0;
}
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
-FindActCtxSectionStringA(
- DWORD dwFlags,
- const GUID *lpExtensionGuid,
- ULONG ulSectionId,
- LPCSTR lpStringToFind,
- PACTCTX_SECTION_KEYED_DATA ReturnedData
- )
-{
- STUB;
- return 0;
-}
-
/*
* @unimplemented
*/