[NTDLL:LDR] Little fixes about SAL annotation and behavior (#5793)

- Uniform function declarations in .c and .h with fixes and SAL2 improvements.
- Use LDR_[UN]LOCK_LOADER_LOCK_FLAG_XXX correctly.
- Fix incorrect UsedSize calculation in LdrQueryProcessModuleInformationEx (caught by ThFabba).
- Whatever the callback request stop the enumeration or not in LdrEnumerateLoadedModules, the following operations should be the same.
- Fix 2 incorrect DPRINT1 that printed incorrect parameter.
- Return error if RtlAllocateHeap failed in LdrpGetProcedureAddress, and add comments about NT6.2 new changes.
This commit is contained in:
Ratin Gao 2023-11-16 03:59:32 +08:00 committed by GitHub
parent bd9e2d6beb
commit bd0a5498b0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 120 additions and 103 deletions

View file

@ -309,10 +309,11 @@ LdrLockLoaderLock(
NTSTATUS NTSTATUS
NTAPI NTAPI
DECLSPEC_HOTPATCH DECLSPEC_HOTPATCH
LdrLoadDll(IN PWSTR SearchPath OPTIONAL, LdrLoadDll(
IN PULONG DllCharacteristics OPTIONAL, _In_opt_ PWSTR SearchPath,
IN PUNICODE_STRING DllName, _In_opt_ PULONG DllCharacteristics,
OUT PVOID *BaseAddress) _In_ PUNICODE_STRING DllName,
_Out_ PVOID *BaseAddress)
{ {
WCHAR StringBuffer[MAX_PATH]; WCHAR StringBuffer[MAX_PATH];
UNICODE_STRING DllString1, DllString2; UNICODE_STRING DllString1, DllString2;
@ -426,7 +427,7 @@ LdrLoadDll(IN PWSTR SearchPath OPTIONAL,
LdrpTopLevelDllBeingLoaded = OldTldDll; LdrpTopLevelDllBeingLoaded = OldTldDll;
/* Release the lock */ /* 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; _SEH2_END;
@ -793,7 +794,7 @@ Quickie:
/* Release lock */ /* Release lock */
if (Locked) if (Locked)
{ {
LdrUnlockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, LdrUnlockLoaderLock(LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS,
Cookie); Cookie);
} }
@ -840,10 +841,11 @@ LdrGetProcedureAddress(
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrVerifyImageMatchesChecksum(IN HANDLE FileHandle, LdrVerifyImageMatchesChecksum(
IN PLDR_CALLBACK Callback, _In_ HANDLE FileHandle,
IN PVOID CallbackContext, _In_ PLDR_CALLBACK Callback,
OUT PUSHORT ImageCharacteristics) _In_ PVOID CallbackContext,
_Out_ PUSHORT ImageCharacteristics)
{ {
FILE_STANDARD_INFORMATION FileStandardInfo; FILE_STANDARD_INFORMATION FileStandardInfo;
PIMAGE_IMPORT_DESCRIPTOR ImportData; PIMAGE_IMPORT_DESCRIPTOR ImportData;
@ -982,18 +984,19 @@ LdrVerifyImageMatchesChecksum(IN HANDLE FileHandle,
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrQueryProcessModuleInformationEx(IN ULONG ProcessId, LdrQueryProcessModuleInformationEx(
IN ULONG Reserved, _In_opt_ ULONG ProcessId,
OUT PRTL_PROCESS_MODULES ModuleInformation, _Reserved_ ULONG Reserved,
IN ULONG Size, _Out_writes_bytes_to_(Size, *ReturnedSize) PRTL_PROCESS_MODULES ModuleInformation,
OUT PULONG ReturnedSize OPTIONAL) _In_ ULONG Size,
_Out_opt_ PULONG ReturnedSize)
{ {
PLIST_ENTRY ModuleListHead, InitListHead; PLIST_ENTRY ModuleListHead, InitListHead;
PLIST_ENTRY Entry, InitEntry; PLIST_ENTRY Entry, InitEntry;
PLDR_DATA_TABLE_ENTRY Module, InitModule; PLDR_DATA_TABLE_ENTRY Module, InitModule;
PRTL_PROCESS_MODULE_INFORMATION ModulePtr = NULL; PRTL_PROCESS_MODULE_INFORMATION ModulePtr = NULL;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
ULONG UsedSize = sizeof(ULONG); ULONG UsedSize = FIELD_OFFSET(RTL_PROCESS_MODULES, Modules);
ANSI_STRING AnsiString; ANSI_STRING AnsiString;
PCHAR p; PCHAR p;
@ -1110,9 +1113,10 @@ LdrQueryProcessModuleInformationEx(IN ULONG ProcessId,
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrQueryProcessModuleInformation(IN PRTL_PROCESS_MODULES ModuleInformation, LdrQueryProcessModuleInformation(
IN ULONG Size, _Out_writes_bytes_to_(Size, *ReturnedSize) PRTL_PROCESS_MODULES ModuleInformation,
OUT PULONG ReturnedSize OPTIONAL) _In_ ULONG Size,
_Out_opt_ PULONG ReturnedSize)
{ {
/* Call Ex version of the API */ /* Call Ex version of the API */
return LdrQueryProcessModuleInformationEx(0, 0, ModuleInformation, Size, ReturnedSize); return LdrQueryProcessModuleInformationEx(0, 0, ModuleInformation, Size, ReturnedSize);
@ -1123,9 +1127,10 @@ LdrQueryProcessModuleInformation(IN PRTL_PROCESS_MODULES ModuleInformation,
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrEnumerateLoadedModules(IN BOOLEAN ReservedFlag, LdrEnumerateLoadedModules(
IN PLDR_ENUM_CALLBACK EnumProc, _Reserved_ ULONG ReservedFlag,
IN PVOID Context) _In_ PLDR_ENUM_CALLBACK EnumProc,
_In_opt_ PVOID Context)
{ {
PLIST_ENTRY ListHead, ListEntry; PLIST_ENTRY ListHead, ListEntry;
PLDR_DATA_TABLE_ENTRY LdrEntry; PLDR_DATA_TABLE_ENTRY LdrEntry;
@ -1161,28 +1166,24 @@ LdrEnumerateLoadedModules(IN BOOLEAN ReservedFlag,
/* Break if we were asked to stop enumeration */ /* Break if we were asked to stop enumeration */
if (Stop) if (Stop)
{ {
/* Release loader lock */ break;
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;
} }
/* Advance to the next module */ /* Advance to the next module */
ListEntry = ListEntry->Flink; ListEntry = ListEntry->Flink;
} }
/* Release loader lock, it must succeed this time */ /* Release loader lock */
Status = LdrUnlockLoaderLock(0, Cookie); Status = LdrUnlockLoaderLock(0, Cookie);
ASSERT(NT_SUCCESS(Status)); ASSERT(NT_SUCCESS(Status));
/* Return success */ /* Reset any successful status to STATUS_SUCCESS,
return 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 NTSTATUS
NTAPI NTAPI
LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress) LdrDisableThreadCalloutsForDll(
_In_ PVOID BaseAddress)
{ {
PLDR_DATA_TABLE_ENTRY LdrEntry; PLDR_DATA_TABLE_ENTRY LdrEntry;
NTSTATUS Status; NTSTATUS Status;
@ -1240,8 +1242,9 @@ LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress)
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrAddRefDll(IN ULONG Flags, LdrAddRefDll(
IN PVOID BaseAddress) _In_ ULONG Flags,
_In_ PVOID BaseAddress)
{ {
PLDR_DATA_TABLE_ENTRY LdrEntry; PLDR_DATA_TABLE_ENTRY LdrEntry;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
@ -1316,7 +1319,7 @@ quickie:
} }
/* Release the lock if needed */ /* 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; return Status;
} }
@ -1325,7 +1328,8 @@ quickie:
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrUnloadDll(IN PVOID BaseAddress) LdrUnloadDll(
_In_ PVOID BaseAddress)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PPEB Peb = NtCurrentPeb(); PPEB Peb = NtCurrentPeb();
@ -1601,10 +1605,11 @@ RtlDllShutdownInProgress(VOID)
*/ */
PIMAGE_BASE_RELOCATION PIMAGE_BASE_RELOCATION
NTAPI NTAPI
LdrProcessRelocationBlock(IN ULONG_PTR Address, LdrProcessRelocationBlock(
IN ULONG Count, _In_ ULONG_PTR Address,
IN PUSHORT TypeOffset, _In_ ULONG Count,
IN LONG_PTR Delta) _In_ PUSHORT TypeOffset,
_In_ LONG_PTR Delta)
{ {
return LdrProcessRelocationBlockLongLong(Address, Count, TypeOffset, Delta); return LdrProcessRelocationBlockLongLong(Address, Count, TypeOffset, Delta);
} }
@ -1617,8 +1622,9 @@ LdrProcessRelocationBlock(IN ULONG_PTR Address,
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrLoadAlternateResourceModule(IN PVOID Module, LdrLoadAlternateResourceModule(
IN PWSTR Buffer) _In_ PVOID Module,
_In_ PWSTR Buffer)
{ {
/* Is MUI Support enabled? */ /* Is MUI Support enabled? */
if (!LdrAlternateResourcesEnabled()) return STATUS_SUCCESS; if (!LdrAlternateResourcesEnabled()) return STATUS_SUCCESS;
@ -1632,7 +1638,8 @@ LdrLoadAlternateResourceModule(IN PVOID Module,
*/ */
BOOLEAN BOOLEAN
NTAPI NTAPI
LdrUnloadAlternateResourceModule(IN PVOID BaseAddress) LdrUnloadAlternateResourceModule(
_In_ PVOID BaseAddress)
{ {
ULONG_PTR Cookie; ULONG_PTR Cookie;
@ -1646,7 +1653,7 @@ LdrUnloadAlternateResourceModule(IN PVOID BaseAddress)
} }
/* Release the loader lock */ /* Release the loader lock */
LdrUnlockLoaderLock(1, Cookie); LdrUnlockLoaderLock(LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie);
/* All done */ /* All done */
return TRUE; return TRUE;

View file

@ -109,9 +109,10 @@ extern BOOLEAN RtlpUse16ByteSLists;
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrOpenImageFileOptionsKey(IN PUNICODE_STRING SubKey, LdrOpenImageFileOptionsKey(
IN BOOLEAN Wow64, _In_ PUNICODE_STRING SubKey,
OUT PHANDLE NewKeyHandle) _In_ BOOLEAN Wow64,
_Out_ PHANDLE NewKeyHandle)
{ {
PHANDLE RootKeyLocation; PHANDLE RootKeyLocation;
HANDLE RootKey; HANDLE RootKey;
@ -181,12 +182,13 @@ LdrOpenImageFileOptionsKey(IN PUNICODE_STRING SubKey,
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrQueryImageFileKeyOption(IN HANDLE KeyHandle, LdrQueryImageFileKeyOption(
IN PCWSTR ValueName, _In_ HANDLE KeyHandle,
IN ULONG Type, _In_ PCWSTR ValueName,
OUT PVOID Buffer, _In_ ULONG Type,
IN ULONG BufferSize, _Out_ PVOID Buffer,
OUT PULONG ReturnedLength OPTIONAL) _In_ ULONG BufferSize,
_Out_opt_ PULONG ReturnedLength)
{ {
ULONG KeyInfo[256]; ULONG KeyInfo[256];
UNICODE_STRING ValueNameString, IntegerString; UNICODE_STRING ValueNameString, IntegerString;
@ -345,13 +347,14 @@ LdrQueryImageFileKeyOption(IN HANDLE KeyHandle,
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrQueryImageFileExecutionOptionsEx(IN PUNICODE_STRING SubKey, LdrQueryImageFileExecutionOptionsEx(
IN PCWSTR ValueName, _In_ PUNICODE_STRING SubKey,
IN ULONG Type, _In_ PCWSTR ValueName,
OUT PVOID Buffer, _In_ ULONG Type,
IN ULONG BufferSize, _Out_ PVOID Buffer,
OUT PULONG ReturnedLength OPTIONAL, _In_ ULONG BufferSize,
IN BOOLEAN Wow64) _Out_opt_ PULONG ReturnedLength,
_In_ BOOLEAN Wow64)
{ {
NTSTATUS Status; NTSTATUS Status;
HANDLE KeyHandle; HANDLE KeyHandle;
@ -383,12 +386,13 @@ LdrQueryImageFileExecutionOptionsEx(IN PUNICODE_STRING SubKey,
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrQueryImageFileExecutionOptions(IN PUNICODE_STRING SubKey, LdrQueryImageFileExecutionOptions(
IN PCWSTR ValueName, _In_ PUNICODE_STRING SubKey,
IN ULONG Type, _In_ PCWSTR ValueName,
OUT PVOID Buffer, _In_ ULONG Type,
IN ULONG BufferSize, _Out_ PVOID Buffer,
OUT PULONG ReturnedLength OPTIONAL) _In_ ULONG BufferSize,
_Out_opt_ PULONG ReturnedLength)
{ {
/* Call the newer function */ /* Call the newer function */
return LdrQueryImageFileExecutionOptionsEx(SubKey, return LdrQueryImageFileExecutionOptionsEx(SubKey,
@ -1879,7 +1883,7 @@ LdrpInitializeProcess(IN PCONTEXT Context,
HeapParameters.Length = sizeof(HeapParameters); HeapParameters.Length = sizeof(HeapParameters);
/* Check if we have Configuration Data */ /* 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 */ /* The 'original' load config ends after SecurityCookie */
if ((LoadConfig) && ConfigSize && (VALID_CONFIG_FIELD(SecurityCookie) || ConfigSize == LoadConfig->Size)) if ((LoadConfig) && ConfigSize && (VALID_CONFIG_FIELD(SecurityCookie) || ConfigSize == LoadConfig->Size))
{ {
@ -2327,7 +2331,7 @@ LdrpInitializeProcess(IN PCONTEXT Context,
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
if (ShowSnaps) 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; return Status;
} }
Kernel32ProcessInitPostImportFunction = FunctionAddress; Kernel32ProcessInitPostImportFunction = FunctionAddress;
@ -2340,7 +2344,7 @@ LdrpInitializeProcess(IN PCONTEXT Context,
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
if (ShowSnaps) 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; return Status;
} }
Kernel32BaseQueryModuleData = FunctionAddress; Kernel32BaseQueryModuleData = FunctionAddress;

View file

@ -2257,7 +2257,7 @@ LdrpGetProcedureAddress(
_In_ BOOLEAN ExecuteInit) _In_ BOOLEAN ExecuteInit)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
UCHAR ImportBuffer[64]; UCHAR ImportBuffer[64]; // 128 since NT6.2
PLDR_DATA_TABLE_ENTRY LdrEntry; PLDR_DATA_TABLE_ENTRY LdrEntry;
IMAGE_THUNK_DATA Thunk; IMAGE_THUNK_DATA Thunk;
PVOID ImageBase; PVOID ImageBase;
@ -2292,6 +2292,11 @@ LdrpGetProcedureAddress(
ImportName = RtlAllocateHeap(RtlGetProcessHeap(), ImportName = RtlAllocateHeap(RtlGetProcessHeap(),
0, 0,
Length); Length);
if (!ImportName)
{
/* Return STATUS_INSUFFICIENT_RESOURCES since NT6.2 */
return STATUS_INVALID_PARAMETER;
}
} }
else else
{ {

View file

@ -657,7 +657,7 @@ GetModuleFileNameW(HINSTANCE hModule,
} _SEH2_END } _SEH2_END
/* Release the loader lock */ /* 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); return Length / sizeof(WCHAR);
} }

View file

@ -97,8 +97,8 @@ LdrGetProcedureAddress(
ULONG ULONG
NTAPI NTAPI
LdrRelocateImage( LdrRelocateImage(
_In_ PVOID NewBase, _In_ PVOID BaseAddress,
_In_ PCCH LoaderName, _In_opt_ PCSTR LoaderName,
_In_ ULONG Success, _In_ ULONG Success,
_In_ ULONG Conflict, _In_ ULONG Conflict,
_In_ ULONG Invalid _In_ ULONG Invalid
@ -139,9 +139,9 @@ LdrProcessRelocationBlockLongLong(
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrEnumerateLoadedModules( LdrEnumerateLoadedModules(
_In_ BOOLEAN ReservedFlag, _Reserved_ ULONG ReservedFlag,
_In_ PLDR_ENUM_CALLBACK EnumProc, _In_ PLDR_ENUM_CALLBACK EnumProc,
_In_ PVOID Context _In_opt_ PVOID Context
); );
#endif #endif

View file

@ -238,7 +238,7 @@ typedef struct _ALT_RESOURCE_MODULE
// //
// Callback function for LdrEnumerateLoadedModules // 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; typedef LDR_ENUM_CALLBACK *PLDR_ENUM_CALLBACK;
// //

View file

@ -3975,13 +3975,12 @@ RtlImageRvaToSection(
_In_ ULONG Rva _In_ ULONG Rva
); );
NTSYSAPI
ULONG ULONG
NTAPI NTAPI
LdrRelocateImageWithBias( LdrRelocateImageWithBias(
_In_ PVOID NewAddress, _In_ PVOID BaseAddress,
_In_ LONGLONG AdditionalBias, _In_ LONGLONG AdditionalBias,
_In_ PCCH LoaderName, _In_opt_ PCSTR LoaderName,
_In_ ULONG Success, _In_ ULONG Success,
_In_ ULONG Conflict, _In_ ULONG Conflict,
_In_ ULONG Invalid _In_ ULONG Invalid

View file

@ -158,9 +158,9 @@ NTSTATUS
NTAPI NTAPI
LdrLoadDll( LdrLoadDll(
_In_opt_ PWSTR SearchPath, _In_opt_ PWSTR SearchPath,
_In_opt_ PULONG LoadFlags, _In_opt_ PULONG DllCharacteristics,
_In_ PUNICODE_STRING Name, _In_ PUNICODE_STRING DllName,
_Out_opt_ PVOID *BaseAddress _Out_ PVOID *BaseAddress
); );
PIMAGE_BASE_RELOCATION PIMAGE_BASE_RELOCATION
@ -177,18 +177,18 @@ NTAPI
LdrQueryImageFileExecutionOptions( LdrQueryImageFileExecutionOptions(
_In_ PUNICODE_STRING SubKey, _In_ PUNICODE_STRING SubKey,
_In_ PCWSTR ValueName, _In_ PCWSTR ValueName,
_In_ ULONG ValueSize, _In_ ULONG Type,
_Out_ PVOID Buffer, _Out_ PVOID Buffer,
_In_ ULONG BufferSize, _In_ ULONG BufferSize,
_Out_opt_ PULONG RetunedLength _Out_opt_ PULONG ReturnedLength
); );
NTSTATUS NTSTATUS
NTAPI NTAPI
LdrQueryProcessModuleInformation( LdrQueryProcessModuleInformation(
_In_opt_ PRTL_PROCESS_MODULES ModuleInformation, _Out_writes_bytes_to_(Size, *ReturnedSize) PRTL_PROCESS_MODULES ModuleInformation,
_In_opt_ ULONG Size, _In_ ULONG Size,
_Out_ PULONG ReturnedSize _Out_opt_ PULONG ReturnedSize
); );
VOID VOID
@ -221,7 +221,7 @@ LdrVerifyImageMatchesChecksum(
_In_ HANDLE FileHandle, _In_ HANDLE FileHandle,
_In_ PLDR_CALLBACK Callback, _In_ PLDR_CALLBACK Callback,
_In_ PVOID CallbackContext, _In_ PVOID CallbackContext,
_Out_ PUSHORT ImageCharacterstics _Out_ PUSHORT ImageCharacteristics
); );
NTSTATUS NTSTATUS

View file

@ -460,11 +460,11 @@ LdrProcessRelocationBlockLongLong(
ULONG ULONG
NTAPI NTAPI
LdrRelocateImage( LdrRelocateImage(
IN PVOID BaseAddress, _In_ PVOID BaseAddress,
IN PCCH LoaderName, _In_opt_ PCSTR LoaderName,
IN ULONG Success, _In_ ULONG Success,
IN ULONG Conflict, _In_ ULONG Conflict,
IN ULONG Invalid) _In_ ULONG Invalid)
{ {
return LdrRelocateImageWithBias(BaseAddress, 0, LoaderName, Success, Conflict, Invalid); return LdrRelocateImageWithBias(BaseAddress, 0, LoaderName, Success, Conflict, Invalid);
} }
@ -472,12 +472,12 @@ LdrRelocateImage(
ULONG ULONG
NTAPI NTAPI
LdrRelocateImageWithBias( LdrRelocateImageWithBias(
IN PVOID BaseAddress, _In_ PVOID BaseAddress,
IN LONGLONG AdditionalBias, _In_ LONGLONG AdditionalBias,
IN PCCH LoaderName, _In_opt_ PCSTR LoaderName,
IN ULONG Success, _In_ ULONG Success,
IN ULONG Conflict, _In_ ULONG Conflict,
IN ULONG Invalid) _In_ ULONG Invalid)
{ {
PIMAGE_NT_HEADERS NtHeaders; PIMAGE_NT_HEADERS NtHeaders;
PIMAGE_DATA_DIRECTORY RelocationDDir; PIMAGE_DATA_DIRECTORY RelocationDDir;
@ -487,6 +487,8 @@ LdrRelocateImageWithBias(
PUSHORT TypeOffset; PUSHORT TypeOffset;
LONGLONG Delta; LONGLONG Delta;
UNREFERENCED_PARAMETER(LoaderName);
NtHeaders = RtlImageNtHeader(BaseAddress); NtHeaders = RtlImageNtHeader(BaseAddress);
if (NtHeaders == NULL) if (NtHeaders == NULL)