diff --git a/dll/ntdll/ldr/ldrapi.c b/dll/ntdll/ldr/ldrapi.c index f850ce6ddca..34517b1a251 100644 --- a/dll/ntdll/ldr/ldrapi.c +++ b/dll/ntdll/ldr/ldrapi.c @@ -309,10 +309,11 @@ LdrLockLoaderLock( NTSTATUS NTAPI DECLSPEC_HOTPATCH -LdrLoadDll(IN PWSTR SearchPath OPTIONAL, - IN PULONG DllCharacteristics OPTIONAL, - IN PUNICODE_STRING DllName, - OUT PVOID *BaseAddress) +LdrLoadDll( + _In_opt_ PWSTR SearchPath, + _In_opt_ PULONG DllCharacteristics, + _In_ PUNICODE_STRING DllName, + _Out_ PVOID *BaseAddress) { WCHAR StringBuffer[MAX_PATH]; UNICODE_STRING DllString1, DllString2; @@ -426,7 +427,7 @@ LdrLoadDll(IN PWSTR SearchPath OPTIONAL, LdrpTopLevelDllBeingLoaded = OldTldDll; /* Release the lock */ - LdrUnlockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie); + LdrUnlockLoaderLock(LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie); } _SEH2_END; @@ -793,7 +794,7 @@ Quickie: /* Release lock */ if (Locked) { - LdrUnlockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, + LdrUnlockLoaderLock(LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie); } @@ -840,10 +841,11 @@ LdrGetProcedureAddress( */ NTSTATUS NTAPI -LdrVerifyImageMatchesChecksum(IN HANDLE FileHandle, - IN PLDR_CALLBACK Callback, - IN PVOID CallbackContext, - OUT PUSHORT ImageCharacteristics) +LdrVerifyImageMatchesChecksum( + _In_ HANDLE FileHandle, + _In_ PLDR_CALLBACK Callback, + _In_ PVOID CallbackContext, + _Out_ PUSHORT ImageCharacteristics) { FILE_STANDARD_INFORMATION FileStandardInfo; PIMAGE_IMPORT_DESCRIPTOR ImportData; @@ -982,18 +984,19 @@ LdrVerifyImageMatchesChecksum(IN HANDLE FileHandle, NTSTATUS NTAPI -LdrQueryProcessModuleInformationEx(IN ULONG ProcessId, - IN ULONG Reserved, - OUT PRTL_PROCESS_MODULES ModuleInformation, - IN ULONG Size, - OUT PULONG ReturnedSize OPTIONAL) +LdrQueryProcessModuleInformationEx( + _In_opt_ ULONG ProcessId, + _Reserved_ ULONG Reserved, + _Out_writes_bytes_to_(Size, *ReturnedSize) PRTL_PROCESS_MODULES ModuleInformation, + _In_ ULONG Size, + _Out_opt_ PULONG ReturnedSize) { PLIST_ENTRY ModuleListHead, InitListHead; PLIST_ENTRY Entry, InitEntry; PLDR_DATA_TABLE_ENTRY Module, InitModule; PRTL_PROCESS_MODULE_INFORMATION ModulePtr = NULL; NTSTATUS Status = STATUS_SUCCESS; - ULONG UsedSize = sizeof(ULONG); + ULONG UsedSize = FIELD_OFFSET(RTL_PROCESS_MODULES, Modules); ANSI_STRING AnsiString; PCHAR p; @@ -1110,9 +1113,10 @@ LdrQueryProcessModuleInformationEx(IN ULONG ProcessId, */ NTSTATUS NTAPI -LdrQueryProcessModuleInformation(IN PRTL_PROCESS_MODULES ModuleInformation, - IN ULONG Size, - OUT PULONG ReturnedSize OPTIONAL) +LdrQueryProcessModuleInformation( + _Out_writes_bytes_to_(Size, *ReturnedSize) PRTL_PROCESS_MODULES ModuleInformation, + _In_ ULONG Size, + _Out_opt_ PULONG ReturnedSize) { /* Call Ex version of the API */ return LdrQueryProcessModuleInformationEx(0, 0, ModuleInformation, Size, ReturnedSize); @@ -1123,9 +1127,10 @@ LdrQueryProcessModuleInformation(IN PRTL_PROCESS_MODULES ModuleInformation, */ NTSTATUS NTAPI -LdrEnumerateLoadedModules(IN BOOLEAN ReservedFlag, - IN PLDR_ENUM_CALLBACK EnumProc, - IN PVOID Context) +LdrEnumerateLoadedModules( + _Reserved_ ULONG ReservedFlag, + _In_ PLDR_ENUM_CALLBACK EnumProc, + _In_opt_ PVOID Context) { PLIST_ENTRY ListHead, ListEntry; PLDR_DATA_TABLE_ENTRY LdrEntry; @@ -1161,28 +1166,24 @@ LdrEnumerateLoadedModules(IN BOOLEAN ReservedFlag, /* Break if we were asked to stop enumeration */ if (Stop) { - /* Release loader lock */ - Status = LdrUnlockLoaderLock(0, Cookie); - - /* Reset any successful status to STATUS_SUCCESS, but leave - failure to the caller */ - if (NT_SUCCESS(Status)) - Status = STATUS_SUCCESS; - - /* Return any possible failure status */ - return Status; + break; } /* Advance to the next module */ ListEntry = ListEntry->Flink; } - /* Release loader lock, it must succeed this time */ + /* Release loader lock */ Status = LdrUnlockLoaderLock(0, Cookie); ASSERT(NT_SUCCESS(Status)); - /* Return success */ - return STATUS_SUCCESS; + /* Reset any successful status to STATUS_SUCCESS, + * but leave failure to the caller */ + if (NT_SUCCESS(Status)) + Status = STATUS_SUCCESS; + + /* Return any possible failure status */ + return Status; } /* @@ -1190,7 +1191,8 @@ LdrEnumerateLoadedModules(IN BOOLEAN ReservedFlag, */ NTSTATUS NTAPI -LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress) +LdrDisableThreadCalloutsForDll( + _In_ PVOID BaseAddress) { PLDR_DATA_TABLE_ENTRY LdrEntry; NTSTATUS Status; @@ -1240,8 +1242,9 @@ LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress) */ NTSTATUS NTAPI -LdrAddRefDll(IN ULONG Flags, - IN PVOID BaseAddress) +LdrAddRefDll( + _In_ ULONG Flags, + _In_ PVOID BaseAddress) { PLDR_DATA_TABLE_ENTRY LdrEntry; NTSTATUS Status = STATUS_SUCCESS; @@ -1316,7 +1319,7 @@ quickie: } /* Release the lock if needed */ - if (Locked) LdrUnlockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie); + if (Locked) LdrUnlockLoaderLock(LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie); return Status; } @@ -1325,7 +1328,8 @@ quickie: */ NTSTATUS NTAPI -LdrUnloadDll(IN PVOID BaseAddress) +LdrUnloadDll( + _In_ PVOID BaseAddress) { NTSTATUS Status = STATUS_SUCCESS; PPEB Peb = NtCurrentPeb(); @@ -1601,10 +1605,11 @@ RtlDllShutdownInProgress(VOID) */ PIMAGE_BASE_RELOCATION NTAPI -LdrProcessRelocationBlock(IN ULONG_PTR Address, - IN ULONG Count, - IN PUSHORT TypeOffset, - IN LONG_PTR Delta) +LdrProcessRelocationBlock( + _In_ ULONG_PTR Address, + _In_ ULONG Count, + _In_ PUSHORT TypeOffset, + _In_ LONG_PTR Delta) { return LdrProcessRelocationBlockLongLong(Address, Count, TypeOffset, Delta); } @@ -1617,8 +1622,9 @@ LdrProcessRelocationBlock(IN ULONG_PTR Address, */ NTSTATUS NTAPI -LdrLoadAlternateResourceModule(IN PVOID Module, - IN PWSTR Buffer) +LdrLoadAlternateResourceModule( + _In_ PVOID Module, + _In_ PWSTR Buffer) { /* Is MUI Support enabled? */ if (!LdrAlternateResourcesEnabled()) return STATUS_SUCCESS; @@ -1632,7 +1638,8 @@ LdrLoadAlternateResourceModule(IN PVOID Module, */ BOOLEAN NTAPI -LdrUnloadAlternateResourceModule(IN PVOID BaseAddress) +LdrUnloadAlternateResourceModule( + _In_ PVOID BaseAddress) { ULONG_PTR Cookie; @@ -1646,7 +1653,7 @@ LdrUnloadAlternateResourceModule(IN PVOID BaseAddress) } /* Release the loader lock */ - LdrUnlockLoaderLock(1, Cookie); + LdrUnlockLoaderLock(LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie); /* All done */ return TRUE; diff --git a/dll/ntdll/ldr/ldrinit.c b/dll/ntdll/ldr/ldrinit.c index 2dc616a4afd..03e80968f3d 100644 --- a/dll/ntdll/ldr/ldrinit.c +++ b/dll/ntdll/ldr/ldrinit.c @@ -109,9 +109,10 @@ extern BOOLEAN RtlpUse16ByteSLists; */ NTSTATUS NTAPI -LdrOpenImageFileOptionsKey(IN PUNICODE_STRING SubKey, - IN BOOLEAN Wow64, - OUT PHANDLE NewKeyHandle) +LdrOpenImageFileOptionsKey( + _In_ PUNICODE_STRING SubKey, + _In_ BOOLEAN Wow64, + _Out_ PHANDLE NewKeyHandle) { PHANDLE RootKeyLocation; HANDLE RootKey; @@ -181,12 +182,13 @@ LdrOpenImageFileOptionsKey(IN PUNICODE_STRING SubKey, */ NTSTATUS NTAPI -LdrQueryImageFileKeyOption(IN HANDLE KeyHandle, - IN PCWSTR ValueName, - IN ULONG Type, - OUT PVOID Buffer, - IN ULONG BufferSize, - OUT PULONG ReturnedLength OPTIONAL) +LdrQueryImageFileKeyOption( + _In_ HANDLE KeyHandle, + _In_ PCWSTR ValueName, + _In_ ULONG Type, + _Out_ PVOID Buffer, + _In_ ULONG BufferSize, + _Out_opt_ PULONG ReturnedLength) { ULONG KeyInfo[256]; UNICODE_STRING ValueNameString, IntegerString; @@ -345,13 +347,14 @@ LdrQueryImageFileKeyOption(IN HANDLE KeyHandle, */ NTSTATUS NTAPI -LdrQueryImageFileExecutionOptionsEx(IN PUNICODE_STRING SubKey, - IN PCWSTR ValueName, - IN ULONG Type, - OUT PVOID Buffer, - IN ULONG BufferSize, - OUT PULONG ReturnedLength OPTIONAL, - IN BOOLEAN Wow64) +LdrQueryImageFileExecutionOptionsEx( + _In_ PUNICODE_STRING SubKey, + _In_ PCWSTR ValueName, + _In_ ULONG Type, + _Out_ PVOID Buffer, + _In_ ULONG BufferSize, + _Out_opt_ PULONG ReturnedLength, + _In_ BOOLEAN Wow64) { NTSTATUS Status; HANDLE KeyHandle; @@ -383,12 +386,13 @@ LdrQueryImageFileExecutionOptionsEx(IN PUNICODE_STRING SubKey, */ NTSTATUS NTAPI -LdrQueryImageFileExecutionOptions(IN PUNICODE_STRING SubKey, - IN PCWSTR ValueName, - IN ULONG Type, - OUT PVOID Buffer, - IN ULONG BufferSize, - OUT PULONG ReturnedLength OPTIONAL) +LdrQueryImageFileExecutionOptions( + _In_ PUNICODE_STRING SubKey, + _In_ PCWSTR ValueName, + _In_ ULONG Type, + _Out_ PVOID Buffer, + _In_ ULONG BufferSize, + _Out_opt_ PULONG ReturnedLength) { /* Call the newer function */ return LdrQueryImageFileExecutionOptionsEx(SubKey, @@ -1879,7 +1883,7 @@ LdrpInitializeProcess(IN PCONTEXT Context, HeapParameters.Length = sizeof(HeapParameters); /* Check if we have Configuration Data */ -#define VALID_CONFIG_FIELD(Name) (ConfigSize >= (FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, Name) + sizeof(LoadConfig->Name))) +#define VALID_CONFIG_FIELD(Name) (ConfigSize >= RTL_SIZEOF_THROUGH_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, Name)) /* The 'original' load config ends after SecurityCookie */ if ((LoadConfig) && ConfigSize && (VALID_CONFIG_FIELD(SecurityCookie) || ConfigSize == LoadConfig->Size)) { @@ -2327,7 +2331,7 @@ LdrpInitializeProcess(IN PCONTEXT Context, if (!NT_SUCCESS(Status)) { if (ShowSnaps) - DPRINT1("LDR: Unable to find post-import process init function, Status=0x%08lx\n", &Kernel32String, Status); + DPRINT1("LDR: Unable to find post-import process init function, Status=0x%08lx\n", Status); return Status; } Kernel32ProcessInitPostImportFunction = FunctionAddress; @@ -2340,7 +2344,7 @@ LdrpInitializeProcess(IN PCONTEXT Context, if (!NT_SUCCESS(Status)) { if (ShowSnaps) - DPRINT1("LDR: Unable to find BaseQueryModuleData, Status=0x%08lx\n", &Kernel32String, Status); + DPRINT1("LDR: Unable to find BaseQueryModuleData, Status=0x%08lx\n", Status); return Status; } Kernel32BaseQueryModuleData = FunctionAddress; diff --git a/dll/ntdll/ldr/ldrutils.c b/dll/ntdll/ldr/ldrutils.c index 632aa83df04..69e2f8c152e 100644 --- a/dll/ntdll/ldr/ldrutils.c +++ b/dll/ntdll/ldr/ldrutils.c @@ -2257,7 +2257,7 @@ LdrpGetProcedureAddress( _In_ BOOLEAN ExecuteInit) { NTSTATUS Status = STATUS_SUCCESS; - UCHAR ImportBuffer[64]; + UCHAR ImportBuffer[64]; // 128 since NT6.2 PLDR_DATA_TABLE_ENTRY LdrEntry; IMAGE_THUNK_DATA Thunk; PVOID ImageBase; @@ -2292,6 +2292,11 @@ LdrpGetProcedureAddress( ImportName = RtlAllocateHeap(RtlGetProcessHeap(), 0, Length); + if (!ImportName) + { + /* Return STATUS_INSUFFICIENT_RESOURCES since NT6.2 */ + return STATUS_INVALID_PARAMETER; + } } else { diff --git a/dll/win32/kernel32/client/loader.c b/dll/win32/kernel32/client/loader.c index 2934b528699..c3a53eec0bc 100644 --- a/dll/win32/kernel32/client/loader.c +++ b/dll/win32/kernel32/client/loader.c @@ -657,7 +657,7 @@ GetModuleFileNameW(HINSTANCE hModule, } _SEH2_END /* Release the loader lock */ - LdrUnlockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie); + LdrUnlockLoaderLock(LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie); return Length / sizeof(WCHAR); } diff --git a/sdk/include/ndk/ldrfuncs.h b/sdk/include/ndk/ldrfuncs.h index 9eb891928ca..52e682b57fb 100644 --- a/sdk/include/ndk/ldrfuncs.h +++ b/sdk/include/ndk/ldrfuncs.h @@ -97,8 +97,8 @@ LdrGetProcedureAddress( ULONG NTAPI LdrRelocateImage( - _In_ PVOID NewBase, - _In_ PCCH LoaderName, + _In_ PVOID BaseAddress, + _In_opt_ PCSTR LoaderName, _In_ ULONG Success, _In_ ULONG Conflict, _In_ ULONG Invalid @@ -139,9 +139,9 @@ LdrProcessRelocationBlockLongLong( NTSTATUS NTAPI LdrEnumerateLoadedModules( - _In_ BOOLEAN ReservedFlag, + _Reserved_ ULONG ReservedFlag, _In_ PLDR_ENUM_CALLBACK EnumProc, - _In_ PVOID Context + _In_opt_ PVOID Context ); #endif diff --git a/sdk/include/ndk/ldrtypes.h b/sdk/include/ndk/ldrtypes.h index fcc76cac8dc..3b71d022887 100644 --- a/sdk/include/ndk/ldrtypes.h +++ b/sdk/include/ndk/ldrtypes.h @@ -238,7 +238,7 @@ typedef struct _ALT_RESOURCE_MODULE // // Callback function for LdrEnumerateLoadedModules // -typedef VOID (NTAPI LDR_ENUM_CALLBACK)(_In_ PLDR_DATA_TABLE_ENTRY ModuleInformation, _In_ PVOID Parameter, _Out_ BOOLEAN *Stop); +typedef VOID (NTAPI LDR_ENUM_CALLBACK)(_In_ PLDR_DATA_TABLE_ENTRY ModuleInformation, _In_opt_ PVOID Context, _Out_ BOOLEAN *Stop); typedef LDR_ENUM_CALLBACK *PLDR_ENUM_CALLBACK; // diff --git a/sdk/include/ndk/rtlfuncs.h b/sdk/include/ndk/rtlfuncs.h index 41aedeb7e2d..29ab006cf25 100644 --- a/sdk/include/ndk/rtlfuncs.h +++ b/sdk/include/ndk/rtlfuncs.h @@ -3975,13 +3975,12 @@ RtlImageRvaToSection( _In_ ULONG Rva ); -NTSYSAPI ULONG NTAPI LdrRelocateImageWithBias( - _In_ PVOID NewAddress, + _In_ PVOID BaseAddress, _In_ LONGLONG AdditionalBias, - _In_ PCCH LoaderName, + _In_opt_ PCSTR LoaderName, _In_ ULONG Success, _In_ ULONG Conflict, _In_ ULONG Invalid diff --git a/sdk/include/ndk/umfuncs.h b/sdk/include/ndk/umfuncs.h index 5fa85a1e978..7c6618c45bf 100644 --- a/sdk/include/ndk/umfuncs.h +++ b/sdk/include/ndk/umfuncs.h @@ -158,9 +158,9 @@ NTSTATUS NTAPI LdrLoadDll( _In_opt_ PWSTR SearchPath, - _In_opt_ PULONG LoadFlags, - _In_ PUNICODE_STRING Name, - _Out_opt_ PVOID *BaseAddress + _In_opt_ PULONG DllCharacteristics, + _In_ PUNICODE_STRING DllName, + _Out_ PVOID *BaseAddress ); PIMAGE_BASE_RELOCATION @@ -177,18 +177,18 @@ NTAPI LdrQueryImageFileExecutionOptions( _In_ PUNICODE_STRING SubKey, _In_ PCWSTR ValueName, - _In_ ULONG ValueSize, + _In_ ULONG Type, _Out_ PVOID Buffer, _In_ ULONG BufferSize, - _Out_opt_ PULONG RetunedLength + _Out_opt_ PULONG ReturnedLength ); NTSTATUS NTAPI LdrQueryProcessModuleInformation( - _In_opt_ PRTL_PROCESS_MODULES ModuleInformation, - _In_opt_ ULONG Size, - _Out_ PULONG ReturnedSize + _Out_writes_bytes_to_(Size, *ReturnedSize) PRTL_PROCESS_MODULES ModuleInformation, + _In_ ULONG Size, + _Out_opt_ PULONG ReturnedSize ); VOID @@ -221,7 +221,7 @@ LdrVerifyImageMatchesChecksum( _In_ HANDLE FileHandle, _In_ PLDR_CALLBACK Callback, _In_ PVOID CallbackContext, - _Out_ PUSHORT ImageCharacterstics + _Out_ PUSHORT ImageCharacteristics ); NTSTATUS diff --git a/sdk/lib/rtl/image.c b/sdk/lib/rtl/image.c index 9efb3d19744..334839d0732 100644 --- a/sdk/lib/rtl/image.c +++ b/sdk/lib/rtl/image.c @@ -460,11 +460,11 @@ LdrProcessRelocationBlockLongLong( ULONG NTAPI LdrRelocateImage( - IN PVOID BaseAddress, - IN PCCH LoaderName, - IN ULONG Success, - IN ULONG Conflict, - IN ULONG Invalid) + _In_ PVOID BaseAddress, + _In_opt_ PCSTR LoaderName, + _In_ ULONG Success, + _In_ ULONG Conflict, + _In_ ULONG Invalid) { return LdrRelocateImageWithBias(BaseAddress, 0, LoaderName, Success, Conflict, Invalid); } @@ -472,12 +472,12 @@ LdrRelocateImage( ULONG NTAPI LdrRelocateImageWithBias( - IN PVOID BaseAddress, - IN LONGLONG AdditionalBias, - IN PCCH LoaderName, - IN ULONG Success, - IN ULONG Conflict, - IN ULONG Invalid) + _In_ PVOID BaseAddress, + _In_ LONGLONG AdditionalBias, + _In_opt_ PCSTR LoaderName, + _In_ ULONG Success, + _In_ ULONG Conflict, + _In_ ULONG Invalid) { PIMAGE_NT_HEADERS NtHeaders; PIMAGE_DATA_DIRECTORY RelocationDDir; @@ -487,6 +487,8 @@ LdrRelocateImageWithBias( PUSHORT TypeOffset; LONGLONG Delta; + UNREFERENCED_PARAMETER(LoaderName); + NtHeaders = RtlImageNtHeader(BaseAddress); if (NtHeaders == NULL)