From 15fff6abae82494bbe54d0cc32f4ba14e285e86b Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sun, 29 Nov 2009 10:53:39 +0000 Subject: [PATCH] [ntdll] - Implement LdrLockLoaderLock and LdrUnlockLoaderLock. svn path=/trunk/; revision=44318 --- reactos/dll/ntdll/ldr/utils.c | 62 ++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/reactos/dll/ntdll/ldr/utils.c b/reactos/dll/ntdll/ldr/utils.c index 873cce8f1fa..6a141eb624c 100644 --- a/reactos/dll/ntdll/ldr/utils.c +++ b/reactos/dll/ntdll/ldr/utils.c @@ -3382,8 +3382,55 @@ LdrLockLoaderLock(IN ULONG Flags, OUT PULONG Disposition OPTIONAL, OUT PULONG Cookie OPTIONAL) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + BOOLEAN Ret; + BOOLEAN CookieSet = FALSE; + + if ((Flags != 0x01) && (Flags != 0x02)) + return STATUS_INVALID_PARAMETER_1; + + if (!Cookie) return STATUS_INVALID_PARAMETER_3; + + /* Set some defaults for failure while verifying params */ + _SEH2_TRY + { + *Cookie = 0; + CookieSet = TRUE; + if (Disposition) *Disposition = 0; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + if (CookieSet) + Status = STATUS_INVALID_PARAMETER_3; + else + Status = STATUS_INVALID_PARAMETER_2; + } + _SEH2_END; + + if (Flags == 0x01) + { + DPRINT1("Warning: Reporting errors with exception not supported yet!\n"); + RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock); + Status = STATUS_SUCCESS; + + } + else + { + if (!Disposition) return STATUS_INVALID_PARAMETER_2; + + Ret = RtlTryEnterCriticalSection(NtCurrentPeb()->LoaderLock); + + if (Ret) + *Disposition = 0x01; + else + *Disposition = 0x02; + + Status = STATUS_SUCCESS; + } + + /* FIXME: Cookie is based on part of the thread id */ + *Cookie = (ULONG)NtCurrentTeb()->RealClientId.UniqueThread; + return Status; } NTSTATUS @@ -3391,8 +3438,15 @@ NTAPI LdrUnlockLoaderLock(IN ULONG Flags, IN ULONG Cookie OPTIONAL) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + if (Flags != 0x01) + return STATUS_INVALID_PARAMETER_1; + + if (Cookie != (ULONG)NtCurrentTeb()->RealClientId.UniqueThread) + return STATUS_INVALID_PARAMETER_2; + + RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock); + + return STATUS_SUCCESS; } BOOLEAN